原 【DB宝60】PG12高可用之1主2从流复制环境搭建及切换测试
五、测试主从复制
select pg_is_in_recovery();--主库是f代表false ;备库是t,代表true
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | -- 主库新增表 postgres=# \c sbtest psql (13.2, server 12.2 (Debian 12.2-2.pgdg100+1)) You are now connected to database "sbtest" as user "postgres". sbtest=# select count(*) from sbtest1; count | 10 sbtest=# select count(*) from sbtest11; ERROR: relation "sbtest11" does not exist LINE 1: select count(*) from sbtest11; ^ sbtest=# create table sbtest11 as select * from sbtest1; SELECT 10 sbtest=# select count(*) from sbtest11; count | 10 sbtest=# select pg_is_in_recovery(); pg_is_in_recovery ------------------- f (1 row) -- 从库查询 sbtest=# select count(*) from sbtest11; count ------- 10 (1 row) sbtest=# select pg_is_in_recovery(); pg_is_in_recovery ------------------- t (1 row) sbtest=# create database lhrdb; ERROR: cannot execute CREATE DATABASE in a read-only transaction -- 主库插入 sbtest=# insert into sbtest11 select * from sbtest11; INSERT 0 10 sbtest=# sbtest=# select count(*) from sbtest11; count ------- 20 (1 row) -- 从库查询 sbtest=# select count(*) from sbtest11; count ------- 20 (1 row) |
六、主从切换
6.1、主从Switchover切换
在保证主从数据一致的情况下:
1、在当前主库操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 1、停止服务 docker stop lhrpg64302 2、以“postgres”用户创建创建standby.signal文件 touch /docker_data/pg/lhrpg64302/data/standby.signal cat >> /docker_data/pg/lhrpg64302/data/postgresql.conf <<"EOF" primary_conninfo = 'host=172.72.6.3 port=5432 user=replhr password=lhr' EOF 3、启动服务 docker start lhrpg64302 |
2、在当前备库操作:
1 2 3 4 5 6 7 8 9 10 11 12 | 1、停止服务 docker stop lhrpg64303 2、删除“standby.signal”文件 rm -rf /docker_data/pg/lhrpg64303/data/standby.signal 3、修改postgresql.conf sed -i 's/primary_conninfo/#primary_conninfo/g' /docker_data/pg/lhrpg64303/data/postgresql.conf 4、启动服务 docker start lhrpg64303 |
6.2、主从Failover切换
主数据库是读写的,备数据库是只读的。当主库出现故障时,我们需要将备库提升为主库进行读写操作。
1)切换后,原主库以从库的身份启动:修复过程类似于重建
2)切换后,原主库以主库的身份启动:
切换方法跟版本有关系:
- P12之前,有2种办法:
① pg_ctl promote:执行之后发现recovery.conf变为recovery.done文件,代表 切换成功
② 触发器方式,:备库配置 recovery.conf 文件的 trigger_file 参数,之后在备库主机上创建触发器文件
- 从P12开始 : 直接执行 select pg_promote(true,60)函数即可完成切换。
pg12开始新增了一个pg_promote()函数,让我们可以通过SQL命令激活备库。
pg_promote()语法:
pg_promote(wait boolean DEFAULT true, wait_seconds integer DEFAULT 60)
两个参数:
wait: 表示是否等待备库的 promotion 完成或者 wait_seconds 秒之后返回成功,默认值为 true。
wait_seconds: 等待时间,单位秒,默认 60
6.2.1、Failover切换过程
1)主库操作:关闭主库,模拟主库故障:
1 | docker stop lhrpg64302 |
2)备库操作:激活备库为主库:
1 2 3 4 5 | -- 不关闭主库,也可以执行该命令强制切换为主库角色,切换完成后,主从关系断开 select pg_promote(true,60); -- 查询是否切换成功 select pg_is_in_recovery(); |
1 条回复
[…] 【DB宝60】PG12高可用之1主2从流复制环境搭建及切换测试 […]