Postgres逻辑复制

Postgres10推出了逻辑复制(logical replication)功能。本章介绍如何将postgres(Amazon RDS或Aurora)的数据复制到read replica( 这个read replica可以是EC2自搭Postgres、RDS或Aurora)


logical replication使用发布/订阅模型,订阅者从发布者那里拉数据。

初始时,订阅者从发布者那里复制快照获取全量数据。当复制完成后,任何数据的更改以近实时 near-real-time方式传给订阅者。订阅者保证顺序应用所有更改,保持数据的一致性

逻辑复制的流程


下面图是初始化copy的流程:

img

  1. 发布者执行create publication命令,指定哪些表需要进行复制。

  2. 订阅者执行create subscription命令。

  3. 订阅者建立TCP连接到发布者

  4. 订阅者建立与发布者之间的logical replication slot, 发布者使用 pgoutput插件来实现WAL日志的解码,这个插件上同时实现数据过滤(因为订阅者可能只订阅特定的表)。默认这个slot命令规则是{sub name}_{sub oid}_sync_{reloid}, {sub_name}是执行CREATE SUBSCRIPTION命令时声明的名称。

  5. 发布者端,先对表中的初始数据建立一个快照,再使用 COPY 命令将其传输到订阅者

  6. 订阅者接收到初始数据后,将其应用到表中。


在初始化复制完成后,实时的transaction数据通过以下流程进行同步:

img

  1. pgoutput继续管理replication slot,用于同步过程中的数据解码
  2. walsender进程开始对接收到的WAL日志中的数据进行解码。
  3. walsender将WAL解析为logical replication协议支持的数据,并根据订阅者声明的规则对数据进行过滤
  4. 数据传送到apply worker,它把数据插入到本地的数据表

使用逻辑复制时的一些注意事项

  • publication只支持table,不支持视图(view)、materialized views(物化视图)、partition root tables(分区表)、foregin tables(外部表)
  • 创建publication时,只能指定一个数据库。
  • publication可以有多个订阅者
  • schema defination不会跟着一起复制给订阅者,订阅者需要先提前创建好
  • 订阅者的表结构可以有多余的列,在同步数据时,这些列被设置填充为默认值

前提条件

  1. 版本要求:如果是RDS Posgres,则版本要大于10.4,如果是Aurora,则版本要大于2.2。

  2. 数据库(只针对publisher)上必须开启逻辑复制