keepalived 脑裂解决思路

(主从模式)脑裂问题

上述主从配置方式存在脑裂的可能,即两个节点实际都处于正常工作状态,但是无法接收到彼此的组播通知,这时两个节点均强行绑定虚拟IP,导致不可预料的后果。

这时就需要设置仲裁,即每个节点必须判断自身的状态(应用服务状态及自身网络状态),要实现这两点可使用自定义shell脚本实现,

通过周期性地检查自身应用服务状态,并不断ping网关(或其它可靠的参考IP)均可。当自身服务异常、或无法ping通网关,则认为自身出现故障,

就应该移除掉虚拟IP(停止keepalived服务即可)。主要借助keepalived提供的vrrp_script及track_script实现:

在keepalived的配置文件vrrp_instance VI_1 上面另起一段,加入以下代码,定义一个跟踪脚本:

vrrp_script check_nginx { #定义一个名称为check_nginx的检查脚本

script “/etc/keepalived/check_nginx.sh” #shell脚本的路径

interval 5 #运行间隔

}

再在vrrp_instance配置中最下面加入以下代码使用上面定义的检测脚本:

track_script {

check_local

}

我们在/etc/keepalived/check_nginx.sh 定义的检测规则可以是:

 

a.某一服务或者其他事件触发。可以用脚本监听服务端口 服务 进程 等

b.服务器宕机

c.监听网卡故障

但这里有个小问题,如果本机或是网关偶尔出现一次故障,那么我们不能认为是服务故障。

更好的做法是如果连续N次检测本机服务不正常或连接N次无法ping通网关,才认为是故障产生,才需要进行故障转移。

另一方面,如果脚本检测到故障产生,并停止掉了keepalived服务,那么当故障恢复后,keepalived是无法自动恢复的。

我觉得利用独立的脚本以秒级的间隔检查自身服务及网关连接性,再根据故障情况控制keepalived的运行或是停止。

下面是检测NGINX 的脚本

#!/bin/bash

if [ “$(ps -ef | grep “nginx: master process”| grep -v grep )” == “” ]

then

/usr/local/nginx/sbin/nginx &> /dev/null

sleep 2

if [ “$(ps -ef | grep “nginx: master process”| grep -v grep )” == “” ]

then

systemctl stop keepalived

fi

fi

或者

#!/bin/bash

run=$(ps -C nginx –no-heading|wc -l)

if [$run -eq 0 ]; then

/usr/local/bin/nginx &> /dev/null

sleep 2

if [ $run -eq 0 ]; then

systemctl stop keepalived

fi

fi

本文版权归 汾西富格 作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接 如有问题, 可发送邮件咨询,转贴请注明出处:https://www.fxkjnj.com/2347/

发表评论

登录后才能评论