深色模式
PostgreSQL 流复制
摘要:流复制让备库实时接收主库的 WAL,是 PG 高可用与读写分离的基础。本文用
pg_basebackup初始化备库,配置standby.signal与primary_conninfo,并给出延迟监控方法。
适用环境
bash
# 主库确认参数
psql -U postgres -c "SHOW wal_level; SHOW max_wal_senders; SHOW listen_addresses;"
# 两台机器 5432 互通
nc -zv 10.0.1.20 54321
2
3
4
2
3
4
操作步骤
1. 主库创建复制账号并放行认证
sql
CREATE USER repl WITH REPLICATION PASSWORD 'ReplPass!2026';1
bash
# pg_hba.conf 增加一条(限制网段)
# host replication repl 10.0.1.0/24 scram-sha-256
sudo systemctl reload postgresql1
2
3
2
3
2. 主库参数配置(postgresql.conf)
ini
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1GB # PG 13+ 用 wal_keep_size,旧版本是 wal_keep_segments
max_replication_slots = 10
listen_addresses = '*'1
2
3
4
5
2
3
4
5
bash
sudo systemctl restart postgresql1
3. 在备库拉取基础备份
bash
# 备库数据目录必须为空
pg_basebackup -h 10.0.1.20 -U repl -D /var/lib/pgsql/data \
-X stream -R -P -S slot_standby1
# -R 自动生成 standby.signal 与 primary_conninfo;-S 同时在主库创建复制槽1
2
3
4
2
3
4
危险
pg_basebackup 的目标目录必须为空且属主为 postgres;对已有数据目录执行会直接覆盖。
4. 启动备库并确认状态
bash
sudo systemctl enable --now postgresql1
sql
-- 主库查看备库连接
SELECT client_addr, state, sync_state, replay_lag FROM pg_stat_replication;
-- 备库查看是否为只读备机
SELECT pg_is_in_recovery(); -- 返回 t 表示处于恢复(备库)状态1
2
3
4
5
2
3
4
5
5. 监控复制延迟
sql
-- 主库:以字节为单位的落后量
SELECT client_addr,
pg_wal_lsn_diff(sent_lsn, replay_lsn) AS replay_bytes,
replay_lag
FROM pg_stat_replication;1
2
3
4
5
2
3
4
5
sql
-- 备库:落后多少时间与是否已追平
SELECT now() - pg_last_xact_replay_timestamp() AS replication_delay;1
2
2
6. 提升备库为主库(演练或故障切换)
bash
sudo -u postgres pg_ctl promote -D /var/lib/pgsql/data1
危险
pg_ctl promote 不可逆,备库一旦提升为主库就无法自动回到备库,需要重新做基础备份。切换前确认旧主已停止写入,避免脑裂(双主)。
验证
sql
-- 主库写入
CREATE TABLE t_probe(id int, ts timestamptz default now());
INSERT INTO t_probe VALUES (1);
-- 备库查询能立刻看到
SELECT * FROM t_probe;
-- 备库写入应报错:cannot execute ... in a read-only transaction
INSERT INTO t_probe VALUES (2);1
2
3
4
5
6
7
2
3
4
5
6
7
常见坑
WARNING
主库 wal_keep_size 不足且未用复制槽时,备库需要的 WAL 会被提前回收,导致复制中断(报错 requested WAL segment has already been removed)。建议同时配置复制槽。
WARNING
复制槽会保留主库 WAL 直到备库消费,备库长期离线会导致主库 WAL 堆积撑爆磁盘;需监控 pg_replication_slots 的 active 状态。
DANGER
同步复制(synchronous_commit=on + application_name)会让主库写入等待备库确认,备库宕机将阻塞主库写入;谨慎评估后使用。