IIS蓝绿部署零停机仍随机将请求发至不健康服务器
蓝绿部署ARR路由偶尔转发请求至已下线不健康服务器的排查与解决方法
我们基于蓝绿模式搭建了零停机部署的站点与服务器场,整体运行稳定,但路由站点的Web日志显示,偶尔会有请求被转发至已标记为Unhealthy且已停止的Live-Blue服务器,触发用户端502.3(Bad Gateway: Forwarder Connection Error (ARR))错误,错误频率约每25000次请求出现一次。当前健康检测间隔设置为1秒。
日志示例:
2023-02-19 09:50:05 /DocumentView DID=23932&SERVER-ROUTED=LIVE-GREEN 2023-02-19 09:50:09 /FileDownload FID=50516&SERVER-ROUTED=LIVE-BLUE 2023-02-19 09:50:13 /Publish DocID=9154358&SERVER-ROUTED=LIVE-BLUE 2023-02-19 09:50:15 /SiteView DID=23932&SERVER-ROUTED=LIVE-GREEN
排查方向
- 健康检测窗口期冲突:健康检测间隔1秒,但检测响应超时、状态同步到路由规则的过程存在微小延迟,请求刚好在这个窗口到达时,会被转发到已下线服务器。
- 连接池复用问题:ARR默认复用后端服务器连接,若Live-Blue停止前连接池仍有未释放的长连接,后续请求可能被分配到这些无效连接,即便服务器已标记为Unhealthy。
- 状态标记原子性问题:更新服务器健康状态时,路由规则的更新若不是原子操作,会出现短暂状态不一致,导致部分请求错误路由。
解决方法
调整健康检测参数
- 把健康检测的响应超时时间从默认30秒缩短到500毫秒,快速识别服务器下线状态。
- 增加失败阈值:设置连续失败3次后标记为Unhealthy,同时保持1秒检测间隔,平衡灵敏度和稳定性。
- 停止Live-Blue前,先通过脚本调用ARR API手动标记其为Unhealthy,等待1-2秒确认路由规则生效后再停服务,避免检测滞后。
优化连接池策略
- 在ARR服务器场设置中,开启连接超时回收,设置空闲超时10秒,定期清理无效连接。
- 若业务允许,在后端站点响应头添加
Connection: close,强制ARR每次请求建立新连接,避免复用已下线服务器的连接。
强化路由状态更新逻辑
- 用ARR管理脚本批量更新服务器状态,确保状态变更为原子操作,避免手动操作的延迟。
- 在ARR路由规则中设置请求排队超时,若服务器状态变更时有请求等待,超时后自动转发到健康服务器。
完善日志与监控
- 开启ARR失败请求日志,记录错误转发的上下文(服务器状态、连接池状态),便于定位触发场景。
- 对比健康检测结果、服务器停止时间、错误请求时间,确认滞后窗口时长,针对性调整参数。
内容的提问来源于stack exchange,提问作者JayTruman
相关产品推荐
相关产品推荐

