本文以两个数据库为例,演示如何使用原生逻辑复制或 `pglogical` 搭建读写分离/异构同步通道,给出可执行命令与验证方法,并讨论与物理复制的取舍。


## 前提与版本


  • PostgreSQL 13–16;建议 15/16。
  • 开启 wal_level=logical,确保具备发布订阅功能。

SHOW wal_level; -- 期望输出 logical

## 原生发布/订阅配置


在主库(publisher):


CREATE PUBLICATION app_pub FOR TABLE orders, users;

在从库(subscriber):


CREATE SUBSCRIPTION app_sub
CONNECTION 'host=10.0.0.10 port=5432 dbname=app user=replicator password=StrongPass#2024'
PUBLICATION app_pub;

验证:在主库写入数据,观察从库对应表是否实时更新;通过 `pg_stat_subscription` 观测延迟与错误。


SELECT * FROM pg_stat_subscription;

## 使用 pglogical(增强特性)


安装扩展并创建节点:


CREATE EXTENSION IF NOT EXISTS pglogical;
SELECT pglogical.create_node('node_pub', 'host=10.0.0.10 port=5432 dbname=app user=replicator password=StrongPass#2024');
SELECT pglogical.create_node('node_sub', 'host=10.0.0.11 port=5432 dbname=app user=replicator password=StrongPass#2024');

创建复制集与订阅:


SELECT pglogical.create_replication_set('default', include_insert := true, include_update := true, include_delete := true);
SELECT pglogical.replication_set_add_table('default', 'orders');
SELECT pglogical.create_subscription('sub1', provider_dsn := 'host=10.0.0.10 port=5432 dbname=app user=replicator password=StrongPass#2024');

## 一致性与冲突处理


  • 逻辑复制不复制 DDL 与序列状态(原生),需在迁移前统一结构并评估冲突。
  • 多源写入会产生冲突,需设计幂等与版本字段或只读从库策略。

## 延迟监控


SELECT * FROM pg_stat_subscription; -- 原生
SELECT * FROM pglogical.show_subscription_status(); -- pglogical

## 与物理复制的取舍


  • 物理复制:高一致性与性能,适合主从/HA;不适合跨版本或部分表同步。
  • 逻辑复制:灵活粒度,支持异构与在线迁移;需关注 DDL 与冲突处理。

## 相关文章(同分类热门)


  • [PostgreSQL 查询计划与索引优化实战:EXPLAIN ANALYZE 与 pg_stat_statements](./PostgreSQL 查询计划与索引优化实战:EXPLAIN ANALYZE 与 pg_stat_statements.md)
  • [MySQL 8.0 复制与高可用:Group Replication 与 InnoDB Cluster 实战指南](./MySQL 8.0 复制与高可用:Group Replication 与 InnoDB Cluster 实战指南.md)

## 结语


逻辑复制为跨版本与异构迁移提供了工程化路径。通过延迟观测与冲突策略设计,可以在满足业务连续性的前提下稳步完成同步与上线。



点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部