必须立即排查脑裂——服务已处于双主争抢状态。三步验证:一查两节点是否均绑定VIP;二用tcpdump确认VRRP心跳是否中断;三从多网段curl检测响应一致性。

当Keepalived主备节点同时持有VIP,客户端请求出现随机失败、后端日志时间戳不一致或ARP表中同一IP对应两个MAC时,必须立即排查脑裂——这不是配置微调问题,而是服务已处于双主争抢状态。
三步交叉验证确认是否真脑裂
不要只看ip addr输出就下结论。先在两台节点上同步执行以下操作:
第一步:检查VIP绑定状态 → 在主、备节点分别运行 ip addr show | grep "inet.*VIP",若两台都显示 192.168.1.100/32 scope global 且状态为 UP,即存在真实双VIP;
第二步:抓包验证VRRP心跳是否中断 → 在备节点执行 tcpdump -i eth0 vrrp -n -c 5,等待30秒。若无任何输出,说明VRRP组播报文完全收不到,心跳链路已断;
第三步:从客户端侧验证服务一致性 → 从至少两个不同网段(如办公网段+运维跳板机网段)持续执行 curl -I http://VIP/health,观察响应头中的 Server 字段或后端access日志时间戳。若返回值明显不一致(比如一个返回nginx/1.20,另一个返回nginx/1.18;或日志时间相差超2秒),说明流量已被分流至两个节点。
快速止血:不重启keepalived强制降权
确认脑裂后,禁止直接 systemctl restart keepalived——这可能触发新一轮抢占。应优先用预设降权机制让其中一节点退服:
在当前被判定为“非预期主”的节点上执行:
echo "priority 50" > /etc/keepalived/keepalived.conf.d/force_backup.conf && systemctl reload keepalived
该操作会覆盖原priority值,使该节点VRRP优先级永久低于另一方,【reload后VIP会立即释放,无需等待advert_int周期】。注意:此文件路径需提前在keepalived.conf中通过 include /etc/keepalived/keepalived.conf.d/*.conf 加载。
根因定位:四类高频诱因逐项排除
方法一:查防火墙是否拦截VRRP协议
CentOS/RHEL默认不放行vrrp协议(不是UDP 112端口),必须显式添加规则: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是否严格一致
主备节点的 vrrp_instance 块中,virtual_router_id 必须是完全相同的整数(1–255)。差1都会导致各自成团,【哪怕只是主配51、备配051,也会脑裂】。
方法三:检查STP或网卡链路抖动
在两节点分别执行 ethtool eth0 | grep "Link detected",若输出不稳定(忽up忽down),说明物理层或交换机端口异常。此时可临时改用单播模式规避组播依赖。
方法四:验证内核参数是否干扰
运行 sysctl net.ipv4.conf.all.accept_redirects net.ipv4.ip_forward,两项输出必须均为 0。非网关设备开启ip_forward会导致VRRP报文被内核错误转发或丢弃。
自动化监控:部署备节点VIP检测脚本
在备节点部署以下脚本,每5秒检测一次自身是否意外持有VIP,发现即告警:
#!/bin/bash<br>LB_VIP="192.168.1.100"<br>while true; do<br> if ip addr | grep -q "$LB_VIP/32"; then<br> echo "$(date): CRITICAL - VIP $LB_VIP found on backup node!" | logger -t keepalived-brain<br> # 此处可追加发送钉钉/邮件告警命令<br> fi<br> sleep 5<br>done
保存为 /usr/local/bin/check_brain.sh,并用systemd托管为长期服务,确保重启后自动运行。


















