复制来源旨在简化基于 逻辑解码 的逻辑复制解决方案的实现。它们为两个常见问题提供了解决方案
如何安全地跟踪复制进度
如何根据行的来源更改复制行为;例如,防止双向复制设置中的循环
复制来源只有两个属性:名称和 ID。名称是跨系统引用来源时应该使用的名称,是自由格式的 text
。它应该以一种方式使用,这种方式使不同复制解决方案创建的复制来源之间的冲突不太可能;例如,通过在它前面加上复制解决方案的名称。ID 仅用于避免在空间效率很重要的情况下存储较长的版本。它永远不应跨系统共享。
可以使用函数 pg_replication_origin_create()
创建复制来源;使用 pg_replication_origin_drop()
删除复制来源;可以在 pg_replication_origin
系统目录中看到复制来源。
构建复制解决方案的一个非平凡部分是跟踪重放进度以安全的方式。当应用进程或整个集群死亡时,需要能够找出数据已成功复制到哪里。对这个问题的简单解决方案,比如为每个重放的事务更新表中的一个行,会有诸如运行时开销和数据库膨胀之类的問題。
使用复制来源基础设施,可以将会话标记为从远程节点重放(使用 pg_replication_origin_session_setup()
函数)。此外LSN和每个源事务的提交时间戳可以在每个事务的基础上使用 pg_replication_origin_xact_setup()
进行配置。如果这样做,复制进度将以防崩溃的方式持久保存。所有复制来源的重放进度可以在 pg_replication_origin_status
视图中看到。可以使用 pg_replication_origin_progress()
获取单个来源的进度,例如在恢复复制时,可以获取任何来源的进度,或者使用 pg_replication_origin_session_progress()
获取当前会话中配置的来源的进度。
在比从一个系统精确复制到另一个系统更复杂的复制拓扑中,另一个问题可能是很难避免再次复制重放的行。这会导致复制中的循环和效率低下。复制来源提供了一种可选机制来识别和防止这种情况。在使用前一段中引用的函数进行配置时,由会话生成的传递给输出插件回调(见 第 47.6 节)的每个更改和事务都将使用生成会话的复制来源进行标记。这允许在输出插件中对它们进行不同的处理,例如忽略所有除本地来源的行以外的行。此外,filter_by_origin_cb
回调可用于根据来源过滤逻辑解码更改流。虽然灵活性较低,但通过该回调进行过滤比在输出插件中进行过滤效率要高得多。
如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。