nginx故障转移自愈测试需主动模拟vrrp心跳中断(iptables丢弃协议112包),测“网络恢复→角色重选→vip绑定→nginx就绪”全链路耗时(≤5秒),同步验证vip绑定与业务真实可访问性,并通过防抖配置(weight=-40、preempt_delay等)保障稳定性。

测试 Nginx 故障转移机制在网络闪断恢复后的自愈速度,关键不是等“故障发生再看切没切”,而是主动模拟心跳中断、验证 VIP 重获与服务接管的完整闭环耗时,重点测清“从网络恢复→角色重选→VIP 绑定→Nginx 响应就绪”这一链路是否在目标时间内完成(通常要求 ≤ 5 秒)。
精准模拟网络闪断,避免误判脑裂
真实闪断不是杀进程,而是阻断 VRRP 心跳报文。在主节点执行:
- iptables -A OUTPUT -p vrrp -j DROP:只丢弃 VRRP 协议包(协议号 112),不影响业务流量和 SSH 等管理通道
- 等待 6–8 秒(默认 advert_int 1s + 3 次未收到心跳即降级),观察 Keepalived 日志是否出现 "MASTER state = FAULT" 和备机升为 MASTER
- 立即执行 iptables -D OUTPUT -p vrrp -j DROP 恢复心跳,不重启服务、不 reload 配置
实时捕获自愈全过程耗时点
在闪断触发前,就在主备节点同时运行以下命令,记录时间戳:
- 主节点:watch -n 0.1 'date +%T.%3N; ip a show eth0 | grep "192.168.x.130" || echo "MISSING"'
- 备节点:watch -n 0.1 'date +%T.%3N; curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1/healthz 2>/dev/null || echo "DOWN"'
- 用 tail -f /var/log/messages | grep -E "(Keepalived|VRRP)" 查看状态变迁起止时刻
自愈耗时 = 备机首次成功返回 200 的时间 − 主节点最后一次输出 VIP 的时间(或心跳恢复命令执行时刻)
验证业务层是否真正就绪,而非仅 VIP 绑定
VIP 出现在备机网卡上 ≠ 用户能访问。必须同步验证:
- 在客户端持续发起请求:while true; do curl -s -w "%{time_total}s\n" -o /dev/null http://VIP/; sleep 0.3; done
- 记录从第一个失败(Connection refused 或超时)到连续两个 200 的间隔,即为用户可感知的“业务恢复延迟”
- 比对主备 access.log 中最后/第一条日志时间戳,确认是否无缝衔接(误差 ≤ 1 秒)
防抖动设计直接影响自愈稳定性
若多次测试发现自愈时间波动大(如 2 秒 vs 12 秒),大概率是配置未防抖:
- 主节点 priority 设为 100,备节点设为 90;vrrp_script 的 weight 建议设为 -40(非 -5),确保一次失败就跌破备节点优先级
- 启用 preempt_delay 30 在备节点,但主节点恢复后不抢回 VIP——这不是缺陷,而是避免闪断引发反复切换
- 检查 advert_int 和 fall/rise 是否匹配:例如 fall 2 + rise 3 + interval 2s,意味着检测窗口为 4 秒,恢复需 6 秒,整体自愈自然拉长











