2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5

第 48 章。复制进度跟踪

复制来源旨在简化基于 逻辑解码 的逻辑复制解决方案的实现。它们为两个常见问题提供了解决方案

  • 如何安全地跟踪复制进度

  • 如何根据行的来源更改复制行为;例如,防止双向复制设置中的循环

复制来源只有两个属性:名称和 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 回调可用于根据来源过滤逻辑解码更改流。虽然灵活性较低,但通过该回调进行过滤比在输出插件中进行过滤效率要高得多。

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。