postgresql 14 流复制(主从)配置

发布时间 2023-12-29 11:45:09作者: jiaxzeng

1. 创建用于数据流的用户

主库操作

$ psql -h 127.0.0.1 -p 5432 -U postgres -W
Password: 
psql (14.10)
Type "help" for help.

postgres=# create role repl login replication encrypted password 'oLfex^5pfe';
CREATE ROLE

2. 配置登录权限

主库操作

cat <<'EOF' | tee -a $PGDATA/pg_hba.conf > /dev/null
# 配置postgresql集群主机 replication 免密登录
host    replication     all             192.168.32.127/32       trust
host    replication     all             192.168.32.132/32       trust
# 配置 同网段 主机密码登录
host    all             all             192.168.32.0/24         scram-sha-256
EOF

pg_ctl reload

3. 创建从库数据目录

从库操作

su - postgres

sudo rm -rf /data/pg_* && \
sudo mkdir -p /data/{pg_data,pg_wal,pg_archive} && \
sudo chown -R postgres. /data/{pg_data,pg_wal,pg_archive} && \
sudo chmod 700 /data/{pg_data,pg_wal,pg_archive}

4. 基础备份

从库操作

pg_basebackup -h 192.168.32.132 -p 5432 -U repl --pgdata=/data/pg_data --waldir=/data/pg_wal --write-recovery-conf --progress --verbose

5. 修改配置文件

5.1 从库相关配置

从库操作,如果已经存在以下配置项,无需添加

cat <<'EOF' | tee -a $PGDATA/postgresql.conf > /dev/null
# 备用服务器相关设置
hot_standby = on # 控制是否允许备用服务器在进行热备份时同时处理读取查询
max_standby_archive_delay = 30s # 控制备用服务器获取 WAL 日志文件时的最大延迟
wal_receiver_status_interval = 10s # 控制 WAL 接收进程向主服务器发送心跳消息的时间间隔
hot_standby_feedback = on # 控制是否在主服务器上记录发往备用服务器的 XID 范围,备用服务器在进行热备份时可以更有效地获取缺失的 WAL 日志
EOF

5.2 连接主库配置

从库操作

cat $PGDATA/postgresql.auto.conf
primary_conninfo = 'host=192.168.32.127 port=5432 user=repl'

6. 启动服务

从库操作

pg_ctl start

7. 查看日志

从库操作

cd $PGDATA/logs/
tail -f postgresql-`date "+%Y-%m-%d"`.log

8. 验证

psql -h 127.0.0.1 -p 5432 -U postgres -W -c "select pg_is_in_recovery();"

$ psql -h 127.0.0.1 -p 5432 -U postgres -W -c "select pid,application_name,client_addr,sync_state from pg_stat_replication;"
Password: 
  pid  | application_name |  client_addr   | sync_state 
-------+------------------+----------------+------------
 39773 | walreceiver      | 192.168.32.132 | async
(1 row)