PostgreSQL 主从流复制搭建与故障处理(WAL / 延迟 / 脑裂)
2026-08-11 01:32:30
# 数据库
PostgreSQL 通过 WAL(Write-Ahead Log)流复制 实现高可用。本文给出一主一从搭建,以及延迟、脑裂等故障处理。
一、原理
主库把 WAL 实时发送给从库,从库重放,保持与主库一致。分为物理流复制(整实例)和逻辑复制(按表)。以下以物理流复制为例。
二、主库配置
postgresql.conf:
1 | wal_level = replica |
pg_hba.conf 放行从库复制:
1 | host replication repl 从库IP/32 md5 |
建复制账号:
1 | CREATE ROLE repl LOGIN REPLICATION PASSWORD 'ReplPass!'; |
三、从库搭建(pg_basebackup)
1 | pg_basebackup -h 主库IP -U repl -D /var/lib/pgsql/standby -Fp -Xs -P |
然后创建 standby.signal(PG12+)并配置 postgresql.auto.conf:
1 | primary_conninfo = 'host=主库IP user=repl password=ReplPass!' |
启动从库即进入恢复(只读)状态。
四、健康检查
主库:
1 | SELECT * FROM pg_stat_replication; -- 看从库连接、延迟 |
从库:
1 | SELECT * FROM pg_stat_wal_receiver; -- 接收状态 |
五、常见故障
- 复制延迟大:大事务 / 网络 / 从库慢。关注
replay_lag。 - 时间线分歧 / WAL 缺失:从库落后太多且主库已清理旧 WAL,复制中断。需重新
pg_basebackup重建从库,或配置archive_command归档 WAL 兜底。 - 脑裂:主从切换后旧主仍写入。务必借助 Patroni / repmgr 等工具做故障自动切换与 fencing,避免双写。
小结
PG 流复制靠 WAL;健康看 pg_stat_replication;WAL 缺失要重建从库;生产环境务必上 Patroni/repmgr 管脑裂。