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)