PostgreSQL复制槽源码分析
- 源码版本:PG 13.3
- 源码文件:slot.c slotfuncs.c
1. 什么是 PG 复制槽?
PG 复制槽用于记录主备流复制的状态,主要目的是防止 wal 日志被过早的删除,导致备库流复制中断。复制槽是有状态的,能够持久化到磁盘上,允许宕机、重启场景下进行恢复。在有复制槽的场景下,即使备库关闭很长时间,主库也会为其保留足够的 wal 日志,直到备库恢复接收完这些 wal 日志,主库才会将其删除。当然这也带来了新的问题,即如果备库永远不恢复,那么主库的 wal 日志就会永远保留,导致磁盘空间耗尽,这时需要人工介入处理。
2. PG 复制槽相关参数
- max_replication_slots,最大的复制槽数量,取值范围为 0 ~ 0x3FFFF,默认值为 10, 设置为 0 表示禁用复制槽。
- wal_level >= replica
3. 复制槽共享内存初始化
复制槽相关的数据结构存储在共享内存中,大小由 max_replication_slots 参数决定,每个复制槽由结构体 ReplicationSlot 表示,其成员变量 in_use 表示该复制槽元素是否正在被使用。
- ReplicationSlotsShmemSize(),计算复制槽共享内存大小
- ReplicationSlotsShmemInit(),初始化共享内存
4. PG 复制槽的实现逻辑
4.1 创建复制槽
创建复制槽的函数调用关系:
pg_create_physical_replication_slot() create_physical_replication_slot() ReplicationSlotCreate()