跨集群容灾需Nginx主动感知能力、健康与地理关系:以实测QPS设动态权重,配合主动健康检查与geo+map地域路由,三者协同实现智能流量分担与自动故障隔离。

跨集群容灾流量分担不能靠默认轮询实现,必须让 Nginx 主动感知集群能力、健康状态和地理关系。核心是用权重反映真实承载力,用健康检查保障故障自动隔离,再辅以地域路由增强体验,三者缺一不可。
按集群服务能力设定动态权重
不同集群的服务器配置、带宽、延迟差异大,等权分配会导致弱集群过载、强集群闲置。权重不是拍脑袋定的,要基于实测吞吐反推:
- 用 wrk 或 ab 对各集群单节点压测,记录稳定 QPS 值
- 若 A 集群单节点实测 1200 QPS,B 集群单节点仅 500 QPS,则 weight 比例建议设为 12 : 5(可简化为 6:2.5 或向上取整为 12:5)
- 在 upstream 中为每个 server 显式声明 weight,并搭配 max_fails=3 fail_timeout=30s,避免短时抖动误剔
- 若需常态化验证灾备集群,可略提高其权重(如从 5→7),但同步调松探测阈值,防止频繁震荡
启用主动健康检查+智能故障隔离
跨集群网络不稳定,被动等待连接失败太慢。必须让 Nginx 定期“主动敲门”,且探测路径要独立于主业务:
- 在 upstream 外层加 health_check interval=5 rise=2 fall=3(开源版需配合 lua-nginx-module)
- 为灾备集群单独配置健康接口,例如 /health?site=dr,避免与 /api/v1/status 等主路径共用导致误判
- 对高延迟集群(如异地机房),适当延长 fail_timeout 至 60s,容忍 RT 波动但不放任超时堆积
- 节点被摘除后,Nginx 自动停止转发;恢复响应后,在下一轮探测中自动加回,全程无需人工干预
结合 geo + map 实现地域优先+灾备兜底
对延迟敏感型业务(如实时下单、支付),优先本地集群能显著降延迟;全挂时再切全局 backup 组,兼顾性能与容灾:
- 在 http 块中用 geo $region 根据 $remote_addr 匹配 IP 库,识别用户属地(如 cn_beijing、us_east)
- 用 map $region $upstream_name 将地域映射到对应 upstream 名称(如 cn_beijing → backend_bj,us_east → backend_us)
- 每个地域 upstream 内部都包含本地主力节点 + 异地 backup 节点,但默认只启用本地组
- 在 server 块中用 set $upstream_name ...; proxy_pass http://$upstream_name 实现动态路由
验证必须覆盖真实故障场景
配置写完只是开始,必须验证流量是否真按预期分布、故障是否真能自动切换:
- 用 curl -H "Host: test.example.com" http://
/status 查看 stub_status,确认各 upstream 的 requests 数量比接近预设权重比 - 手动停掉主集群一台服务器,观察日志是否 5 秒内触发 health_check 失败、requests 是否立即转向其余节点
- 模拟主集群整体断网(如 iptables DROP 所有出向),验证是否在 fail_timeout 后彻底剔除该集群,流量 100% 切至灾备集群
- 灰度发布时,先切 1% 流量走新配置,确认监控指标(错误率、P95 延迟)无异常再逐步放大


















