复制与高可用
流复制、Patroni、PgBouncer。
35 分钟
流复制与高可用
流复制(Streaming Replication) 将 WAL 实时传到备库;配合 Patroni / repmgr 可实现自动故障切换。与 /roadmaps/postgresql-dba 复制节点对齐。
学习目标
- 配置一主一备物理流复制
- 区分同步与异步复制的 RPO 影响
- 了解只读副本与读写分离接入方式
核心概念
主库准备
CREATE ROLE replicator LOGIN REPLICATION PASSWORD 'replpass';
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
synchronous_commit = on -- 同步复制时
synchronous_standby_names = 'standby1'
备库 base backup
pg_basebackup -h primary-host -U replicator -D /var/lib/pgsql/data \
-Fp -Xs -P -R -S standby1
-R 写入 primary_conninfo;备库 hot_standby = on 可只读查询。
复制状态
SELECT client_addr, state, sync_state,
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes
FROM pg_stat_replication;
-- 备库
SELECT pg_is_in_recovery(), pg_last_wal_replay_lsn();
lag 持续增大需查网络、磁盘或备库负载。
读写分离
Spring 写 → Primary
Spring 读(可选)→ Replica(注意复制延迟读旧数据)
可用 Hikari 双数据源 或中间件;与 MySQL 主从只读实例思路相同。
与 MySQL/Spring Boot 对照
| 项 | PostgreSQL | MySQL 8 |
|---|---|---|
| 物理复制 | 流复制 WAL | binlog 主从 |
| 逻辑复制 | Publication/Subscription | 无内置同等物 |
| 半同步 | synchronous_commit | semi-sync plugin |
| HA 工具 | Patroni, repmgr | MHA, InnoDB Cluster |
| Spring 读分离 | 双 DataSource | @Transactional(readOnly) + 路由 |
本站生产 MySQL 主库;PG 练习可用 Docker 两容器模拟 primary/standby。
练习
- 画主备 WAL 流向图并标注 lag 监控点
- 在备库执行只读 SELECT,在主库 INSERT 后观察延迟