keepalived脑裂及解决办法
1.1、keepalived脑裂
-
当两台高可用服务器在指定的时间内,无法互相检测到对方心跳,而各自启动故障转移功能,取得了资源以及服务的所有权;而此时的两台高可用服务器对都还活着并作正常运行,这样就会导致同一个服务在两端同时启动而发生冲突的严重问题,最严重的就是两台主机同时占用一个VIP的地址(类似双端导入概念),当用户写入数据的时候可能会分别写入到两端,这样可能会导致服务器两端的数据不一致或造成数据的丢失,这种情况就称为脑裂,也有的人称之为分区集群或者大脑垂直分隔。
-
发生脑裂的情况,会直接导致两台机器互相竞争同一个VIP资源,就如同我们局域网内常见的IP地址冲突一样,结果就是两台机器会有一台或者两台都不正常,影响用户正常访问服务器。如果是应用是数据库或者是存储服务这种极重要的高可用上,那就导致用户发布的数据间断的写在两台服务器上的恶果,最终数据恢复及困难或者是难已恢复
1.2、脑裂的原因
-
高可用服务器对之间心跳检测链路发生故障,导致无法正常通信。如心跳线坏了(包括断了,老化)。 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
-
因心跳线间连接的设备故障(网卡及交换机)。
-
因仲裁的机器出问题(采用仲裁的方案)。
-
高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
-
高可用服务器对上的心跳网卡地址等信息配置的不正确,导致发送心跳失败;
-
Keepalived配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致脑裂问题发生。
-
vrrp实例名字不一致、优先级一致也会出现脑裂的现象
-
其他服务配置不当等原因,如心跳的方式不同,心跳广播冲突,软件出现了BUG等。
-
局域网内瞬时网络波动
1.3、脑裂的应对策略
-
添加冗余的心跳线,例如:双线条线(心跳线也HA)。同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳消息,尽量减少“脑裂”发生几率
-
启用磁盘锁。正在服务一方锁住共享磁盘,当“脑裂”发生时,让对方完全“抢不走”共享磁盘的资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
-
做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短信就有上行和下行的区别。报警消息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.让服务器根据指令自动处理相应故障,这样解决故障的时间更短.
-
设置仲裁机制。
-
增加一个仲裁机制。例如设置参考的IP,当心跳完全断开的时候,2个节点各自都ping一下参考的IP,不t通则表明断点就出现在本段,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。
-
通过第三方软件仲裁谁该获得资源,这个在阿里有类似的软件应用
-
-
利用脚本检测、报警。