章 49.复制进度跟踪

复制源的目的是使在logical decoding上更容易实现逻辑复制解决方案。它们提供了两个常见问题的解决方案:

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

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

复制源只有两个属性,即名称和 OID。该名称是自由格式的text,它是用来指代跨系统起源的名称。它的使用方式应避免由不同复制解决方案创建的复制源之间的冲突;例如通过为复制解决方案的名称添加前缀。 OID 仅用于避免在空间效率很重要的情况下必须存储长版本。永远不要在系统之间共享它。

可以使用函数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()表示当前会话中配置的源。

在复制拓扑比从一个系统完全复制到另一个系统更为复杂的情况下,另一个问题可能是很难避免再次复制已重播的行。这会导致复制周期和效率低下。复制源提供了一种识别和防止这种情况的可选机制。使用上一段中引用的功能进行配置时,传递给该会话所生成的输出插件回调(请参见Section 48.6)的每个更改和事务都将使用生成会话的复制源进行标记。这样可以在输出插件中对它们进行不同的处理,例如忽略除本地起源的所有行。此外,filter_by_origin_cb回调可用于根据源过滤逻辑解码更改流。尽管灵 Active 较低,但通过该回调进行过滤比在输出插件中进行过滤要有效得多。