支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:开发版
不支持的版本:12 / 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() 函数)。此外,可以使用 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 回调基于来源过滤逻辑解码更改流。虽然灵活性较低,但通过该回调进行过滤比在输出插件中进行过滤效率高得多。

提交更正

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