后端实例滚动升级时,借助负载均衡的健康检查与连接耗尽机制,完全可以实现零中断更新。 关键在于让负载均衡器在实例退出前停止转发新流量,并等待现有请求完成,同时确保新实例通过健康检查后再加入服务池。
滚动升级时负载均衡如何避免中断?
滚动升级的核心是逐个替换后端实例,但若负载均衡器仍将流量路由到正在关闭的旧实例,就会产生中断,避免中断依赖两个关键机制:健康检查与连接耗尽(Connection Draining),健康检查负责将旧实例从服务池中摘除,连接耗尽则确保已进入旧实例的请求处理完毕后才关闭连接。
健康检查是前提
负载均衡器通过定期检查后端实例的状态来判断是否继续转发流量,在滚动升级中,当旧实例开始关闭时,应主动进入“不健康”状态,让负载均衡器将其摘除,配置时需注意:
- 健康检查路径:建议使用应用自身的健康检查接口(如
/health),返回200则表示正常,返回非200或超时则视为不健康。 - 检查间隔与超时:间隔设为5-10秒,超时设为2-3秒,避免因短暂延迟误判。
- 健康阈值与不健康阈值:连续通过2-3次检查才认为健康,连续失败2-3次才认为不健康,阈值过低会导致误判,过高则延迟摘除。
- 优雅关闭信号:实例在关闭前应主动返回不健康状态,而不是直接停止进程,例如在Kubernetes中,preStop钩子可先移除自身端点,再等待几秒后关闭。
连接耗尽让旧实例平稳退出
即使健康检查摘除了旧实例,但已建立的TCP连接或正在处理的请求仍需要时间完成,连接耗尽机制允许负载均衡器在停止转发新连接后,等待现有连接自然结束,超时后才强制关闭,配置要点:
- 耗尽超时时间:根据业务请求最长耗时设置,常见为30-300秒,超时过短会强制中断长请求,过长则拖慢升级速度。
- 负载均衡器类型差异:AWS ALB的注销延迟(Deregistration Delay)可实现连接耗尽;HAProxy使用
graceful参数配合option http-keep-alive;Nginx通过max_fails和fail_timeout配合第三方模块实现类似效果。 - 应用层支持:后端服务应实现优雅关闭,在收到SIGTERM信号后停止接受新请求,但继续处理已接收的请求,直到完成或超时。

验证机制确保零中断
升级过程中需持续监控健康检查状态与连接耗尽情况,可通过负载均衡器日志、监控指标(如活跃连接数、请求失败率)来判断,在测试环境模拟滚动升级,观察是否有请求失败或超时。
后端实例滚动升级不停机方案对比
不同负载均衡器在滚动升级中的实现机制和配置复杂度有差异,下表对比了常见方案:
| 负载均衡器 | 健康检查方式 | 连接耗尽支持 | 适用场景 | 配置复杂度 |
|---|---|---|---|---|
| Nginx | 主动检查(需第三方模块)或被动检查(max_fails) | 需借助第三方模块如nginx-upsync | 自建服务、小规模集群 | 中 |
| HAProxy | 内置HTTP检查、SSL检查等 | 使用graceful参数配合option http-keep-alive |
高性能反向代理 | 低 |
| AWS ALB/NLB | 健康检查路径+注销延迟 | 原生支持注销延迟 | 云原生环境 | 低 |
| 简米云SLB | 健康检查+优雅关闭 | 支持连接耗尽(需配置) | 国内云服务器场景 | 低 |
| Kubernetes Service | 通过Pod的readinessProbe | 使用preStop钩子+terminationGracePeriodSeconds | 容器化部署 | 中 |
软件负载均衡器配置要点
Nginx:被动健康检查通过max_fails和fail_timeout控制,当实例连续失败指定次数后,在fail_timeout时间内不再转发,滚动升级时,旧实例应主动返回错误或超时,但被动检查依赖请求失败,可能导致部分请求中断,建议使用主动健康检查模块如nginx_upstream_check_module,定期检查每个实例的健康状态。
HAProxy:配置option httpchk和check参数,可设置inter、rise

、fall等,支持graceful关闭,通过shutdown sessions前等待连接完成,实操中,在服务关闭前先通过set server / state drain将实例设为只处理已有连接,完成后手动关闭。
云负载均衡器差异
云厂商的负载均衡器通常内置连接耗尽功能,且与弹性伸缩组、容器服务配合更紧密,例如AWS ALB在Target Group中设置Deregistration delay,简米云SLB在服务器组中设置“连接耗尽时间”,业务部署在云上时,建议直接使用云负载均衡器的原生滚动更新支持,避免手动配置复杂健康检查。
负载均衡滚动更新最佳实践:从配置到验证
虽然基本原理一致,但实际落地需要结合业务场景进行细致配置,以下步骤覆盖从初始化到验证的全流程。
配置健康检查参数
- 确定健康检查路径:选择不依赖外部依赖的轻量接口,返回状态码200表示正常,避免使用主页面或包含数据库查询的接口,防止因数据库抖动导致误判。
- 设置合理间隔:间隔过短会增加负载均衡器压力,过长则延迟检测,推荐间隔5-10秒,超时2-3秒。
- 调整阈值:健康阈值2-3次,不健康阈值2-3次,根据业务容忍度调整,若服务启动慢,可适当增加健康阈值。
设置连接耗尽超时
- 分析业务请求处理时间:统计P99请求耗时,设置超时为此值的1.5-2倍,如P99为60秒,耗尽超时设为90-120秒。
- 负载均衡器配置:云厂商SLB在控制台或API中设置“连接耗尽时间”;Nginx需通过第三方模块实现;HAProxy在server配置中添加
shutdown sessions前的等待时间。 - 应用层配合:后端服务在收到关闭信号后,应停止接受新请求,但继续处理已接收请求,在Node.js中可用
server.close();Java中配置server.shutdown=graceful;Python中通过信号处理实现。
结合CI/CD自动化滚动升级
- 在持续部署流水线中,加入预检查步骤:先更新一个实例,验证健康检查通过后,再逐步更新其余实例。
- 使用蓝绿部署或灰度发布作为补充:对于高风险升级,可先使用灰度发布,将少量流量引至新实例,观察一段时间无异常后再全量滚动。
- 在Kubernetes中,通过
strategy.rollingUpdate设置maxUnavailable和maxSurge,确保每次只更新部分实例,同时保持服务容量。

验证升级无中断
- 监控指标:观察负载均衡器的请求失败率、5xx错误数、平均响应时间,在升级过程中,这些指标应保持平稳。
- 模拟请求:使用压力测试工具持续发送请求,观察在升级过程中是否有连接中断或超时。
- 日志分析:查看后端服务日志,确认是否有请求在关闭期间被丢弃,同时检查负载均衡器日志,确认健康检查状态变化的时间点与升级步骤一致。
滚动升级负载均衡中断问题解答
滚动升级时为什么会出现502错误?
502错误通常表明负载均衡器无法与后端实例建立连接,原因可能是旧实例关闭过快,健康检查未及时摘除实例,导致新请求到达已关闭的实例,解决方案:延长连接耗尽超时时间,并在实例关闭前先返回不健康状态,等待健康检查判定后再关闭,同时确保负载均衡器配置了合理的健康检查间隔和阈值。
如何处理长连接服务的滚动升级?
长连接(如WebSocket、gRPC流)在滚动升级中更容易中断,因为连接耗尽机制不一定能覆盖所有长连接,建议做法:在应用层实现连接迁移或重连逻辑,负载均衡器配置较长的连接耗尽超时,对于WebSocket,可使用max_keepalive_requests限制连接最大请求数,让连接自然断开,在滚动升级前,先通过负载均衡器剔除旧实例,等待已有连接自然结束,再关闭实例。
如何验证负载均衡配置是否正确?
验证分两步:先测试健康检查,手动停止一个后端实例,观察负载均衡器是否将其摘除,并确认没有请求转发到该实例,再测试滚动升级,用压力工具持续发送请求,同时逐个替换后端实例,观察请求失败率是否为0,检查日志,确认连接耗尽机制生效,以及旧实例在关闭前处理完所有请求,行业共识认为,在测试环境模拟真实流量和故障场景,是验证配置可靠性的唯一方法。