脑裂:master节点和slave节点都去争抢vip,在master和slave上执行ip addr 都能看到vip
vrrp协议:即心跳广播,当master活着的时候会不断向slave发送vrrp协议,slave就不会去争抢vip,当slave收不到vrrp协议的时候就认为master挂了,会主动把vip地址接过来并继续为用户提供服务。
脑裂原因:
1、iptables阻止了master发送的vrrp协议广播,导致slave收不到master的心跳信息。
2、物理心跳线老化、断了。
3、高可用服务器心跳网卡地址等信息配置错误,导致发送心跳广播失败。
4、其他服务配置不当的原因,如心跳方式不同,心跳广播冲突,软件bug等
5、配置文件中virtual_router_id两端参数配置不一致,也会导致脑裂问题。
解决方案:
1、关闭iptables或配置iptables允许vrrp协议
2、检查心跳线是否老化不通
3、检查virtual_router_id等其他配置是否有问题。
4、重启keeplived服务,并观察/var/log/messages
5、通过tcpdump抓包观察:tcpdump -i eth0:1 vrrp -n
6、https://www.jianshu.com/p/35941504a2e8
7、再加一条心跳线网线,并配增加主机备机的网卡能相互ping通就行(不要和vip在同一网段)
下面是生产场景中检测裂脑故障的一些思路:
(1)简单判断的思想:只要备节点出现VIP就报警,这个报警可以有两种情况,一是主机宕机了备机接管了;二是主机没宕,裂脑了,不管哪种情况,都进行报警,然后由人工查看判断及解决。把主节点恢复并继续监控从节点。
把脚本放在备机的crontab中,并配合zabbix进行监控# cat check_keepalive.sh
#!/bin/bashVIP=192.168.22.12
#LB01_IP=192.168.22.128
#LB02_IP=192.168.22.130while true
do# 如果能ping通本机的vip并且本机的vip确实存在,说明vip已经漂移到备机上,这时就可以结合zabbix报警了ping -c 2 -w 3 $VIP &> /dev/nullif [[ $? -eq 0 && `ip add |grep "$VIP"|wc -l` -eq 1 ]]thenecho "have is brain"elseecho "is ok"fisleep 1
done
(2)比较严谨的判断:备节点出现对应的VIP,并且主节点的keepalive服务还活着,就说明发生裂脑了。
把脚本放在备机的crontab中,并配合zabbix进行监控
主备机要ssh-key打通
# cat check_keepalive2.sh
#!/bin/bashVIP=192.168.22.12
#LB01_IP=192.168.22.128
#LB02_IP=192.168.22.130while true
do# 判断备节点的vip存在,并且主节点的keepalive服务正常运行,说明出现脑裂if [[ `ip add |grep "$VIP"|wc -l` -eq 1 && `ssh root@192.168.22.128 '/bin/ps -ef |grep "keepalive" | grep -v "grep" | wc -l'` -ne 0 ]]thenecho "have is brain"elseecho "is ok"fisleep 1
done
(3) 当主机宕机后keepalive会进行故障切换,如果是web挂了比如nginx,keepalive是无法切换的,所以还需要写一个监控nginx的脚本,当主节点的nginx挂掉后,就把keepalive关掉,同时进行报警
cat /server/scripts/check_nginx_by_keep.sh
#!/bin/sh
while true
doif [[ `netstat -lntup|grep nginx|grep -v "grep" |wc -l` -eq 0 ]];then/etc/init.d/keepalived stopfisleep 5
done