首页 » Linux » centos 7 postgres 11主从同步

centos 7 postgres 11主从同步

 
文章目录

在 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 使用 repuser 用户进行 replication 连接。

这个要加,与host all all 0.0.0.0/0 md5 这个还是有差别,replication是单独的,all并不包含它

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.signalprimary_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.signalpostgresql.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

然后修改应用连接指向新主库。

生产环境建议使用 repmgrPatroni 实现自动故障转移。


✅ 监控建议

  • 监控 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_replicationpg_is_in_recovery()

✅ 至此,PostgreSQL 11 主从流复制配置完成!

原文链接:centos 7 postgres 11主从同步,转载请注明来源!

0