Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
什么是脑裂?
脑裂(split-brain)现象是指两个节点失去联系后,各自独立成为主节点,争夺共享资源,导致系统混乱和数据损坏。这种现象在有状态服务(如MySQL)的HA中尤其需要避免。
脑裂产生的原因:
1.心跳线路坏了
2.高可用服务器之间的心跳链路坏掉,导致无法正常的通信
3.防火墙的错误,阻碍了信息传输
4.配置错误,心跳网卡配置错误或者是比较级等
5.keepalived的配置参数不同,比如节点id参数
6.ip配置及冲突,DNS解析等问题
7.iptables规则问题
常见的解决方案:
当检测到脑裂的时候,强行关闭一个心跳节点,相当于备节点接受不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源。
增加冗余心跳线,使用多条心跳线路,减少脑裂发生的几率。
设置仲裁机制,通过检测外部参考点(网关IP)去判断节点是否应该放弃资源争夺。
自定义脚本
建议编写自定义脚本来处理脑裂问题。脚本可以周期性地ping网关,并在连续失败达到一定次数时停止Keepalived服务。如果网关恢复通信,则重新启动Keepalived服务。这样的脚本可以加入到crontab中,实现自动化监控和处理。
解决keepalived的脑裂问题的脚本
vim check.sh
#!/bin/bash
LB01_VIP=192.168.13.100
LB01_IP=192.168.13.22
LB02_IP=192.168.13.23
while true
do
ping -c 2 - W 3 $LB01_VIP &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$LB01_VIP"|wc -l` -eq 1 ];then
echo "is brain"
else
echo "is ok"
fi
sleep 5
done
通过以上的处理,可以有效的解决keepalived的脑裂问题,保证系统的高可用性何数据的一致性。可以看作者上期的对于高可用整理的脚本,进行参考。