Keepalived实战排障:脑裂原因、服务监控与VIP自动切换

来自AI助手的总结
Keepalived需监控业务服务,防脑裂并实现故障自动漂移
Keepalived实战排障:脑裂原因、服务监控与VIP自动切换

一、Keepalived 真正的风险点在哪里

这里在完成基础高可用之后,马上引出了“问题”章节。
这说明 Keepalived 真正难的地方,不是把 VIP 漂起来,而是:

  • 出现异常时能不能及时切换
  • 切换逻辑会不会出错
  • 主备状态会不会判断失真

其中最典型的问题就是“脑裂”。

二、什么是脑裂

这里将脑裂的现象总结得很直接:

  • 主备两台机器上同时都有 VIP

这就意味着:

  • 原本应该只有一个对外入口
  • 现在变成了两个节点都认为自己是主

这种情况会直接带来流量混乱,甚至导致访问异常和业务不可预测。

三、脑裂通常是怎么发生的

这里列出几类常见原因:

  • 备节点误以为主节点已经挂了
  • 但实际上主节点并没有真正挂掉
  • 防火墙、SELinux、Keepalived 配置错误
  • 网络物理线路异常

从本质上讲,脑裂就是:

  • VRRP 心跳判断失真
  • 主备两边对“谁还活着”的认知不一致

四、脑裂通常怎么处理

这里可以看到两个思路。

第一种是偏保守的方式:

  • 做监控
  • 只要备节点上出现 VIP 就告警

第二种更激进:

  • 如果备节点已经认为主挂了
  • 那就通过联动手段让主真的退出服务

虽然第二种方式更强硬,但它背后的目的其实就是避免“双主并存”。

五、为什么默认 Keepalived 还不够

这里指出了一个很关键的现实问题:

  • Keepalived 默认只会在主机挂掉或网络断开时切换
  • 它默认不会关心某个业务服务本身是不是还活着

这意味着:

  • 如果主机还在
  • 但 Nginx 已经挂掉

Keepalived 仍可能继续把 VIP 保留在这个故障节点上。
对用户来说,这种状态和“高可用失效”几乎没有区别。

六、案例:让 Nginx 挂掉时自动触发 Keepalived 切换

目标非常清楚:

  • 当 Nginx 服务不在了
  • Keepalived 也跟着停止
  • 让 VIP 漂到备节点

核心思路分两步:

1、写脚本检查服务
2、在 Keepalived 中调用这个脚本

6.1 监控脚本怎么写

示例脚本如下:

#!/bin/bash
#author: ZQ
#desc: 监控 nginx 端口数量

port_cnt=$(ss -lntup | grep nginx | wc -l)

if [ $port_cnt -eq 0 ]; then
  systemctl stop keepalived
fi

这段脚本的逻辑非常直接:

  • 先检查 Nginx 端口或进程是否存在
  • 如果数量为 0
  • 就停止 Keepalived

一旦 Keepalived 停止,当前主节点就会放弃 VIP,备节点自然有机会接管。

6.2 别忘了给脚本执行权限

这里接着执行:

chmod +x check_ngx.sh

这是必须的,否则 Keepalived 虽然配置了脚本,也没法真正执行。

七、Keepalived 里如何接入监控脚本

这里通过 vrrp_scripttrack_script 把脚本真正挂进 Keepalived:

global_defs {
   router_id lb01
}

vrrp_script check_ngx {
    script /server/script/check_ngx.sh
    interval 2
    weight 1
    user root
}

vrrp_instance vip_3 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.3 dev eth0 label eth0:0
    }
    track_script {
        check_ngx
    }
}

这里最关键的两部分是:

  • vrrp_script:定义脚本本身
  • track_script:把脚本挂到某个 vrrp_instance

interval 2 则表示每隔 2 秒执行一次检查。

八、如何验证这个监控联动真的生效

验证方式是:

1、重启 Keepalived

systemctl restart keepalived.service

2、单独打开一个窗口看日志

tailf /var/log/messages

3、在主节点上关闭 Nginx

systemctl stop nginx

如果日志中能看到 Keepalived 随之退出,且 VIP 漂移到备节点,就说明脚本监控链路已经打通。

九、小结

Keepalived 在生产里最容易被忽略的一点是:
主机活着,不代表服务活着。

这里这部分的价值就在于把高可用从“机器级”推进到了“服务级”:

  • 先理解脑裂是什么
  • 再知道脑裂为什么会发生
  • 最后通过脚本监控业务服务,让 VIP 漂移更符合真实业务状态

对 Nginx、LB 这类服务来说,这种增强配置往往比单纯把 Keepalived 装起来更重要。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容