Author: 卓刀
在RDS for PostgreSQL 10 中,不再需要使用额外的插件,直接在内核里面实现了表级别的逻辑订阅功能。如果用户具有以下的几个场景,可以尝试使用该逻辑订阅的功能:
注:因为网络连通原因,目前只支持RDS for PostgreSQL 10 基础版开放。下面简单介绍下其具体的使用方法。
只有发布端和订阅端网络可连才能创建逻辑订阅。注意发布端的白名单需要增加订阅端IP:
要使用逻辑订阅,必须要设置发布端实例的wal_level 参数 >=logical。RDS for PostgreSQL 10 控制台支持该参数的修改,如下图:
注:该参数会重启实例,请选择合理的修改时间。
在发布端对特殊的表(ALL 代表全部的表)创建PUBLICATION 如下:
CREATE PUBLICATION mypub FOR TABLE test ;
其中:
其他 CREATE PUBLICATION 的语法详见链接 。
复制源端必须提供带有replication 权限的用户,在RDS for PostgreSQL 10 中,初始账号具有replication 权限,由初始账号执行create role xxx with superuser 的用户也具有replication 权限。
订阅端
max_replication_slots,大于等于该实例总共需要创建的订阅数
max_logical_replication_workers,大于等于该实例总共需要创建的订阅数
max_worker_processes, 大于等于max_logical_replication_workers + 1 + CPU并行计算 + 其他插件需要fork的进程数.
在订阅端创建于发布端相同的表结构:
create table test(id int);
在订阅端创建SUBSCRIPTION:
CREATE SUBSCRIPTION mysub CONNECTION 'dbname=demodb host=xxx.aliyun-inc.com port=3432 user=acc password=xxx' PUBLICATION mypub with (copy_data=true);
其中:
select * from pg_create_logical_replication_slot(‘订阅名称>’,’ pgoutput’);
逻辑订阅可以简单理解为将xlog 解析,然后在订阅端执行对应的SQL。当订阅端执行SQL 失败,则订阅就会暂停。冲突修复一般有如下方法:
逻辑订阅属于一种逻辑复制,可以在发布端查看pg_stat_replication 来查看复制的各个lsn 位点如下:
demodb=> select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 67297
usesysid | 16384
usename | acc
application_name | mysub
client_addr | xxx
client_hostname |
client_port | 58841
backend_start | 2019-04-18 18:27:29.031333+08
backend_xmin |
state | streaming
sent_lsn | 0/11DB8728
write_lsn | 0/11DB8728
flush_lsn | 0/11DB8728
replay_lsn | 0/11DB8728
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async
订阅端提供了pg_stat_subscription 的视图来查看当前接受的lsn 位点,如下:
demodb=> select * from pg_stat_subscription;
-[ RECORD 1 ]---------+------------------------------
subid | 56043
subname | mysub
pid | 59777
relid |
received_lsn | 0/11DB8728
last_msg_send_time | 2019-04-18 23:16:10.879015+08
last_msg_receipt_time | 2019-04-18 23:16:10.88364+08
latest_end_lsn | 0/11DB8728
latest_end_time | 2019-04-18 23:16:10.879015+08