31.7. 架构#
逻辑复制首先复制发布者数据库上的数据快照。完成后,发布者上的更改会实时发送到订阅者。订阅者按照在发布者上提交的顺序应用数据,从而保证任何单个订阅中的发布的交易一致性。
逻辑复制的架构与物理流复制类似(请参阅第 27.2.5 节)。它由walsender
和apply
进程实现。walsender 进程启动 WAL 的逻辑解码(在第 49 章中描述),并加载标准逻辑解码输出插件(pgoutput
)。该插件将从 WAL 读取的更改转换为逻辑复制协议(请参阅第 55.5 节),并根据发布规范过滤数据。然后,使用流复制协议将数据连续传输到应用工作进程,该工作进程将数据映射到本地表,并在接收时按正确的交易顺序应用各个更改。
订阅者数据库上的应用进程始终以session_replication_role
设置为replica
运行。这意味着,默认情况下,触发器和规则不会在订阅者上触发。用户可以选择使用ALTER TABLE
命令以及ENABLE TRIGGER
和ENABLE RULE
子句在表上启用触发器和规则。
逻辑复制应用进程当前仅触发行触发器,不触发语句触发器。但是,初始表同步的实现类似于COPY
命令,因此会为INSERT
触发行触发器和语句触发器。
31.7.1. 初始快照#
现有订阅表中的初始数据被快照并复制到特殊类型的应用进程的并行实例中。此进程将创建自己的复制槽并复制现有数据。一旦复制完成,表内容将对其他后端可见。复制现有数据后,工作进程进入同步模式,该模式通过使用标准逻辑复制流式传输在初始数据复制期间发生的任何更改,确保表与主应用进程处于同步状态。在此同步阶段,更改将按发布者上发生的顺序应用并提交。完成同步后,表的复制控制权将返还给主应用进程,复制将正常继续。
注意
发布publish
参数仅影响哪些 DML 操作将被复制。初始数据同步在复制现有表数据时不考虑此参数。