数据库内核月报

数据库内核月报 - 2019 / 05

PgSQL · 最佳实践 · RDS for PostgreSQL 的逻辑订阅

Author: 卓刀

背景

在RDS for PostgreSQL 10 中,不再需要使用额外的插件,直接在内核里面实现了表级别的逻辑订阅功能。如果用户具有以下的几个场景,可以尝试使用该逻辑订阅的功能:

注:因为网络连通原因,目前只支持RDS for PostgreSQL 10 基础版开放。下面简单介绍下其具体的使用方法。

RDS for PostgreSQL 10 实践

确认发布端和订阅端网络

只有发布端和订阅端网络可连才能创建逻辑订阅。注意发布端的白名单需要增加订阅端IP:

发布端修改wal_level

要使用逻辑订阅,必须要设置发布端实例的wal_level 参数 >=logical。RDS for PostgreSQL 10 控制台支持该参数的修改,如下图:

image.png

注:该参数会重启实例,请选择合理的修改时间。

发布端创建 PUBLICATION

在发布端对特殊的表(ALL 代表全部的表)创建PUBLICATION 如下:

 CREATE PUBLICATION mypub FOR TABLE test ;

其中:

其他 CREATE PUBLICATION 的语法详见链接

发布端带有replication 权限用户

复制源端必须提供带有replication 权限的用户,在RDS for PostgreSQL 10 中,初始账号具有replication 权限,由初始账号执行create role xxx with superuser 的用户也具有replication 权限。

发布端其他参数

订阅端

  1. max_replication_slots,大于等于该实例总共需要创建的订阅数

  2. max_logical_replication_workers,大于等于该实例总共需要创建的订阅数

  3. max_worker_processes, 大于等于max_logical_replication_workers + 1 + CPU并行计算 + 其他插件需要fork的进程数.

订阅端创建 SUBSCRIPTION

在订阅端创建于发布端相同的表结构:

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

其他