PostgreSQL服务器能否同时作为部分表的发布者与其他表的订阅者?
双向逻辑复制实现:PostgreSQL服务器A与B互为主从(表1和表2)
完全可以实现这种双向逻辑复制架构:让服务器A作为表1的发布者和表2的订阅者,同时服务器B作为表2的发布者和表1的订阅者。PostgreSQL的逻辑复制原生支持这种双向配置,只要确保复制规则不冲突即可。
由于你已经完成了「A发布表1 → B订阅表1」的配置,接下来只需要补充「B发布表2 → A订阅表2」的流程,具体步骤如下:
1. 在服务器B上配置表2的发布端
1.1 确认核心参数配置
检查B的postgresql.conf文件,确保以下参数已正确设置(逻辑复制的基础要求):
wal_level = logical # 必须设置为logical,开启逻辑复制支持 max_replication_slots = 2 # 至少预留2个槽位(已有A的订阅,新增表2的发布) max_wal_senders = 2 # 至少预留2个WAL发送进程
如果修改了参数,重启B的PostgreSQL服务生效:
# 以systemd管理为例 sudo systemctl restart postgresql
1.2 创建表2的发布
登录B的数据库,执行SQL创建针对表2的发布:
CREATE PUBLICATION pub_table2 FOR TABLE table2;
1.3 配置访问控制
修改B的pg_hba.conf文件,添加允许服务器A连接进行复制的规则:
host replication replicator A的IP地址/32 scram-sha-256
重新加载配置使规则生效:
sudo systemctl reload postgresql
2. 在服务器A上配置表2的订阅端
2.1 同步表2结构
确保A上的表2结构与B完全一致(如果A还没有表2,用以下命令同步结构):
# 从B导出表2结构,导入到A pg_dump -s -t table2 -d B的数据库名 -h B的IP -U replicator | psql -d A的数据库名 -h localhost -U postgres
2.2 创建订阅连接到B的发布
登录A的数据库,执行SQL创建订阅:
CREATE SUBSCRIPTION sub_table2 FROM PUBLICATION pub_table2 CONNECTION 'host=B的IP port=5432 dbname=你的数据库名 user=replicator password=复制用户密码';
2.3 验证订阅状态
执行以下SQL检查订阅是否正常运行:
SELECT subname, substate FROM pg_subscription;
如果substate显示ready,则订阅配置成功。
关键注意事项
- 避免循环复制:严格保证表1的变更仅从A同步到B,表2的变更仅从B同步到A,不要对同一张表配置双向发布订阅,否则会导致无限循环复制。
- 主键冲突处理:如果表1/表2使用自增主键,需规划不重叠的主键范围(比如A的表1用奇数主键,B的表2用偶数),或者改用UUID作为主键,避免双向同步时出现主键冲突。
- 权限检查:确保复制用户(如
replicator)在发布端拥有对应表的SELECT权限,在订阅端拥有对应表的INSERT/UPDATE/DELETE权限。 - 监控复制状态:定期通过以下SQL监控复制健康度:
- 发布端(B):查看WAL发送状态
SELECT * FROM pg_stat_replication; - 订阅端(A):查看订阅同步状态
SELECT * FROM pg_stat_subscription;
- 发布端(B):查看WAL发送状态
内容的提问来源于stack exchange,提问作者Yassin Shanwany
相关产品推荐
相关产品推荐

