概述今天主要介绍如何搭建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文件默认16Mhot_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文件默认16Mhot_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 postgresql2.4、重启主库 systemctl restart postgresql3、从库配置PG 12把recovery.conf废掉了,与PG 11略有不同,但大同小异。
3.1、通过pg_basebackup命令行在从库上生成基础备份这里以/data/pgdata做数据目录,迁移之前需保证/data/pgdata目录为空systemctl stop postgresqlrm -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 -R3.2、修改配置文件standby.singalcat > standby.signal <<EOFstandby_mode = 'on'EOF3.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 postgresql4、主从流复制检查4.1、检查进程查看进程,主库所在的机器中会看到sender进程从库所在的机器中会看到receiver进程4.2、检查异步流复制的情况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 postgresql4、主从流复制检查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 cluster3)查看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 postgresql2.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/bindate && ./pg_controldata -D /data/pgdata/ | grep cluster至此便完成备库的激活,当原主库修复完后,我们可重复之前步骤将原主库作为新的备库使用。
2.4、原主库切换为新备库(在原主库进行)cat > standby.signal <<EOFstandby_mode = 'on'EOFcat > postgresql.auto.conf <<EOFprimary_conninfo = 'user=replica password=''replica@1234'' host=xx.143 port=55432 sslmode=prefer sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any'EOF--重启备库systemctl restart postgresql后面会分享更多devops和DBA方面内容,感兴趣的朋友可以关注下~