1 什么是脑裂

在高可用集群中,节点间无法互相检测到对方心跳而各自启动故障转移功能,分裂成独立的节点,节点之间彼此都认为对方出现了故障,从而争抢”共享资源”、争起”应用服务”。进而导致严重后果:

  • 共享资源被瓜分、两边”服务”都起不来了;
  • 两边”服务”都起来了,但同时读写”共享存储”,导致数据损坏。

服务器“脑裂”容易引起服务器集群逻辑关系混乱,导致主、备服务器误认为对方宕机而同时接管对方的业务,同时占用共享的文件系统,造成数据库争抢资源,引起数据库表文件的损坏,从而导致数据库服务的中断,对外业务暂停。

2 导致裂脑发生的原因

(1)高可用服务器之间心跳线路故障,导致无法正常的通信:
(2)心跳线本身就坏了(包括断了,老化);
(3) 网卡以及相关驱动坏了,IP配置及冲突问题;
(4)心跳线间连接的设备故障(交换机的故障或者是网卡的故障);
(5)仲裁的服务器出现问题;
(6)防火墙阻挡了心跳消息的传输;
(7)心跳网卡地址等信息配置的不正确,导致发送心跳失败;
(8)其他服务配置不当等原因,如心跳方式不同,心跳广播冲突、软件Bug等;
(9)keepalived配置文件中主备的virtual_router_id不一致也会导致裂脑问题发生;

3 如何预防HA集群脑裂

(1)同时使用串行电缆和以太网电缆连接,添加冗余的心跳线,尽量减少“脑裂”发生机会。
(2)启用磁盘锁,正在服务一方锁住共享磁盘,“裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动"解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。
(3)设置仲裁机制:例如设置参考的IP,当心跳完全断开的时候,2个节点各自都ping一下参考的IP,不同则表明断点就出现在本段,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。通过第三方软件仲裁谁该获得资源。
(4)fence机制,当检测到裂脑时强行关闭一个心跳节点(需要Stonith、fence)
(5)仲裁机制+fence机制:Pacemaker+Corosync+合适的资源Agent
(6)对裂脑的监控报警,报警报在服务器接管之前,给人员处理留足够时间。例如:1分钟内报警,但是服务器此时没有接管,而是5分钟再进行接管;或者报警后不直接自动服务器接管,而是由人为人员控制接管

3 如何预防HA集群脑裂

(1)同时使用串行电缆和以太网电缆连接,添加冗余的心跳线,尽量减少“脑裂”发生机会。
(2)启用磁盘锁,正在服务一方锁住共享磁盘,“裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动"解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。
(3)设置仲裁机制:例如设置参考的IP,当心跳完全断开的时候,2个节点各自都ping一下参考的IP,不同则表明断点就出现在本段,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。通过第三方软件仲裁谁该获得资源。
(4)fence机制,当检测到裂脑时强行关闭一个心跳节点(需要Stonith、fence)
(5)仲裁机制+fence机制:Pacemaker+Corosync+合适的资源Agent
(6)对裂脑的监控报警,报警报在服务器接管之前,给人员处理留足够时间。例如:1分钟内报警,但是服务器此时没有接管,而是5分钟再进行接管;或者报警后不直接自动服务器接管,而是由人为人员控制接管