PostgreSQL 13 同步流复制+failover(#2.6)-202104
导语:PostgreSQL 同步流复制+failover场景可以对应Oracle Active DataGuard(物理)+failover场景去理解。
Postgresql 流复制:流复制协议,且锁会被复制并应用。所以主库产生大量锁的同时,要考虑备库的状况。
Oracle DataGuard:block to block 且锁不会被复制
PostgreSQL 13 同步流复制+failover(#2.6)配置
环境:
OS:RedHat 8.3
DB:PostgreSQL 13.1
Master:192.168.108.129
Replica:192.168.108.128
1.同步流复制
# 参考:PostgreSQL 13 同步流复制(#2.4)-202104
2.模拟failover切换
2.1 主库(192.168.108.129)关闭或是已经关闭【确保checkpoint】
pg_ctl -D $PGDATA status
pg_ctl -D $PGDATA stop -m fast
# 主库模拟关闭cluster databases
pg13@pgdb02-> pg_ctl -D $PGDATA status
pg_ctl: no server running
2.2 激活备库(192.168.108.128)进行failover切换
2.2.1 激活failover前,观察备库(192.168.108.128)standby.signal 文件
pg13@pgdb01-> cat standby.signal
2.2.2 激活failover前,查看备库(192.168.108.128)database cluster和postgres进程状态
pg13@pgdb01-> pg_controldata | grep cluster
Database cluster state: in archive recovery
pg13@pgdb01-> ps -ef | grep postgres
pg13 25711 25245 0 19:06 pts/1 00:00:00 psql -d postgres -p 5432
pg13 26530 1 0 20:02 ? 00:00:00 /db/pg13/soft/bin/postgres -D /db/pg13/data
pg13 26531 26530 0 20:02 ? 00:00:00 postgres: startup recovering 000000020000000000000008
pg13 26532 26530 0 20:02 ? 00:00:00 postgres: checkpointer
pg13 26533 26530 0 20:02 ? 00:00:00 postgres: background writer
pg13 26534 26530 0 20:02 ? 00:00:00 postgres: stats collector
pg13 26661 26297 0 20:08 pts/2 00:00:00 grep --color=auto postgres
2.2.3 激活failover
# pg12开始新增了一个pg_promote()函数,让我们可以通过SQL命令激活备库
postgres=# select pg_promote(true,60);
-[ RECORD 1 ]-
pg_promote | t
# 两个参数:
# wait: 表示是否等待备库的 promotion 完成或者 wait_seconds 秒之后返回成功,默认值为 true
# wait_seconds: 等待时间,单位秒,默认 60
2.2.4 激活failover后,观察新主库(192.168.108.128)standby.signal文件
# 旧备库激活成主库后,standby.signal文件被自动删除。本身该文件就是标注集群中备库的激活文件,现备库已成主库,自然这个standby.signal文件就会删除
pg13@pgdb01-> ls -l standby.signal
ls: cannot access 'standby.signal': No such file or directory
2.2.5 激活failover后,新主库(192.168.108.128)database cluster和postgres进程状态
# 由旧备库in archive recovery状态变为新主库的in production状态
pg13@pgdb01-> pg_controldata | grep cluster
Database cluster state: in production
# 旧备库的 startup recovering进程消失,因不需要恢复wal日志流,所以startup recovering进程消失。
pg13@pgdb01-> ps -ef | grep postgres
pg13 25711 25245 0 19:06 pts/1 00:00:00 psql -d postgres -p 5432
pg13 26530 1 0 20:02 ? 00:00:00 /db/pg13/soft/bin/postgres -D /db/pg13/data
pg13 26532 26530 0 20:02 ? 00:00:00 postgres: checkpointer
pg13 26533 26530 0 20:02 ? 00:00:00 postgres: background writer
pg13 26534 26530 0 20:02 ? 00:00:00 postgres: stats collector
pg13 26694 26530 0 20:10 ? 00:00:00 postgres: walwriter
pg13 26695 26530 0 20:10 ? 00:00:00 postgres: autovacuum launcher
pg13 26696 26530 0 20:10 ? 00:00:00 postgres: logical replication launcher
pg13 26714 26297 0 20:11 pts/2 00:00:00 grep --color=auto postgres
# 至此已完成PostgreSQL 13 同步流复制+failover切换