概述
今天主要介绍如何搭建PG主从流复制及主从切换,仅供参考。
PS:上篇的地址在文末链接.
PostgreSQL数据库主从异步流复制搭建
环境说明:
1、安装PG数据库(主从库进行)
用脚本进行,略。
2、主库配置
2.1、添加流复制用户
--修改/data/pgdata/postgresql.conf以下参数
wal_level = hot_standby # 这个是设置主为wal的主机, minimal,replica or logical使得日志支持流复制
max_wal_senders = 4 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 256 # 设置流复制保留的最多的xlog数目,不要设置太小导致WAL日志还没有来得及传送到standby就被覆盖,一个WAL文件默认16M
hot_standby = on # "on" allows queries during recovery 设置为备库时是否支持可读
wal_sender_timeout = 120s # 设置流复制主机发送数据的超时时间
--检查配置
cat postgresql.conf |grep -E 'wal_level|max_wal_senders|wal_keep_segments|hot_standby|wal_sender_timeout' | grep -v '^#'
2.2、修改配置文件postgresql.conf
--修改/data/pgdata/postgresql.conf以下参数
wal_level = hot_standby # 这个是设置主为wal的主机, minimal,replica or logical使得日志支持流复制
max_wal_senders = 4 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 256 # 设置流复制保留的最多的xlog数目,不要设置太小导致WAL日志还没有来得及传送到standby就被覆盖,一个WAL文件默认16M
hot_standby = on # "on" allows queries during recovery 设置为备库时是否支持可读
wal_sender_timeout = 120s # 设置流复制主机发送数据的超时时间
--检查配置
cat postgresql.conf |grep -E 'wal_level|max_wal_senders|wal_keep_segments|hot_standby|wal_sender_timeout' | grep -v '^#'
2.3、修改配置文件pg_hba.conf
增加如下参数
?systemctl restart postgresql
2.4、重启主库
?systemctl restart postgresql
3、从库配置
PG 12把recovery.conf废掉了,与PG 11略有不同,但大同小异。
3.1、通过pg_basebackup命令行在从库上生成基础备份
这里以/data/pgdata做数据目录,迁移之前需保证/data/pgdata目录为空
systemctl stop postgresql
rm -rf /data/pgdata/*
#-Fp表示以plain格式数据,-Xs表示以stream方式包含所需的WAL文件,-P表示显示进度,-R表示为replication写配置信息。
#备份完成,使用-R选项,在data目录下自动生成standby.signal“信号”文件(可手工使用touch命令生成)以及更新了postgresql.auto.conf文件
#postgresql.auto.conf中写入了主库的连接信息(可手工添加primary_conninfo信息)。
pg_basebackup --progress -D /data/pgdata -h xx.142 -p 55432 -U replica --password -Fp -Xs -P -R
3.2、修改配置文件standby.singal
cat > standby.signal <
3.3、启动从库
#Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)
chmod -R 750 /data/pgdata/
chown -R postgres:postgres /data/pgdata/
systemctl restart postgresql
4、主从流复制检查
4.1、检查进程
查看进程,主库所在的机器中会看到sender进程
从库所在的机器中会看到receiver进程
4.2、检查异步流复制的情况
1)主库查看复制状态
?select pid,usename,client_addr,state,sent_lsn,write_lsn,flush_lsn,replay_lsn,sync_priority,sync_state from pg_stat_replication;
参数说明:
- pid # sender的进程
- usename # 复制的用户用户名
- client_addr # 复制的客户端地址
- client_port # 复制的客户端端口
- backend_start # 主从搭建的时间
- state # 同步状态 startup: 连接中、catchup: 同步中、streaming: 同步
- sent_location # Master传送WAL的位置
- write_location # Slave接收WAL的位置
- flush_location # Slave同步到磁盘的WAL位置
- replay_location # Slave同步到数据库的WAL位置
- sync_priority #同步Replication的优先度, 0: 异步、1~?: 同步(数字越小优先度越高)
- sync_state # 有三个值,async: 异步、sync: 同步、potential: 虽然现在是异步模式,但是有可能升级到同步模式
2)查看从服务(WAL接收器进程)状态
?psql -c "\x" -c "SELECT * FROM pg_stat_wal_receiver;"
4.3、数据测试
1)主库写入数据
?create table tb1 (i int,t text);brinsert into tb1 values (1,'hwb');
2)备库查询并写入数据
?select * from tb1 ;brinsert into tb1 values (2,'hwb2');
PostgreSQL主从数据库切换
当主库出现故障时,我们需要将备库提升为主库进行读写操作。激活备库有3种方式:
1)pg_ctl 方式: 在备库主机执行 pg_ctl promote shell 脚本
2)触发器文件方式: 备库配置 recovery.conf 文件的 trigger_file 参数,之后在备库主机上创建触发器文件
3)pg_promote()函数方式,可以通过SQL命令激活备库(pg12之后)
1、识别当前库主从角色
1)查看pg_is_in_recovery()视图
?psql -c "\x" -c "SELECT * FROM pg_stat_wal_receiver;"
2)pg_controldata识别
pg_controldata 结果为cluster state是in production则为主库;结果为cluster state是in archive recovery则为备库。
?./pg_controldata -D /data/pgdata/ | grep cluster
3)查看pg_stat_replication
--查询到结果为主库,查询不到结果为备库
select pid, application_name, client_addr, client_port, state, sync_state from pg_stat_replication;
2、基于pg_promote函数主从切换
2.1、关闭主库,模拟故障
?systemctl stop postgresql
2.2、激活备库
pg_promote语法:
?pg_promote(wait boolean DEFAULT true, wait_seconds integer DEFAULT 60)
两个参数:
wait: 表示是否等待备库的 promotion 完成或者 wait_seconds 秒之后返回成功,默认值为 true。
wait_seconds: 等待时间,单位秒,默认 60
?psql -c "\x" -c "select pg_promote(true,60);"
2.3、验证
cd /usr/local/postgres/bin
date && ./pg_controldata -D /data/pgdata/ | grep cluster
至此便完成备库的激活,当原主库修复完后,我们可重复之前步骤将原主库作为新的备库使用。
2.4、原主库切换为新备库(在原主库进行)
cat > standby.signal < postgresql.auto.conf <
后面会分享更多devops和DBA方面内容,感兴趣的朋友可以关注下~