PostgreSQL主从配置入门:流复制搭建与故障切换验证
先确认这套方案是否适合你
PostgreSQL 主从配置最常见的方式是流复制(Streaming Replication)。
它让从库持续接收主库的 WAL 日志,实现接近实时的数据同步。
如果目标是读写分离、数据热备或故障时快速切换,这套方案基本够用。
需要提前说明的是,本文以 PostgreSQL 12 及以上版本为例,命令和参数在较新版本中通用。
操作前请确保两台服务器网络互通,并且已经安装好相同大版本的 PostgreSQL。
主从版本差异过大时,复制可能直接失败。
准备两台机器和基础环境
假设主库 IP 是 192.168.1.10,从库 IP 是 192.168.1.11,系统为常见 Linux 发行版。
先在两台机器上确认 PostgreSQL 已安装并运行:
systemctl status postgresql
psql --version
随后在主库创建复制专用账号。
不要直接用超级用户做流复制,权限太大,误操作风险高。
CREATE ROLE repl LOGIN REPLICATION ENCRYPTED PASSWORD '你的强密码';
然后编辑主库的 postgresql.conf,
通常路径在 /etc/postgresql/版本号/main/postgresql.conf 或 /var/lib/pgsql/data/postgresql.conf。
listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
wal_keep_size = 512MB
wal_keep_size 在 PostgreSQL 13 之后使用,旧版本对应 wal_keep_segments。
它的作用是保留足够多的 WAL,防止从库短暂断连后找不到日志。
再编辑 pg_hba.conf,允许从库用 repl 账号连接:
host replication repl 192.168.1.11/32 md5
修改后重启主库:
systemctl restart postgresql
重启后验证复制账号能否连接:
psql -h 192.168.1.10 -U repl -d postgres -c "IDENTIFY_SYSTEM;"
如果能返回 systemid 和时间线信息,说明主库侧准备完成。
用 pg_basebackup 初始化从库
从库需要先停掉 PostgreSQL,并清空数据目录。这一步会删除从库原有数据,操作前务必确认从库没有需要保留的业务数据。
systemctl stop postgresql
mv /var/lib/postgresql/版本号/main /var/lib/postgresql/版本号/main.bak
mkdir -p /var/lib/postgresql/版本号/main
chown postgres:postgres /var/lib/postgresql/版本号/main
然后以 postgres 用户执行基础备份:
su - postgres
pg_basebackup -h 192.168.1.10 -U repl -p 5432 -D /var/lib/postgresql/版本号/main -Fp -Xs -P -R
参数含义:-Fp 表示普通文件格式,-Xs 表示流式传输 WAL,-P 显示进度,-R 会自动生成 standby.signal 并在 postgresql.auto.conf 中写入 primary_conninfo。
如果 -R 没有自动写入连接信息,可以手动在从库数据目录创建 postgresql.auto.conf:
primary_conninfo = 'host=192.168.1.10 port=5432 user=repl password=你的强密码'
同时确认数据目录下存在 standby.signal 文件。
这个文件告诉 PostgreSQL 当前实例以从库身份启动。
启动从库并验证复制状态
在从库启动服务:
systemctl start postgresql
登录主库查看复制连接:
SELECT client_addr, state, sync_state FROM pg_stat_replication;
如果看到从库 IP、state 为 streaming,说明流复制已经建立。
再登录从库执行只读查询:
SELECT pg_is_in_recovery();
返回 t 表示当前处于恢复模式,也就是从库状态。
此时在从库执行写操作会报错,这是正常现象。
可以进一步在主库建表插入数据,然后在从库查询,确认数据同步:
-- 主库
CREATE TABLE test_repl(id int);
INSERT INTO test_repl VALUES (1);
-- 从库
SELECT * FROM test_repl;
如果从库能查到相同数据,说明主从配置已经生效。
容易踩坑的几个地方
密码认证失败:先检查 pg_hba.conf 中的 IP 和认证方式,修改后必须 reload 或 restart。
从库启动报找不到 WAL:通常是 wal_keep_size 太小或从库断连时间过长。
可以考虑启用复制槽,但复制槽会占用主库磁盘,需要监控。
防火墙未放行 5432:主从之间需要双向或至少从库到主库的 5432 端口连通。
可以用 telnet 192.168.1.10 5432 快速测试。
数据目录权限不对:pg_basebackup 和目标目录必须由 postgres 用户拥有,否则从库无法启动。
主从延迟持续增大:
查看从库 pg_stat_wal_receiver 和主库 pg_stat_replication 的 write_lag、flush_lag、replay_lag 字段,
判断是网络问题还是从库磁盘性能不足。
什么时候需要进一步做故障切换
流复制本身只解决数据同步,不自动处理主库宕机。
如果业务不能接受手动切换,需要引入 Patroni、repmgr 或云数据库自带的高可用组件。
生产环境还建议配置同步复制或至少监控复制延迟,避免切换到数据落后的从库。
如果只是用于报表查询、备份或测试环境,当前这套主从配置已经够用。
上线前记得把复制账号密码、pg_hba.conf 访问范围和备份策略一起纳入检查清单。