Keepalived高可用服务器的裂脑问题

特别申明:内容出自《跟老男孩学Linux:Web集群实战》

文章目录

  • 什么是裂脑
  • 导致裂脑发生的原因
  • 解决裂脑的常见方案
  • 解决Keepalived裂脑的常见方案
  • 开发监测Keepalived裂脑的脚本
  • 参考文献

什么是裂脑

  由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为裂脑。

导致裂脑发生的原因

  一般来说,裂脑的发生,有以下几种原因:

  • 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
  • 心跳线坏了(包括断了,老化)。
  • 网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)。
  • 心跳线间连接的设备故障(网卡及交换机)。
  • 仲裁的机器出问题(采用仲裁的方案)。
  • 高可用服务器上开启了iptables防火墙阻挡了心跳消息传输。
  • 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
  • 其他服务配置不当等原因,如心跳方式不同,心跳广播冲突、软件Bug等。

提示:Keepalived配置里同一VRRP实例如果virtual_router_id两端参数配置不一致,也会导致裂脑问题发生。

解决裂脑的常见方案

  • 同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳消息。
  • 当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith、fence)。相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源。
  • 做好对裂脑的监控报警(如邮件及手机短信等或值班),在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短信就有上行和下行的区别。报警信息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器,让服务器根据指令自动处理相应故障,这样解决故障的时间更短。

  当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务,这个损失是可容忍的。

解决Keepalived裂脑的常见方案

  作为互联网应用服务器的高可用,特别是前端Web负载均衡器的高可用,裂脑的问题对普通业务的影响是可以忍受的,如果是数据库或者存储的业务,一般出现裂脑问题就非常严重了。因此,可以通过增加冗余心跳线路来避免裂脑问题的发生,同时加强对系统的监控,以便裂脑发生时人为快速介入解决问题。

  • 如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决。
  • 可以拉一条以太网网线或者串口线作为主备节点心跳线路的冗余。
  • 开发监测程序通过监控软件(例如Nagios)监测裂脑。

  下面是生产场景检测裂脑故障的一些思路:

  1)简单判断的思想:只要备节点出现VIP就报警,这个报警有两种情况,一是主机宕机了备机接管了;二是主机没宕,裂脑了。不管属于哪个情况,都进行报警,然后由人工查看判断及解决。

  2)比较严谨的判断:备节点出现对应VIP,并且主节点及对应服务(如果能远程连接主节点看是否有VIP就更好了)还活着,就说明发生裂脑了。

开发监测Keepalived裂脑的脚本

1)在lb02备节点开发脚本并执行。

[root@lb02 ~]# cat /server/script/check_split_brain.sh

#! /bin/bash
lb01_vip=192.168.55.12
lb01_ip=192.168.55.7
while true
do
	ping -c 2 -W 3 ${lb01_ip} &> /dev/null
	if [ $? -eq 0 -a `ip addr|grep "${lb01_vip}"|wc -l` -eq 1 ] ;then
		echo "have is split brain.warning."
	else
		echo "have is ok"
	fi
	sleep 5
done
[root@lb02 ~]# sh /server/script/check_split_brain.sh
have is ok

正常情况下,主节点活着,VIP 192.168.55.12在主节点,因此不会报警,提示"have is ok"。

2)停止Keepalived服务看lb02脚本执行情况。
lb01上:

[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ip add | grep 192.168.55.12

在lb02上观察即可,此前脚本已经执行。

[root@lb02 ~]# sh /server/script/check_split_brain.sh
have is ok
have is split brain.warning.

3)关掉lb01服务器,然后再观察lb02脚本的输出。

[root@lb02 ~]# sh /server/script/check_split_brain.sh
have is ok
have is split brain.warning.
have is split brain.warning.

lb01服务器,Keepalived服务恢复后,再观察lb02脚本的输出

[root@lb02 ~]# sh /server/script/check_split_brain.sh
have is ok
have is split brain.warning.
have is split brain.warning.
have is ok

裂脑报警恢复了。

4)可以将此脚本整合到Nagios或Zabbix监控服务里,进行监控报警。

参考文献

[1] 老男孩. 跟老男孩学Linux:Web集群实战[M]. 机械工业出版社,2016-03-01。

你可能感兴趣的:(Linux)