Keepalived高可用集群实战:VRRP协议配置与脑裂故障排查方案

Keepalived是服务器高可用集群的基础组件,基于VRRP协议实现VIP漂移。两台服务器配成主备,主机故障时备机秒级接管虚拟IP,业务不中断。配置本身不复杂,难的是脑裂问题的预防与排查,以及健康检查脚本的编写。

VRRP主备集群搭建:keepalived.conf核心配置详解

主备两台服务器安装keepalived后,配置文件在/etc/keepalived/keepalived.conf。主节点priority设为100,备节点设为90,其他部分相同。

# 主节点 /etc/keepalived/keepalived.conf
vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2      # 每2秒检测一次
    weight -30      # 检测失败权重减30,低于备节点触发切换
    fall 2          # 连续失败2次判定为故障
    rise 1          # 成功1次即恢复
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1            # VRRP通告间隔1秒
    authentication {
        auth_type PASS
        auth_pass MyPass123
    }
    virtual_ipaddress {
        192.168.10.100/24 dev eth0
    }
    track_script {
        chk_nginx
    }
}

备节点只改两处:state为BACKUP,priority为90。virtual_router_id两端必须一致,否则互不认识。priority差值要大于weight减值,否则脚本失败后权重反超不过备节点,切换不会发生。上面的配置里,主节点检测失败权重降到70,低于备节点的90,VIP漂移触发。

健康检查脚本编写:检测逻辑与切换阈值设置

健康检查脚本决定什么情况下触发切换,写得糙会导致误切换或者该切不切。以Nginx为例,检测进程存活加端口可用双重校验。

#!/bin/bash
# /etc/keepalived/check_nginx.sh
if ! pidof nginx > /dev/null; then
    exit 1
fi
if ! curl -s -o /dev/null -m 3 http://127.0.0.1:80/healthz; then
    # 尝试拉起一次,拉起失败才算故障
    systemctl restart nginx
    sleep 3
    curl -s -o /dev/null -m 3 http://127.0.0.1:80/healthz || exit 1
fi
exit 0

脚本里加了一次自愈动作,进程挂了先尝试重启,重启成功不切换,失败才退出非零。这能消化掉大量瞬时抖动,避免VIP来回漂移。脚本必须有可执行权限,路径不要带空格,Keepalived调用脚本的PATH很精简,命令尽量写绝对路径。

脑裂故障排查:双主现象定位与预防配置

脑裂指主备各自都认为自己是Master,VIP出现在两台机器上,流量被随机分发。常见原因有三种:防火墙拦截VRRP协议包、备节点收不到通告、组播网络配置问题。排查命令如下。

# 查看本机VRRP状态,两台都显示Master即脑裂
ip addr show eth0 | grep 192.168.10.100

# 抓VRRP报文,确认通告是否到达对端
tcpdump -i eth0 vrrp -nn

# 检查防火墙是否放行VRRP(协议号112)
firewall-cmd --list-protocols
firewall-cmd --add-protocol=vrrp --permanent
firewall-cmd --reload

多数脑裂是防火墙拦了协议号112的VRRP包。两台机器只隔一层交换机还出现脑裂,检查advert_int是否一致、virtual_router_id是否冲突,同网段有别的集群用了相同ID也会导致状态混乱。预防上,关键业务可以加仲裁机制,比如各自探测网关IP,探测不到网关的那台主动放弃VIP。

# 备节点加仲裁探测,网关不通则放弃VIP
vrrp_instance VI_1 {
    # 其余配置不变
    track_interface {
        eth0
    }
}
# 或用脚本检测网关,失败时主动执行:
# ip addr del 192.168.10.100/24 dev eth0

切换日志与验证:failover演练清单

上线前做三类演练:主机断电、杀Nginx进程、拔网线,每类验证VIP漂移时间和业务恢复时间。日志观察用journalctl -u keepalived,切换记录里能明确看到权重变化和状态迁移。漂移耗时取决于advert_int和fall阈值,本配置下典型切换时间3到6秒。业务侧连接池要有重连机制,TCP长连接不跟随VIP迁移,漂移后旧连接会失败,重连后落到新节点。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/keepalived-gao-ke-yong-ji-qun-shi-zhan-vrrp-xie-yi-pei-zhi/

(0)
小编小编
上一篇 1天前
下一篇 1天前

相关推荐