作者:刘世泽
中国PostgreSQL分会志愿者 高级内核开发工程师
目录


引入时间线能够确保数据库做恢复时不会导致覆盖掉原有的wal日志。PG的wal日志文件的命名中的前8个字节用来标识timeline,比如000000010000000000000002代表timeline1的第二段日志。
另外每次新启timeline都会生成一个timeline.history文件(如下图)。该文件中会记录每个timeline起始时的wal地址,以及timeline切换的说明,在选择基于时间线的恢复时,可以指定恢复到的时间线。

2.集群切换的判断指标和主备监控程序的协同机制
在PG流复制集群高可用的管理中,failover是其基本功能。Failover判断依据的严格性将同时影响高可用的切换效率和造成脑裂的潜在风险,完善的切换判断条件可以尽可能避免误切换造成的脑裂。
备库端的监控程序在判断切换的指标中应当包含下列维度,只有全部维度的检查条件都满足才可以进行备->主的切换操作。

在主库端,针对主库状态的监控程序需要在重连尝试失败并判定可能满足备库切换条件时,在主库节点上第一时间进行vip的解除操作,并可同时强制执行停库操作,确保此时主库处于停库状态。
若主库端主机发生了断电后的重启,高可用管理模块需要在数据库启动前的检查中首先实施解除vip操作,保证启动时不承接业务数据,并同时应当检查当前集群状态,若已经有其他主节点,则不应直接以主库状态启动,而应实施pg_rewind操作重归集群(详见第五章节)。
上述备库的切换检查和主库端的协同检查机制相互配合有利于避免由于主备切换期间造成的脑裂现象。
3.Virtual IP的使用与管理
集群中Virtual IP应当始终只挂载在主节点上,对vip管理的严格性与否同样会影响脑裂可能性。主备切换过程中vip的挂载/卸载容易造成同一vip同时挂载在两台主机上。为避免这种情况,集群高可用对vip的管理可以考虑如下逻辑。
Vip的挂载检查
在备机进行promote操作时,通常需要伴随vip的挂载操作,此时可以在挂载前检查该vip的连通性,如果仍然有连接,说明vip此时并未被前任主库所在节点卸载,应当避免备库立即进行promote行为和vip的挂载操作,此种情形下可在等待超时后进行跨节点解除vip操作。
Vip的卸载
在原主库节点上,高可用监控程序可在如下时机进行vip的卸载操作
1. 监测到主库失联,满足切换条件时
2. 在节点重启,实施开机自启动检查时
但在极端情况下,vip的卸载工作无法自动完成,比如针对原主节点的高可用监控程序失效、异常退出时,此时需要依赖于竞选成功的备节点进行跨节点卸载vip操作。
4.Witness 节点的使用
witness节点是处理集群主库和备库之间可能存在网络拥塞、延迟、路由等问题影响,导致主库还在正常工作,而备库无法联系主库的场景。
通过设置witness节点可以针对主库与备库之间切换的检查完整性,即辅助备节点监控程序实施主节点网络可见性检查,避免因网络问题导致的脑裂现象。
在此场景下,若备库端高可用监控简单依据与主库的失联即实施切换操作,显然不合理,极容易导致脑裂现象。可行的方案是在集群中设置witness节点作为辅助观察点,在备库观察到与主库失联时,可同时查看witness节点的可见性,若witness可见则实施切换。


5.数据库启动控制检查逻辑
形成脑裂的主要因素除了误切换,主要就是在启动数据库时的误操作。
当主库停库或者断电之后进行数据库重启的操作时,需要根据当前集群其他节点的状态决定采取什么样的启动操作。比如当集群中已经有新promote的主节点时,原主节点的数据库不可直接采取强制启动操作(使用pg_ctl),而应执行一系列检查逻辑。否则极容易在人工启动数据库或者系统自启动时形成脑裂。针对此点,高可用可以提供封装好的数据库节点启动接口。下面是一套可行的节点启动逻辑,可以帮助数据库维护人员在节点维护时实施傻瓜式节点启动操作,也可以作为操作系统开机启动数据库的启动服务脚本运行,通过这种封装后的命令作为统一的启动接口,可以有效避免启库瞬间造成的脑裂状态。

6.脑裂的实时探测与自动修正
对于PG的集群高可用监控程序,可以在实时监控进程中增加对集群中所有节点的定期角色状态检查,一旦发生双主节点这种角色互斥问题,可以实施报警提示人工处理或直接由监控程序自我修复。这种探测机制无法完全保证在脑裂发生的第一时间即探测到,因脑裂发生的部分案例是由于各节点之间的网络互通问题,在网络恢复之前,相互失联的各节点之间无法探知对方状态。但仍然可在无人值守的系统中,尽可能早的警示脑裂,并尽早处理。
对于监控程序探测到脑裂的自动修正,其基本逻辑类似于1.2节中提到的人工修复脑裂状态,即将脑裂的判断与处理步骤自动化,省去人工检查和判断。但需要注意的是这种恢复行为由于是从两条PG时间线中挑选一条恢复,舍弃的时间线上的部分数据将被忽视。


总结
本文主要探讨了PG流复制集群脑裂问题的影响因素以及避免脑裂的手段,最后也针对脑裂的自动探测和恢复提出了个人的见解,上述各章节中讨论的手段需要有机配才能合达成预防、探测、积极处理,以期能完善PG集群高可用对脑裂这一棘手问题的处理。

I Love PG
关于我们
中国开源软件推进联盟PostgreSQL分会(简称:PG分会)于2017年成立,由国内多家PG生态企业所共同发起,业务上接受工信部产业发展研究院指导。PG分会致力于构建PG产业生态,推动PG产学研用发展,是国内一家PG行业协会组织。
技术文章精彩回顾 PostgreSQL学习的九层宝塔 PostgreSQL职业发展与学习攻略 搞懂PostgreSQL数据库透明数据加密之加密算法介绍 一文读懂PostgreSQL-12分区表 PostgreSQL源码学习之:RegularLock Postgresql源码学习之词法和语法分析 PostgreSQL buffer管理 最佳实践—PG数据库系统表空间重建 PostgreSQL V12中的流复制配置 2019,年度数据库舍 PostgreSQL 其谁? PostgreSQL使用分片(sharding)实现水平可扩展性 一文搞懂PostgreSQL物化视图 PostgreSQL原理解析之:PostgreSQL备机是否做checkpoint PostgreSQL复制技术概述 Postgres是最好的开源软件 PostgreSQL是世界上最好的数据库 从Oracle迁移到PostgreSQL的十大理由 PG活动精彩回顾 见证精彩|PostgresConf.CN2019大会盛大开幕 PostgresConf.CN2019大会DAY2|三大分论坛,精彩不断 PostgresConf.CN2019培训日|爆满!Training Day现场速递! 「PCC-Training Day」培训日Day2圆满结束,PCC2019完美收官 创建PG全球生态!PostgresConf.CN2019大会盛大召开 首站起航!2019“让PG‘象’前行”上海站成功举行 走进蓉城丨2019“让PG‘象’前行”成都站成功举行 中国PG象牙塔计划发布,首批合作高校授牌仪式在天津举行 PostgreSQL实训基地落户沈阳航空航天大学和渤海大学,高校数据库课改正当时 群英论道聚北京,共话PostgreSQL 相聚巴厘岛| PG Conf.Asia 2019 DAY0、DAY1简报 相知巴厘岛| PG Conf.Asia 2019 DAY2简报 相惜巴厘岛| PG Conf.Asia 2019 DAY3简报 独家|硅谷Postgres大会简报 全球规模最大的PostgreSQL会议等你来! PostgreSQL线上沙龙第一期精彩回顾 PostgreSQL线上沙龙第二期精彩回顾 PostgreSQL线上沙龙第三期精彩回顾 PostgreSQL线上沙龙第四期精彩回顾 PostgreSQL线上沙龙第五期精彩回顾 PG培训认证精彩回顾 关于中国PostgreSQL培训认证,你想知道的都在这里! 首批中国PGCA培训圆满结束,首批认证考试将于10月18日和20日举行! 中国首批PGCA认证考试圆满结束,203位考生成功获得认证! 中国第二批PGCA认证考试圆满结束,115位考生喜获认证! 请查收:中国首批PGCA证书! 重要通知:三方共建,中国PostgreSQL认证权威升级! 一场考试迎新年 | 12月28日,首次PGCE中级认证考试开考! 近500人参与!首次PGCE中级、第三批次PGCA初级认证考试落幕! 通知:PostgreSQL技术能力电子证书上线!





