脑裂是指双机热备中主备节点因心跳中断同时抢占VIP导致服务混乱;可通过检查VIP绑定、抓包验心跳、查日志升主记录及客户端分流现象交叉验证。

Keepalived脑裂(Split-Brain)是指在双机热备场景中,主备节点因心跳通信中断,各自认为对方故障而同时抢占VIP,导致服务响应混乱、数据不一致甚至业务中断。判定是否发生脑裂,关键看同一时刻是否有两个节点都持有VIP并对外提供服务;解决核心在于确保心跳可靠、决策唯一、资源抢占可收敛。
如何快速判定是否发生了脑裂
可通过以下方式交叉验证:
-
检查VIP绑定状态:在两台节点上分别执行
ip addr show | grep "inet.*virtual",若均显示同一VIP(如192.168.1.100/32),且状态为UP,即存在IP冲突,是脑裂最直接证据; -
抓包确认心跳是否真实中断:在备机上用
tcpdump -i eth0 host [主节点IP] and port 112(Keepalived默认VRRP组播端口为112),若长时间无VRRP报文,说明链路或防火墙阻断; -
查看Keepalived日志差异:主节点日志出现
Entering MASTER STATE,备节点也出现相同记录,且时间接近,说明两者几乎同时升主,极可能已脑裂; - 从客户端侧验证:用多台客户端持续ping VIP,再curl服务接口,若部分请求落到A节点、部分落到B节点,且后端响应不一致(如数据库写入不同),说明流量已被双节点分流。
常见脑裂成因与对应加固措施
脑裂不是Keepalived自身缺陷,而是底层环境异常触发的非预期行为。需逐层排查:
-
网络层面单点故障:如交换机宕机、网线松动、VLAN配置错误,导致VRRP组播报文无法互通。建议启用单播心跳(
vrrp_instance VI_1 { unicast_src_ip ...; unicast_peer { ... } }),绕过依赖组播的交换机; -
防火墙拦截VRRP协议:Linux iptables/nftables 或云平台安全组常默认丢弃非TCP/UDP流量。需放行协议号112(VRRP)或对应单播端口,命令示例:
iptables -A INPUT -p 112 -j ACCEPT; -
Keepalived进程假死或CPU过载:进程未退出但停止发送心跳。应配合监控(如Prometheus+node_exporter)采集
keepalived_process_status指标,并设置进程存活告警; -
权重配置不合理或优先级反转:例如备机优先级高于主机,或脚本检测逻辑错误导致降权失效。务必保证主机
priority严格高于备机,且notify脚本中避免阻塞操作。
主动防御:防止脑裂的实用配置策略
仅靠“发现再处理”风险太高,应在配置阶段嵌入防裂机制:
- 启用nopreempt(非抢占模式)+ 静态优先级:适用于主节点稳定性明显更高的场景。备机即使恢复也不会自动抢主,避免震荡;
- 增加多路径心跳检测:除主网卡外,额外配置一条独立链路(如直连网线、管理网口)运行第二组VRRP实例,任一路径通则不触发升主;
-
集成外部仲裁(Quorum)机制:通过脚本调用第三方服务(如Redis、etcd)判断集群健康态,仅当多数节点认可“对方宕机”时才允许升主,典型工具如
keepalived-check-quorum; - 强制资源互斥绑定:在VIP切换脚本(notify_master/notify_backup)中加入fence动作,例如卸载远端NFS、关闭对端MySQL实例(需谨慎授权),确保同一时刻仅一个节点能访问共享资源。
发生脑裂后的应急处置步骤
目标是快速止损、恢复单点服务,再查根因:
- 立即登录两台节点,手动执行
ip addr flush dev eth0清除冲突VIP(注意替换为实际网卡名),保留业务可用性最高的节点; - 检查Keepalived服务状态:
systemctl status keepalived,若异常则重启(systemctl restart keepalived),观察日志是否回归正常状态机流转; - 确认底层网络连通性:
ping、arping、telnet 主机IP 112(单播模式下)逐项验证; - 临时禁用自动切换:编辑配置,将备机
priority调低至低于主机至少50,重启服务,待问题定位后再恢复。
脑裂本质是分布式系统在分区容忍性(P)与一致性(C)之间的权衡结果。Keepalived本身不提供强一致性保障,必须结合网络架构、运维规范和辅助仲裁手段共同构建防线。配置不复杂,但细节决定成败。










