PostgreSQL 主从复制是一种 实时同步数据 的机制,可以实现 高可用性 (HA)、读写分离 和 负载均衡。其核心是 WAL (Write-Ahead Logging) 日志与 流复制机制。
CREATE ROLE repl_user WITH REPLICATION LOGIN PASSWORD 'your_strong_password';
一般路径
/var/lib/pgsql/15/data/postgresql.conf
listen_addresses = '*' # 监听所有地址
wal_level = replica # 开启复制所需的 WAL 级别
max_wal_senders = 10 # 允许的最大复制连接数
wal_keep_size = 1024 # WAL 保留大小,避免备库长时间断开
archive_mode = on
archive_command = 'test ! -f /pg_archive/%f && cp %p /pg_archive/%f'
重启数据库:
systemctl restart postgresql-15
host replication repl_user 192.168.1.20/32 md5
重新加载配置:
pg_ctl reload
systemctl stop postgresql-15
rm -rf /var/lib/pgsql/15/data/*
pg_basebackup -h 192.168.1.10 -U repl_user -D /var/lib/pgsql/15/data/ -Fp -Xs -P -R
说明:-R 会自动创建 standby.signal 并配置 primary_conninfo,超级推荐。
如果没用 -R,需要手动配置:
# standby.signal 文件
touch /var/lib/pgsql/15/data/standby.signal
# postgresql.auto.conf 添加:
primary_conninfo = 'host=192.168.1.10 port=5432 user=repl_user password=your_strong_password'
systemctl start postgresql-15
SELECT application_name, client_addr, state, sync_state
FROM pg_stat_replication;
SELECT pg_is_in_recovery();
返回 t 表明备库处于恢复模式(只读)。
主库宕机时,可以将备库提升为主库:
pg_ctl promote -D /var/lib/pgsql/15/data/
# 或
touch /var/lib/pgsql/15/data/promote
应用端需切换连接到新的主库。其余备库需重新指向新主库。
模式 | 优点 | 缺点 |
异步复制 | 性能高,延迟低 | 存在极小数据丢失风险 |
同步复制 | 数据零丢失 | 延迟高,影响性能 |
最佳实践:
