全链路压测下验证nginx主备平滑切换需对齐客户端行为、日志断点与监控指标:用ab/wrk模拟持续并发请求,分步注入进程崩溃、服务假死、网络心跳中断三类故障,通过access.log时间戳误差≤1秒、prometheus指标无缝衔接、vip唯一性及响应体/数据库一致性校验确保真正无感切换。

在全链路压测环境下验证 Nginx 故障转移的主备平滑切换,核心是让压测流量真实暴露切换过程中的业务影响,而不是只看 VIP 是否漂移或服务是否“启动”。必须把客户端行为、日志断点、监控指标三者对齐,才能确认是否真正“无感”。
用压测工具模拟真实用户连续访问
不能只发单次请求或间歇性探测。要构造持续、并发、带状态的压测流:
- 用 ab -n 5000 -c 200 http://VIP/ 模拟中等并发长连接,观察失败请求数是否为 0;
- 用 wrk -t4 -c100 -d30s http://VIP/api/order 发起带路径和 header 的真实接口压测,重点看 5xx 和超时率;
- 若业务含登录态,需配合 Cookie 或 Token 管理(如用 JMeter 脚本维持 session),避免因会话丢失误判为切换失败。
故障注入必须覆盖三类典型场景
只停 nginx 进程太理想,无法暴露健康检查盲区。压测中需分步触发:
- 进程崩溃:在主节点执行 kill -9 $(pgrep nginx),观察压测失败窗口是否 ≤ 2 秒;
- 服务假死:临时修改主节点 nginx 配置,让 /health 返回 503 或延迟 10s,验证 Keepalived 是否在 3 秒内降权并触发切换;
- 网络心跳中断:在主节点运行 iptables -A OUTPUT -p vrrp -j DROP,确认备节点能否在 6 秒内升为 MASTER,且压测无双 VIP 冲突。
从 access.log 和监控里找“无缝衔接”证据
切换是否平滑,不靠感觉,靠时间戳和指标对齐:
- 主节点最后一条 access.log 时间戳(如 13:22:15.892)与备节点第一条日志时间戳(如 13:22:15.901)误差必须 ≤ 1 秒;
- Prometheus 中对比 nginx_requests_total{instance="master"} 断崖式归零 与 nginx_requests_total{instance="backup"} 立即拉升,中间不能有 >500ms 的空白;
- 同时查 keepalived_state{role="MASTER"} 和 ip_addr_count{vip="192.168.x.100"},确保 VIP 只出现在一个节点,且状态变更时间与日志断点吻合。
压测后必须做一致性校验
切换完成不等于业务正确。要验证数据和响应没被污染:
- 对比主备节点返回的同一接口响应体(如 curl -s http://VIP/status),JSON 字段、HTTP 头、状态码必须完全一致;
- 若压测涉及写操作(如下单),检查后端数据库是否出现重复 ID、订单号错乱、幂等失效等现象;
- 查看 Nginx error.log 是否在切换瞬间大量报 upstream prematurely closed connection 或 no live upstreams,这类日志说明 upstream 配置未同步或健康检查未生效。











