31.5. 架构

31.5.1. 初始快照

逻辑复制从拷贝发布者数据库上的数据库快照开始。拷贝一旦完成,发布者上的更改会在它们发生时实时传送给订阅者。订阅者按照数据在发布者上被提交的顺序应用数据,这样任意单一订阅中的发布的事务一致性才能得到保证。

逻辑复制被构建在一种类似于物理流复制(见第 27.2.5 节)的架构上。它由walsenderapply进程实现。walsender进程开始对WAL的逻辑解码(在第 49 章中描述)并且载入标准逻辑解码插件(pgoutput)。该插件把从WAL中读取的更改转换成逻辑复制协议(见第 53.5 节)并且根据发布说明过滤数据。然后数据会被连续地使用流复制协议传输到应用工作者,应用工作者会把数据映射到本地表并且以正确的事务顺序应用它们接收到的更改。

订阅者数据库上的应用进程总是将session_replication_role设置为replica运行,这会产生触发器和约束上通常的效果。

逻辑复制应用进程当前仅会引发行触发器,而不会引发语句触发器。不过,初始的表同步是以类似一个COPY命令的方式实现的,因此会引发INSERT的行触发器和语句触发器。

31.5.1. 初始快照

获取现有订阅表中初始数据的快照并且以一种特殊类型的应用进程的并行实例进行拷贝。这种进程将创建自己的复制槽并且拷贝现有的数据。复制完成后,表内容对其他后端可见。一旦现有的数据被拷贝完,worker进程会进入到同步模式,主应用进程会流式更新在使用标准逻辑复制拷贝初始数据期间发生的任意改变,这会确保表变为已同步的状态。在此同步阶段,应用和提交更改的顺序与它们在发布者发生的顺序相同。一旦同步完成,该表的复制的控制权会被交回给主应用进程,其中复制会照常继续。