逻辑复制首先复制发布端数据库中数据的快照。完成后,发布端的变更会随着发生实时发送给订阅端。订阅端按照发布端提交的顺序应用数据,因此对于单个订阅中的发布,可以保证事务一致性。
逻辑复制采用类似于物理流复制的架构(见Section 26.2.5)。它由“walsender”和“apply”进程实现。walsender 进程启动 WAL 的逻辑解码(见Chapter 47),并加载标准逻辑解码输出插件(pgoutput)。该插件将从 WAL 读取的变更转换为逻辑复制协议(见Section 51.5),并根据发布规范过滤数据。然后使用流复制协议将数据持续传输给 apply 工作进程,该工作进程将数据映射到本地表,并按正确的事务顺序逐一应用每个变更。
订阅端数据库上的 apply 进程总是在session_replication_role设置为replica的情况下运行。这意味着默认情况下,触发器和规则不会在订阅端触发。用户可以选择使用ALTER TABLE命令和ENABLE TRIGGER及ENABLE RULE子句在表上启用触发器和规则。
逻辑复制的apply进程目前只触发行触发器,不触发语句触发器。但初始表同步的实现方式类似于COPY命令,因此会触发INSERT的行触发器和语句触发器。
已订阅表中的初始数据由一种特殊的apply进程的并行实例建立快照并复制。该进程将创建自己的复制槽并复制现有数据。一旦复制完成,表的内容就对其他后端可见了。现有数据复制完成后,工作进程进入同步模式,通过使用标准逻辑复制流传输初始数据复制期间发生的所有变更,确保该表与主apply进程同步。在此同步阶段,变更会按照在发布端发生的顺序被应用和提交。同步完成后,该表的复制控制权交还给主apply进程,此后复制照常继续。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。