在高可用系统中,当联系两个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成两个独立的个体。由于相互失去了联系,都以为是对方出现了故障,抢夺资源,服务都起不来。
对策:
- 添加冗余的心跳线。
- 启用磁盘锁(正在使用服务一方锁住共享资源)
- 设置仲裁机制(设置参考ip,去ping,不通释放共享资源)
PG的脑裂处理
通常造成脑裂现象的原因一是主备之间网络问题导致备库误认为主库故障,切换后造成两主;另一大原因是误操作导致,比如主备切换之后,人为直接用pg_ctl将原主节点拉起,或系统自启动时直接调用pg_ctl启动数据库。
操作: 确认好脑裂节点各自时间线之后,即可确定pg_rewind
的方向,即从低timeline节点向高timeline节点执行rewind
引入时间线:
在加入了时间线 timeline之后,恢复操作会新启一条timeline,在新的timeline上的日志不会覆盖其他timeline日志
引入时间线能够确保数据库做恢复时不会导致覆盖掉原有的wal日志**。PG的wal日志文件的命名中的前8个字节用来标识timeline,比如000000010000000000000002代表timeline1的第二段日志。
另外每次新启timeline都会生成一个timeline.history文件(如下图)。该文件中会记录每个timeline起始时的wal地址,以及timeline切换的说明,在选择基于时间线的恢复时,可以指定恢复到的时间线。