我们知道postgresql的主从切换有点麻烦,或者说操作步骤要求很严格。可能我们经常遇到这种情况,在没有将主库杀死的情况下将备库提升为主,这时主备库可能由于某种原因都在提供写入操作,这时发生脑裂,如果不考虑数据丢失因素,这时我们可能想将原来的主库以备库的模式重新加入集群,但是主备库此时的时间线已经偏离了,这时就需要我们的pg_rewind工具了。
pg_rewind相比pg_basebackup和rsync这样的工具来说,优势是它不需要从源目录拷贝所有的数据文件,而是会对比时间线发生偏离的点,只拷贝变化过的文件,这样对于数据量很大的情况下速度更快。
备库上运行pg_rewind会使得数据库进入恢复状态,备库会从主库读取必要的wal文件,如果源库上因为跑了很长一段时间造成wal丢失,则可以手工从归档目录进行拷贝。
下面的实验简单演示一下pg_rewind的使用:
环境:192.168.1.1(主),192.168.1.2(从)
前提:配置好主从同步,开启wal_log_hints和full_page_writes参数,流复制的配置以及原理等相关详细知识请参考我之前的文章,这里不再赘述。
主库查看同步状态:
备库执行升主操作:
查看状态发现主备此时都是生产状态,两个库都可以接受写入,其实就是脑裂的状态:
修改老主库的synchronous_standby_name参数,这里修改的意义是如果不进行修改那么主库写的东西还会向原来的备库同步,而此时已经无法同步,就会hang在那,所以我们要取消原来的同步关系。
这时在新主库执行写入操作:
原主库也执行写入操作,模拟时间线偏离:
接下来开始使用pg_rewind进行老主库重搭,变为备库角色。
停止老主库,一定要干净的关闭:
执行pg_rewind,注意新主库里面要配置pg_hba.conf选项。
发现报错,提示xlog目录下没有000000010000000000000010这个日志文件,因为我们设置了归档,而且wal_keep_segments没有设置,所以在数据库关闭时,wal日志归档到了归档目录,此时我们将归档目录的该日志拷贝过来,再次执行:
原主库配置recovery.conf
启动原主库,并查看数据,发现原主库插入的1已经没有,在新主库上插入的2已经同步过来,新的主备关系也正常了。
领取专属 10元无门槛券
私享最新 技术干货