keepalived脑裂核心在于“提前防住+快速识别+可控收敛”:通过单播替代组播、健康脚本动态降权、网关ping仲裁三重防御,辅以vip绑定、vrrp抓包、客户端分流三重验证,实现可干预、有兜底的高可用。

Keepalived 解决双机热备中的 VIP 脑裂问题,核心不是“事后修复”,而是“提前防住 + 快速识别 + 可控收敛”。生产环境不能靠重启碰运气,必须建立可验证、可干预、有兜底的机制。
一、确认脑裂是否真实发生
别只看日志或告警,要交叉验证三件事:
-
VIP 绑定状态:在两台节点上同时执行
ip addr show | grep "inet.*192.168.x.x/32"(替换为你的 VIP),若都显示 UP 状态,就是铁证; -
VRRP 报文连通性:在备机上运行
tcpdump -i eth0 vrrp -n -c 10,持续 30 秒无任何输出,说明心跳已断——注意检查网卡名是否正确; -
服务响应一致性:从至少两个不同子网的客户端持续
curl http://VIP/api/health,返回内容、Header 中的 server 字段或后端日志时间戳若明显不一致,说明流量已被双节点分流。
二、快速定位常见诱因
80% 的脑裂来自这几类配置或网络问题,按优先级逐项排查:
-
防火墙拦截 VRRP 多播:默认目标地址是
224.0.0.18,协议为vrrp(非 udp/112)。CentOS 7+ 需加两条规则:firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPTfirewall-cmd --reload; -
virtual_router_id 不一致:主备 keepalived.conf 中同一 vrrp_instance 的
virtual_router_id必须完全相同(取值 1–255),差一个数字就会各自成团; -
网卡或交换机 STP 收敛延迟:尤其在虚拟化或云环境中,VRRP 报文可能被交换机临时丢弃。可用
ethtool eth0查看 link 状态是否抖动,或改用单播替代多播(见下文); -
系统内核参数干扰:确认
net.ipv4.ip_forward = 0(非路由器场景)、net.ipv4.conf.all.accept_redirects = 0,避免路由异常影响 VRRP 处理。
三、生产推荐的防御组合策略
单一手段不可靠,建议主备节点同时启用以下三项:
-
启用单播通信(绕过组播限制):在 keepalived.conf 的 vrrp_instance 块中,删掉
advert_int后添加:unicast_src_ip 192.168.x.10(本机真实 IP)unicast_peer { 192.168.x.11 }(对端真实 IP); - 配置健康脚本 + 优先级动态降级:例如检测 Nginx 是否存活,失败时将 priority 临时减 50,确保即使心跳断开,备机也不会贸然升主;
-
部署轻量仲裁探测(ping check):在 vrrp_instance 中加入:
vrrp_script chk_gw {script "ping -c 1 -W 1 192.168.x.1 && exit 0 || exit 1"interval 2weight -20}track_script { chk_gw }
这样当本端网关不通时,优先级自动降低,主动让出 MASTER 权限。
四、脑裂发生后的安全恢复步骤
切忌直接 kill 或 restart keepalived:
- 先登录两台机器,用
ip addr flush dev eth0手动清除 VIP(仅临时操作,不影响 keepalived 进程); - 检查哪台节点的业务实际在提供服务(比如查 Nginx access.log 最新请求时间、数据库 binlog position);
- 在确认的“真主”节点上执行
systemctl restart keepalived; - 等其稳定进入 MASTER 状态后,再在“假主”节点上执行相同命令,使其回归 BACKUP;
- 全程监控客户端连接和日志,确认 VIP 归属唯一、服务无中断。
这套做法已在多个金融和电商生产环境稳定运行超一年,关键在于把“依赖心跳”的被动模式,变成“多维度感知 + 主动让权”的可控模式。










