apache负载均衡实现无损上下线的核心是运行时协同操作:下线时用status=-d进入draining模式,停止派发新请求但保持已有连接;上线时需移除该状态、校准权重、验证健康并配合后端预热,全程不中断连接、不丢请求。

Apache 负载均衡实现无损上下线,核心是让节点“只出不进”(下线)或“只进不出”(上线),全程不中断已有连接、不丢请求、不触发客户端错误。这不是靠重启或删配置完成的,而是一套可验证、可回退的运行时协同操作。
下线:用 status=-D 进入 draining 模式
这是最稳妥的下线方式,无需 reload Apache,生效即时:
- 在对应 BalancerMember 行末尾添加 status=-D,例如:
BalancerMember http://192.168.1.20:8080 route=node3 status=-D - Apache 立即停止派发新请求,但所有已建立连接(HTTP/1.1 keep-alive、WebSocket、SSE、大文件上传中连接)继续收发数据,直到自然结束
- 必须搭配 lbmethod=bybusyness 或 byrequests;bytraffic 在 draining 下行为不稳定,不推荐
- 确认
mod_slotmem_shm已启用(Apache 2.4 默认开启),否则状态变更可能不生效
上线:恢复服务并校准权重
上线不是简单删掉 status=-D,而是要确保流量分配合理且后端已就绪:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 移除 status=-D,同时检查是否需调整 loadfactor —— 若该节点资源升级(如 CPU/内存扩容),应同步提高权重值
- 若采用 bybusyness 算法,上线后会自动纳入调度队列;但建议先观察 1–2 分钟内活跃连接数是否平稳上升,再逐步放开流量
- 临时关闭粘性会话(注释掉
ProxySet stickysession=...),避免用户被钉死在刚上线但尚未热身的节点上 - 上线前确保后端健康检查端点(如
/actuator/health)返回 UP,且应用已完成初始化(如 Spring Boot 的 readiness probe 通过)
关键配套调优:保连接、防超时、验状态
光改状态不够,还需防止代理层误断连接、确保可观测性:
- 全局设置长空闲超时:
ProxyTimeout 600(10 分钟),避免 WebSocket 握手后因 idle 被关闭 - 为 balancer 单独配置连接池:
ProxySet timeout=300 keepalive=on max=50 min=5 smax=20 ttl=300 - WebSocket 必须启用
mod_proxy_wstunnel,且后端地址写成ws://或wss://,否则 Upgrade 头被过滤导致连接失败 - 访问
/balancer-manager(需提前授权),确认目标节点状态列为 D(不是 ND 或空),且 Requests 计数停止增长 - 查日志是否有
AH01170: Entering into draining mode,这是 draining 生效的明确标志
后端配合:别让 Apache “背锅”
Apache 只负责路由控制,连接耗尽和资源释放得靠后端主动配合:
- 提供
/draining或/actuator/health接口,返回{"status":"DOWN"},通知上游不再接受新请求 - Java 应用可调用
stopContext()或临时设maxThreads=0,让正在处理的请求跑完,不接受新线程 - 清理本地缓存、关闭定时任务、释放数据库连接池等资源,避免下线后残留影响
- 上线时触发 warm-up 流程(如预热 JVM、加载热点数据、建立 DB 连接池),避免冷启动抖动









