keepalived:故障检测自动修复脚本

小提示


下面的内容灵活性极高,可随意扩展:

  1. 脚本可通过 keepalived.conf 实现检测,也可以通过 crontab 实现;
  2. 探测 nginx 服务是否异常,除了通过查看进程数量,也可以通过发送 request 请求,看是否能收到相应来判断,而且准确率也更高点;
  3. 探测到服务异常,可以直接自动修复,也可以发送告警,人工介入处理;
    … …
    脚本内容可根据实际场景,随意调整。

一、nginx 挂了,keepalived 存活


  • 现象:VIP 不会漂移,服务不可用
  • 解决方案:
    step1 尝试恢复 nginx
    step2 如果恢复 nginx 失败,stop keepalived,使得VIP漂移
    step3 通过 zabbix 发送告警,人工介入修复 master
  • 参考范例(作用于 BACKUP 和 MASTER)
vim /server/scripts/check_web.sh

#!/bin/bash
nginxpid=$(ps -C nginx --no-header|wc -l)
#1.判断 Nginx 是否存活,如果不存活则尝试启动 Nginx
if [ $nginxpid -eq 0 ];then
    systemctl restart nginx
    sleep 3
    #2.等待 3 秒后再次获取一次 Nginx 状态
    nginxpid=$(ps -C nginx --no-header|wc -l)
    #3.再次进行判断, 如 Nginx 还不存活则停止 Keepalived,让地址进行漂移,并退出脚本
    if [ $nginxpid -eq 0 ];then
        systemctl stop keepalived
    fi
fi
global_defs {
	router_id lb02
}

# 1. 定义web检测脚本
vrrp_script check_web {
    script "/server/scripts/check_web.sh"
    interval 5
    weight 50
}

vrrp_instance VI_1 {
	state BACKUP 
	interface eth0
	virtual_router_id 50	
	priority 100
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 1111
	}

	virtual_ipaddress {
		10.0.0.3
	}
}

vrrp_instance VI_2 {
	state MASTER 
	interface eth1
	virtual_router_id 55	
	priority 150
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 2222
	}

	virtual_ipaddress {
		172.16.1.4
	}

    # 2. 调用并运行该web检测脚本
    track_script {
        check_web
	    check_brain
    }
}

二、nginx 存活,keepalived 挂了


  • 现象:VIP 漂移,服务看 BACKUP 是否可用
  • 解决方案:restart keepalived
  • 参考范例(作用于 MASTER 或 BACKUP):
vim /server/scripts/check_web.sh

#!/bin/bash
keepalivedpid=$(ps -C keepalived --no-header|wc -l)
#1.判断 keepalived 是否存活,如果不存活则尝试启动 keepalived
if [ $keepalivedpid-eq 0 ];then
    systemctl restart keepalived
    sleep 3
    #2.等待 3 秒后再次获取一次 keepalived 状态
    keepalivedpid=$(ps -C keepalived--no-header|wc -l)
    #3.再次进行判断, 如 Nginx 还不存活则停止 Keepalived,让地址进行漂移,并退出脚本,同时发送告警,人工介入处理
    if [ $keepalivedpid-eq 0 ];then
        systemctl stop keepalived
    fi
fi

三、心跳检测异常,nginx 和 keepalived 存活


  • 现象:VIP 不会漂移,可能发生裂脑
  • 解决方案:
    step1 如果 master 还能 ping 通,并且 backup 有 VIP,就认为是列脑了
    step2 kill keepalived 或者 通过 zabbix 发送告警,人工介入
  • 参考范例(作用于 BACKUP):
#!/bin/bash

lb01_vip=10.0.0.3
lb01_ip=10.0.0.5

while true;do
    ping -c 2 -W 3 ${lb01_ip} &>/dev/null
    if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ];then
        echo "ha is split brain.warning."
        # 此处也可替换为相应的措施,比如 kill BACKUP 的 keepalived 等,稳妥起见,还是告警后人工介入的好。
    else
        echo "ha is ok"        
    fi
    sleep 5
done

脚本写完,扔到 zabbix 上进行监控即可!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值