首页 > 代码库 > 裂脑发生原因及常见防范手段

裂脑发生原因及常见防范手段

由于两台高可用服务器对之间在指定时间内,无法互相检测到对方心跳而各自启动故障转移功能,取得了资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时启动而发生冲突的严重问题,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这样可能会导致服务器两端的数据不一致或造成数据丢失,这种情况被称为裂脑,也有的人称其为分区集群或大脑垂直分割,英文为split brain

导致裂脑发生的多种原因

  1. 高可用服务器对之间心跳线链路故障,导致无法正常通信

  2. 心跳线坏了(包括断了,老化)

  3. 网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)

  4. 心跳线间连接的设备故障(网卡及交换机)

  5. 仲裁的机器出问题

  6. 高可用服务器上开启了防火墙阻挡了心跳消息传输

  7. 高可用服务器对上心跳网卡地址等信息配置不正确,导致发送心跳失败

  8. 其它服务配置不当等原因,如心跳方式不同,心跳广播冲突,软件BUG等

防止裂脑的方法

  1. 同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳消息(网卡设备和网线设备)

  2. 检测到裂脑时强行关闭一个心跳节点.(该功能需要设备支持,如stonith,fence).相当于程序上备节点发现心跳线故障,发送关机命令到主节点

  3. 做好对裂脑的监控报警(如邮件及手机短信等),在问题发生时人为第一时间介入仲裁,降低损失,当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失.对于一般的网站业务,这个损失是可控的.

  4. 启用磁盘锁.正在服务一方锁住共享磁盘,裂脑发生时,让对方完全抢不走共享磁盘资源.但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动解锁,另一方就永远得不到共享磁盘.现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令.后备节点也就接管不了共享资源和应用服务.于是有人在HA中设计了智能锁.即,正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁.平时不上锁

  5. 在服务器接管之前报警,给人员处理留足时间.如1分钟内报警,但服务器此时没有接管,而是5分钟接管.接管的时间较长,数据不会丢,导致用户无法写数据.

  6. 报警后,不直接自动服务器接管,而是由人为人员控制接管,缺点同上,但

  7. 增加仲裁机制,确定谁该获得资源.有以下几个参考思路:

    a.加一个仲裁机制.例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端,不仅心跳线,还有对外服务的本地网络链路断了,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务.ping不通IP的一方可以自我重启,以彻底释放有可能还占用着的那些共享资源(heartbeat也有此功能)

裂脑发生原因及常见防范手段