复制来源旨在更轻松地在逻辑解码的基础上实现逻辑复制解决方案。它们为两个常见问题提供了解决方案
如何安全地跟踪复制进度
如何根据行的来源更改复制行为;例如,为了防止在双向复制设置中出现循环
复制源有两种属性,一种是名称,另一种是 ID。名称用于在不同系统中引用源,是自由格式文本
。应使用名称,从而避免由不同复制解决方案创建的复制源之间的冲突;例如,通过给复制源添加复制解决方案的前缀。ID 仅用于避免在需要节省空间的情况下存储长版本。它绝不应在系统之间共享。
可以使用函数 pg_replication_origin_create()
创建复制源;使用 pg_replication_origin_drop()
删除;并可在 pg_replication_origin
系统编录中看到它们。
构建复制解决方案的一个非平凡部分是以安全的方式跟踪重放进度。当应用进程或整个集群发生故障时,需要找出已成功复制数据的范围。对于此问题的朴素解决方案(例如,为每次重放的事务更新表中的行)存在诸如运行时开销大、数据库膨胀等问题。
使用复制源基础设施,可以将会话标记为正在从远程节点重放(使用 pg_replication_origin_session_setup()
函数)。此外还可以使用 pg_replication_origin_xact_setup()
在每个事务的基础上配置LSN和每个源事务的提交时间戳。如果这样做,则复制进度将以一种防故障安全的方式保留下来。视图 pg_replication_origin_status
中可以查看所有复制源的重放进度。例如,在恢复复制时,可以使用 pg_replication_origin_progress()
获取单个源的进度,也可以使用 pg_replication_origin_session_progress()
为当前会话中配置的源获取进度。
在比从一个系统到另一个系统的复制更复杂的复制拓扑中,另一个问题可能是难以避免再次复制已重放的行。这会导致复制中的循环和效率低下。复制源提供了一个可选的机制来识别和防止这种情况。当使用上一段中引用的函数进行配置时,会话生成的传递给输出插件回调(参见第 47.6 节)的每个更改和事务都标记有生成会话的复制源。这允许在输出插件中以不同方式对待它们,例如,忽略除本地生成的行的所有行。此外,filter_by_origin_cb
回调可用于根据源来过滤逻辑解码更改流。虽然灵活性较低,但通过该回调进行过滤比在输出插件中进行过滤效率要高得多。