环境信息
pg版本:10.12.1
主:172.20.0.231
备:172.20.0.152
安装目录:PGHOME = /home/nh/pg/pgsql/
data目录:PGDATA = /nhdata/busi_db/
主数据库
修改postgresql.conf文件
wal_level = hot_standby #WAL日志信息的输出级别,minimal、replica、logical三种模式
synchronous_commit = off #只能为off,否则主库会一直等待备机响应,备机故障时主机也会出问题
max_wal_senders = 10 #默认为10,一个流复制备库通常只需要消耗流复制主库一个WAL 发送进程,必须小于max_connections
wal_keep_segments = 512 #越大越好,根据归档存储空间定,默认单个WAL文件大小为16M,此处512×16MB=8GB
hot_standby = on #开启流复制
logging_collector = on #开启日志
log_directory = 'pg_log' #开启日志路径
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' #开启日志文件名
创建replication用户
./psql -U postgres
create user repli replication LOGIN password '123456';
配置pg_hba.conf文件
添加以下配置,考虑到主备角色互换,建议pg_hba.conf主备完全一样
host replication repli 172.20.0.231/32 md5
host replication repli 172.20.0.152/32 md5
重启数据库
pg_ctl -D $PGDATA restart
备数据库
1) 测试从服务器能否连接主服务器数据库
psql -h 172.20.0.231 -U postgres
#连接成功后停掉从库的服务,清空从节点数据
rm –rf $PGDATA/*
2) 从主节点拷贝数据到从节点
#pg_basebackup -h 10.251.9.39 -U repli -D $PGDATA -X stream –P
./pgsql/bin/pg_basebackup -D $PGDATA -Fp -Xs -v -P -h 172.20.0.231 -U repli
3) 修改recovery.conf文件
复制share目录(pgsql/share/postgresql/recovery.conf.sample)下的recovery.conf.sample文件
cp $PGHOME/share/recovery.conf.sample $PGDATA/recovery.conf
修改以下配置
standby_mode='on'
recovery_target_timeline = 'latest'
#配置主机的ip、用户、端口等,repli即主库创建的用于流复制的用户
primary_conninfo='host=172.20.0.231 port=5432 user=repli password=123456'
trigger_file='/nhdata/busi_db/trigger'
重启备库
pg_ctl -D $PGDATA restart
查看主备状态
通过进程查看 ps -aux | grep postgres
主库为wal sender
备库为wal receiver
执行SQL
select client_addr,sync_stat from pg_stat_replication; --说明client_addr服务器是从节点,在接收流,而且是异步流复制
select pg_is_in_recovery(); --主库是false 备库是true
通过建表、插入数据测试即可
主从切换
文件触发方式
1、配置备库recovery.conf文件trigger_file参数
2、关闭主库
$ pg_ctl stop -m fast
3、 在备库上创建trigger_file,
$ touch $PGDATA/trigger
触发器文件名称和路径需和recovery.conf配置文件trigger_file保持一致,再次查看recovery文件时,发现后辍由原来的.conf变成了.done,表示备库切换为主库成功。
4、老的主库切换成备库
拷贝老的备库recovery.done(recovery.conf)文件到新备库,修改IP地址为新主库IP
primary_conninfo='host=172.20.0.152 port=5432 user= repli password=123456'
5、启动新备库
$ pg_ctl -D $PGDATA start
pg_ctl promote方式
1、关闭主库
$ pg_ctl stop -m fast
2、在备库上执行pg_ctl prompt命令激活备库,如果recovery.conf变成recovery.done表示备库已切换成为主库。
3、 老的主库切换成备库
拷贝老的备库recovery.done(recovery.conf)文件到老主库,修改IP地址为新主库IP
primary_conninfo='host=172.20.0.152 port=5432 user= repli password=123456'
4、观察主、备库是否正常