复制源(Replication Origins)基础设施旨在简化基于逻辑解码构建高阶逻辑复制方案的复杂度。它专门针对两大经典分布式复制难题提供标准解决方案:
如何在发生崩溃宕机时安全可靠地持久化跟踪复制回放进度。
如何根据数据行的原始产生源节点智能调整复制行为,彻底防范双向或多活复制拓扑中的无限回环死循环。
每个复制源仅具备两大基础属性:名称(Name)与标识符(ID)。名称是跨系统引用该来源节点时使用的自由文本(建议带上复制方案的前缀以避免命名冲突);ID 是用于在系统内部紧凑高效存储的短数值标识,严禁跨系统随意共享。
复制源通过 SQL 函数 pg_replication_origin_create() 创建,通过 pg_replication_origin_drop() 销毁,并统一登记在系统目录表 pg_replication_origin 中。
在构建复杂复制系统时,以安全可靠的方式记录回放进度绝非易事。当下游应用工作进程甚至整套集群遭遇宕机重启时,系统必须能够精确获知数据究竟已成功同步到了哪一个确切位点。在用户业务表中为每个回放事务频繁写入进度行的原始做法,不仅引发巨大的运行时 I/O 争用,还会导致数据表严重膨胀。
利用复制源基础设施,一个会话可以通过调用 pg_replication_origin_session_setup() 将自身标记为正在回放来自特定远端节点的数据流。此外,通过 pg_replication_origin_xact_setup() 可以逐事务绑定源端事务的原始 LSN 与提交时间戳。如此一来,复制回放进度会被系统以物理崩溃安全的方式持久化固化。查看全集群所有复制源的最新回放位点可查询系统视图 pg_replication_origin_status;在断点恢复连接时,可通过 pg_replication_origin_progress() 获取任意源的位点进度,或使用 pg_replication_origin_session_progress() 获取当前会话所配置源的精准起始续传位点。
在双向复制或网状多活架构中,另一大痛点是如何避免将刚刚回放写入的数据行作为本地变更再次错误反向推送回去。复制源机制提供了完美的防环解决方案:当按照上述方式配置后,由该回放会话产生的所有数据变更在传递给输出插件时(参见 Section 47.6),均会自动打上对应源节点的专属标识。输出插件便能针对性处理(例如直接过滤丢弃所有非本机原创的数据变更)。此外,还可以直接使用底层的 filter_by_origin_cb 回调函数在逻辑解码流的最前端提前执行来源过滤,性能远高于在输出插件中逐行判断。