Keepalived可通过自定义网络检测脚本(如ping网关、DNS等)结合vrrp_script机制实现断网触发VIP切换,需多目标探测、严格返回值、负权重降优先级,并规避DNS依赖与单点误判。

Keepalived 本身不直接依赖脚本检测物理机断网,但可以通过自定义监控脚本来判断网络连通性(如 ping 网关、DNS 或核心服务),再结合 vrrp_script + track_script 机制触发 VIP 切换。关键在于:脚本必须能准确反映“本机真实失联”状态,避免误切。
设计可靠的断网检测脚本
脚本需区分“Nginx宕了”和“整机断网”,建议组合多个探测目标(至少2个),避免单点误判:
- ping 网关 IP(如 192.168.1.1)——判断本地局域网出口是否可达
- ping 公共 DNS(如 114.114.114.114 或 8.8.8.8)——判断上行链路及外网是否通
- 可选:curl 检测同集群内另一台健康节点的 HTTP 接口(如 http://192.168.1.10:8080/health)——验证跨主机通信能力
- 脚本返回值严格:成功返回 0,失败返回非 0(Keepalived 只认 exit code)
在 Keepalived 配置中集成检测逻辑
将脚本注册为 vrrp_script,并绑定到 VRRP 实例:
vrrp_script chk_nginx_net {
script "/etc/keepalived/check_network.sh"
interval 3 # 每3秒执行一次
weight -5 # 失败时优先级减5(确保低于备机)
fall 3 # 连续3次失败才触发降级
rise 2 # 连续2次成功才恢复
}
<p>vrrp_instance VI_nginx {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1</p><pre class="brush:php;toolbar:false;">virtual_ipaddress {
192.168.1.100/24 dev eth0
}
track_script {
chk_nginx_net
}}
注意:weight 为负值,表示检测失败时降低本机优先级,促使备机升主;若用正值(如 +5),需配合 state BACKUP 和更高基础 priority,逻辑更易出错。
规避常见误切陷阱
物理机断网 ≠ 服务不可用,需防止因临时抖动或单点探测失败引发频繁切换:
- 不要只 ping 一个地址(如仅 ping 百度域名)——DNS 解析失败会被误判为断网
- 避免使用 hostname 或域名做探测,全部用 IP 地址,绕过 DNS 依赖
- 脚本中加入超时控制:ping -c 2 -W 2 192.168.1.1 > /dev/null,防止卡死
- Keepalived 日志要打开(log syslog local0),配合 tail -f /var/log/messages | grep Keepalived 实时观察切换原因
验证与压测要点
上线前必须模拟真实断网场景验证行为:
- 手动执行脚本:/etc/keepalived/check_network.sh && echo ok || echo fail,确认返回值符合预期
- 拔掉主节点网线(或 ip link set eth0 down),观察 VIP 是否在 3–5 秒内漂移到备机
- 恢复网络后,检查是否自动切回(取决于 rise 配置和 priority 设置)
- 用 tcpdump -i eth0 vrrp 抓包,确认 VRRP Advertisement 是否正常收发


















