前言
环境信息
IP | 角色 | 操作系统 | PostgreSQL版本 |
192.168.1.112 | 主库 | Debian 12 | 15.3 |
192.168.1.113 | 从库 | Debian 12 | 15.3 |
配置主从
- 修改主库的postgresql.conf文件。修改此配置文件需重启数据库服务。归档脚本内容见"附录-clean_archivelog"
listen_addresses = '*' archive_mode = on archive_command = 'bash /home/postgres/scripts/clean_archivelog.sh %f %p'
- 主库创建用户
create user replicator replication password '1234qwer';
- 修改主库pg_hba.conf
host replication replicator 192.168.1.113/24 scram-sha-256
- 重载pg_hba.conf的配置
pg_ctl reload -D /home/postgres/apps/pgsql/data/
- 删除从库的数据目录,备份主库的数据
rm -rf /home/postgres/apps/pgsql/data mkdir /home/postgres/apps/pgsql/data chmod -R 700 /home/postgres/apps/pgsql/data pg_basebackup -h 192.168.1.112 -p 5432 -U replicator -D /home/postgres/apps/pgsql/data/ -P -v -R -X stream -C -S slot1
- 备份完成后,从库的data目录下自动生成
postgresql.auto.conf
和standby.signal
文件。
postgresql.auto.conf
包含主库节点的相关连接信息standby.signal
用于标识当前节点为从库节点
- 启动从库。PS:因为从库的配置皆从主库复制而来,因此归档脚本也要在从库服务器存在。
pg_ctl start -D /home/postgres/apps/pgsql/data -l ~/logfile
测试
- 主库建库建表添数,之后查看从库是否同步数据
create database reptest; \c reptest create table t1(id int, time timestamp); insert into t1 values (1, now());
- 主库psql查看从库的相关信息
-- 启用扩展输出 \x -- 检查复制状态 select * from pg_stat_replication; -[ RECORD 1 ]----+------------------------------ pid | 3794 usesysid | 16388 usename | replicator application_name | walreceiver client_addr | 192.168.1.113 client_hostname | client_port | 41708 backend_start | 2024-01-27 18:44:08.326476+08 backend_xmin | state | streaming sent_lsn | 0/33FF750 write_lsn | 0/33FF750 flush_lsn | 0/33FF750 replay_lsn | 0/33FF750 write_lag | flush_lag | replay_lag | sync_priority | 0 sync_state | async reply_time | 2024-01-27 18:54:58.764699+08
- 查看主库进程,会有
walsender
进程
$ ps -ef | grep postgres: postgres 3794 3739 0 18:44 ? 00:00:00 postgres: walsender replicator 192.168.1.113(41708) streaming 0/33FF750
- 查看从库进程,会有
walreceiver
进程
$ ps -ef | grep postgres: postgres 1309 1305 0 18:44 ? 00:00:01 postgres: walreceiver streaming 0/33FF838
附录
clean_archive
#!/bin/bash set -u log_dt=$(date +%F) archivelog_dir="/home/postgres/archivelog/${log_dt}" if [ ! -d "${archivelog_dir}/$1" ]; then mkdir -p "${archivelog_dir}/$1" fi cp --preserve=timestamps $2 ${archivelog_dir}/$1 find ${archivelog_dir}/* -type f -mtime +7 | xargs rm -f