Postgres10推出了逻辑复制(logical replication
)功能。本章介绍如何将postgres(Amazon RDS或Aurora)的数据复制到read replica( 这个read replica可以是EC2自搭Postgres、RDS或Aurora)
logical replication
使用发布/订阅
模型,订阅者从发布者那里拉数据。
初始时,订阅者从发布者那里复制快照获取全量数据。当复制完成后,任何数据的更改以近实时 near-real-time
方式传给订阅者。订阅者保证顺序应用所有更改,保持数据的一致性。
下面图是初始化copy的流程:
发布者执行create publication
命令,指定哪些表需要进行复制。
订阅者执行create subscription
命令。
订阅者建立TCP连接到发布者
订阅者建立与发布者之间的logical replication slot
, 发布者使用 pgoutput
插件来实现WAL日志的解码,这个插件上同时实现数据过滤(因为订阅者可能只订阅特定的表)。默认这个slot命令规则是{sub name}_{sub oid}_sync_{reloid}
, {sub_name}
是执行CREATE SUBSCRIPTION
命令时声明的名称。
发布者端,先对表中的初始数据建立一个快照,再使用 COPY 命令将其传输到订阅者
订阅者接收到初始数据后,将其应用到表中。
在初始化复制完成后,实时的transaction数据通过以下流程进行同步:
pgoutput
继续管理replication slot,用于同步过程中的数据解码walsender
进程开始对接收到的WAL日志中的数据进行解码。walsender
将WAL解析为logical replication协议支持的数据,并根据订阅者声明的规则对数据进行过滤apply worker
,它把数据插入到本地的数据表schema defination
不会跟着一起复制给订阅者,订阅者需要先提前创建好版本要求:如果是RDS Posgres,则版本要大于10.4,如果是Aurora,则版本要大于2.2。
数据库(只针对publisher)上必须开启逻辑复制
对于Amazon RDS for PostgreSQL, 参考 Logical Replication for PostgreSQL on Amazon RDS .
对于Aurora PostgreSQL, 参考 Configuring Logical Replication .