主备切换后需验证vip与服务双就绪:通过track_script实现服务级健康检查,配合curl探测、日志记录、防脑裂机制及防火墙/arp/tcpdump网络层验证。

主备切换后做系统状态自检,核心是确保新接管的节点不仅抢到了 VIP,还真正具备服务能力——不能“VIP 飘过去了,服务却没起来”。这需要在 Keepalived 的 vrrp_instance 中嵌入可验证的服务健康检查逻辑,并配合外部脚本与日志反馈机制。
用 track_script 实现服务级自检
Keepalived 2.0+ 不再支持 check_script,必须用 track_script。它不是简单执行命令,而是根据脚本退出码(0=成功,非0=失败)动态调整优先级或触发状态变更:
- 脚本需精简输出,只返回 exit code,避免多余日志干扰解析
- 推荐使用
weight -50(或更大幅值),让一次失败直接拉低优先级至低于备机,强制触发切换 - 例如检查 Nginx:脚本中用
curl -I http://127.0.0.1:80 -s -o /dev/null -w "%{http_code}" | grep -q "200",成功才返回 0
切换后立即验证 VIP + 服务双就绪
仅靠 Keepalived 自身无法确认“切换完成且服务已响应”,需补充主动探测:
- 在备机脚本末尾(或切换后 2 秒)加一条
curl -Is http://<vip>/health | head -1</vip>,验证 HTTP 响应头是否可达 - 将探测结果写入日志,例如:
echo "$(date): VIP $(ip addr show eth0 | grep 'inet.*virtual' | awk '{print $2}') up, service OK" >> /var/log/keepalived-switch.log - 可搭配 systemd 服务依赖,在 keepalived 启动后自动运行一次自检单元(
After=keepalived.service)
防脑裂与状态回溯机制
切换后若原主机恢复,可能引发脑裂。需通过日志和状态快照避免误判:
- 每次
vrrp_instance状态变化(MASTER/BACKUP)时,用notify指令调用通知脚本,记录时间、角色、VIP、本地服务状态 - 脚本中检查
ip a show | grep <vip></vip>和systemctl is-active nginx,两者都为 active 才标记“自检通过” - 保留最近 5 次切换日志,便于排查“VIP 已切但服务延迟启动”类问题
防火墙与网络层兜底验证
VIP 能 ping 通 ≠ 服务可用。真实业务常卡在中间环节:
- 确认防火墙放行 VRRP 组播(224.0.0.18)和业务端口,否则 VIP 可能无法被 ARP 解析
- 在客户端或网关侧用
arping -I eth0 <vip></vip>验证 ARP 表是否更新到新 MAC 地址 - 用
tcpdump -i eth0 host <vip> and port 80</vip>抓包,确认请求是否真抵达新主机的监听进程










