文章目录
在 CentOS 7 上为 PostgreSQL 11 配置主从复制(流复制,Streaming Replication),是一种常见的高可用方案。以下是详细步骤:
🎯 环境准备
- 主服务器(Primary):
192.168.1.10
- 从服务器(Standby):
192.168.1.11
- PostgreSQL 11 已安装(使用官方仓库或 PGDG)
- 两台机器网络互通,防火墙允许 5432 端口
- 使用
postgres
用户操作
✅ 步骤一:主服务器配置
1. 修改 postgresql.conf
sudo -u postgres vim /var/lib/pgsql/11/data/postgresql.conf
修改或添加以下参数:
listen_addresses = '*' # 允许外部连接
port = 5432
wal_level = replica # 启用 WAL 日志用于复制
max_wal_senders = 3 # 最大 WAL 发送进程数
wal_keep_segments = 64 # 保留的 WAL 文件数量(约 1GB)
archive_mode = on # 启用归档(可选,推荐开启)
archive_command = '/bin/true' # 临时归档命令(可后续配置真实归档)
hot_standby = on # 允许备库只读查询
💡
wal_keep_segments = 64
表示保留 64 个 16MB 的 WAL 文件,约 1GB。可根据网络延迟和负载调整。
2. 配置 pg_hba.conf
允许从库连接
sudo -u postgres vim /var/lib/pgsql/11/data/pg_hba.conf
在文件末尾添加:
# TYPE DATABASE USER ADDRESS METHOD
host replication repuser 192.168.1.11/32 md5
说明:允许从库 IP 使用
这个要加,与host all all 0.0.0.0/0 md5 这个还是有差别,replication是单独的,all并不包含它repuser
用户进行 replication 连接。
3. 创建复制用户
sudo -u postgres psql
CREATE USER repuser WITH REPLICATION ENCRYPTED PASSWORD 'your_password_here';
\q
4. 重启主库服务
sudo systemctl restart postgresql-11
sudo systemctl enable postgresql-11
5. 防火墙放行(如启用)
sudo firewall-cmd --permanent --add-port=5432/tcp
sudo firewall-cmd --reload
✅ 步骤二:从服务器配置
1. 停止 PostgreSQL 服务(如果已启动)
sudo systemctl stop postgresql-11
2. 清空原有数据目录(⚠️谨慎操作)
sudo rm -rf /var/lib/pgsql/11/data/*
⚠️ 此操作会删除本地所有数据,请确保是从库且无重要数据!
3. 使用 pg_basebackup
从主库拉取基础备份
sudo -u postgres pg_basebackup \
-h 192.168.1.10 \
-U repuser \
-D /var/lib/pgsql/11/data \
-P \
-R \
-X stream \
-C \
-S standby1 \
-w
参数说明:
-h
: 主库 IP-U
: 复制用户-D
: 数据目录-P
: 显示进度-R
: 自动生成standby.signal
和primary_conninfo
-X stream
: 使用流式传输 WAL-C
: 在主库上创建复制槽(推荐)-S
: 复制槽名称(standby1)-w
: 不提示密码(需提前配置.pgpass
或使用密码文件)
💡 若不想交互输入密码,可创建密码文件:
sudo -u postgres vim ~/.pgpass
内容:
192.168.1.10:5432:replication:repuser:your_password_here
然后:
chmod 600 ~/.pgpass
4. 检查自动生成的 standby.signal
和 postgresql.auto.conf
sudo -u postgres ls -l /var/lib/pgsql/11/data/standby.signal
sudo -u postgres cat /var/lib/pgsql/11/data/postgresql.auto.conf
应看到类似内容:
primary_conninfo = 'user=repuser password=your_password_here host=192.168.1.10 port=5432 sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
primary_slot_name = 'standby1'
5. 启动从库服务
sudo systemctl start postgresql-11
sudo systemctl enable postgresql-11
✅ 步骤三:验证主从复制状态
在主库上查看复制状态:
sudo -u postgres psql
SELECT * FROM pg_stat_replication \x
应看到从库连接信息,如 client_addr = 192.168.1.11
在从库上查看是否处于只读模式:
sudo -u postgres psql
SELECT pg_is_in_recovery();
返回 t
(true)表示处于恢复(备库)模式。
测试数据同步(主库插入,从库查询)
主库:
CREATE TABLE test_replica (id int);
INSERT INTO test_replica VALUES (1);
从库:
SELECT * FROM test_replica;
→ 应看到数据已同步。
✅ 可选:配置只读查询(Hot Standby)
默认 hot_standby = on
已开启,从库可执行 SELECT 查询。
✅ 故障转移(Failover)简述(手动)
若主库宕机,可手动提升从库为主库:
sudo -u postgres pg_ctl promote -D /var/lib/pgsql/11/data
然后修改应用连接指向新主库。
生产环境建议使用
repmgr
或Patroni
实现自动故障转移。
✅ 监控建议
- 监控
pg_stat_replication
延迟(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)
) - 监控复制槽是否活跃
- 设置报警 WAL 堆积
🧩 常见问题
1. 从库启动失败?
查看日志:
tail -f /var/lib/pgsql/11/data/log/postgresql-*.log
常见原因:
- 密码错误
- 主库
pg_hba.conf
未授权 - 数据目录未清空或权限不对
- 网络不通
2. 复制延迟大?
- 增加
wal_keep_segments
- 检查网络带宽
- 启用异步复制(默认)或考虑同步复制(
synchronous_commit = on
+synchronous_standby_names
)
✅ 总结
步骤 | 主库操作 | 从库操作 |
---|---|---|
配置文件 | postgresql.conf , pg_hba.conf | 清空 data,pg_basebackup |
用户 | 创建 repuser | 无 |
启动 | 重启服务 | 启动服务 |
验证 | pg_stat_replication | pg_is_in_recovery() |
✅ 至此,PostgreSQL 11 主从流复制配置完成!
原文链接:centos 7 postgres 11主从同步,转载请注明来源!