PostgreSQL 主从流复制搭建与故障处理(WAL / 延迟 / 脑裂)
2026-08-11 01:32:30 # 数据库

PostgreSQL 通过 WAL(Write-Ahead Log)流复制 实现高可用。本文给出一主一从搭建,以及延迟、脑裂等故障处理。

一、原理

主库把 WAL 实时发送给从库,从库重放,保持与主库一致。分为物理流复制(整实例)和逻辑复制(按表)。以下以物理流复制为例。

二、主库配置

postgresql.conf

1
2
3
wal_level = replica
max_wal_senders = 10
listen_addresses = '*'

pg_hba.conf 放行从库复制:

1
host    replication    repl    从库IP/32    md5

建复制账号:

1
2
CREATE ROLE repl LOGIN REPLICATION PASSWORD 'ReplPass!';
SELECT pg_reload_conf();

三、从库搭建(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
2
SELECT * FROM pg_stat_wal_receiver;  -- 接收状态
SELECT pg_last_wal_receive_lsn() - pg_last_wal_replay_lsn(); -- 重放延迟

五、常见故障

  • 复制延迟大:大事务 / 网络 / 从库慢。关注 replay_lag
  • 时间线分歧 / WAL 缺失:从库落后太多且主库已清理旧 WAL,复制中断。需重新 pg_basebackup 重建从库,或配置 archive_command 归档 WAL 兜底。
  • 脑裂:主从切换后旧主仍写入。务必借助 Patroni / repmgr 等工具做故障自动切换与 fencing,避免双写。

小结

PG 流复制靠 WAL;健康看 pg_stat_replication;WAL 缺失要重建从库;生产环境务必上 Patroni/repmgr 管脑裂。