防止脑裂需构建多层判断机制:网络连通性+服务可用性+仲裁确认;必须结合keepalived的vrrp协议、独立心跳通道及qdevice等外部仲裁,辅以应用层健康检查与物理隔离。

主备切换中防止脑裂,核心不是只靠“心跳脚本”,而是构建多层判断机制:网络连通性 + 服务可用性 + 仲裁确认。单纯一个 ping 或 curl 脚本无法规避脑裂,必须配合 Keepalived 的 VRRP 协议约束、独立心跳通道和外部仲裁(如 qdevice 或第三方监控)才能真正可靠。
用 Keepalived 做基础 VRRP 心跳
VRRP 本身已是标准化心跳协议,主备通过组播/单播交换通告报文,无需额外写“ping 脚本”替代它:
- 确保 virtual_router_id 在主备配置中完全一致(如 51),否则视为不同组,互不感知
- 主节点设 state MASTER、priority 150;备节点设 state BACKUP、priority 100
- 启用 authentication(auth_type PASS + auth_pass),防非法节点冒充
- 防火墙放行 VRRP 协议:
firewall-cmd --add-protocol=vrrp --permanent && firewall-cmd --reload
加应用层健康检查脚本(防“假活”)
Keepalived 默认只检测进程或端口存活,Nginx 进程在但 502 大量返回时不会切换。需主动探测业务健康:
- 写检测脚本
/etc/keepalived/nginx_check.sh:
#!/bin/bash # 检查 Nginx 是否能返回 200 且响应时间
- 在
keepalived.conf中定义:
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -30 # 失败一次,优先级降 30,低于备机即触发切换
fall 2 # 连续失败 2 次才判定异常
rise 2 # 连续成功 2 次才恢复权重
}- 在
vrrp_instance块中引用:track_script { chk_nginx }
防脑裂:必须引入仲裁或隔离机制
两节点集群天然易脑裂。仅靠心跳线或脚本无法解决“双方都收不到对方包”的对称故障:
- 推荐启用 qdevice(如 qnetd 仲裁服务器):它作为第三方投票节点,打破双节点平票局面
- 若无第三方服务器,至少配置
two_node: 1+auto_tie_breaker: 1(Corosync/Pacemaker 场景),但可靠性仍弱于 qdevice - 物理层面:使用独立网卡+直连网线跑心跳(如
ens224),与业务网络(ens160)彻底隔离,避免交换机故障引发误判 - 禁用非必要干扰:关闭主备间可能干扰 VRRP 的 iptables 规则(特别是 DROP vrrp)、禁用 NetworkManager 对 VIP 网卡的接管
辅助监控脚本(用于告警,不用于决策)
这类脚本不参与切换逻辑,只做事后发现与人工干预提示:
- 在备机上定时检查是否意外持有 VIP:
#!/bin/bash
VIP="192.168.1.100"
if ip a | grep -q "$VIP"; then
echo "ALERT: Backup node holds VIP — possible split-brain or failover occurred" | logger -t keepalived-monitor
# 可在此调用短信/钉钉接口告警
fi- 部署到 cron 每 30 秒执行一次,配合 Zabbix 或 Prometheus 报警更佳










