apache核心调度依赖mod_proxy_balancer,通过lbmethod切换算法:byrequests(默认轮询)、bytraffic(按流量)、bybusyness(按活跃请求数,推荐java长连接);需结合loadfactor权重、stickysession会话保持及健康检查协同生效。

Apache 的核心调度能力由 mod_proxy_balancer 提供,但它本身不内置复杂算法引擎,而是通过 lbmethod 指令切换底层分发逻辑。选型关键不在“功能多寡”,而在于匹配后端 Java 应用的连接模型、状态需求和故障敏感度。
支持的调度方法及适用判断
Apache 2.4 当前稳定支持三种 lbmethod 值,需在 <proxy></proxy> 块中显式声明:
- byrequests(默认):按请求计数轮询,简单公平,适合无状态服务或后端性能高度一致的 Tomcat 集群;无需额外模块,但无法感知节点真实负载
- bytraffic:按响应字节数加权分发,适合大文件下载、API 返回体差异大的场景;对带宽敏感,但可能放大慢响应节点的压力
-
bybusyness(推荐用于 Java 长连接):Apache 2.4.33+ 支持,依据当前活跃请求数(
busy)选择最少连接的节点;特别适配 WebSocket、Servlet 异步处理、高并发登录等长生命周期请求
权重与动态调节机制
仅靠算法不够,还需结合 loadfactor 实现细粒度流量引导:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 每个
BalancerMember可设loadfactor=2等整数值,表示其理论承载能力倍数,默认为 1 - 权重与算法协同生效:例如
lbmethod=byrequests下,权重 3 的节点每收到 3 个请求,权重 1 的节点才收 1 个 - 生产环境建议避免极端权重(如 10:1),防止单点过载;可通过外部脚本定期读取 JVM GC 日志或 Prometheus 指标,调用
apachectl graceful动态更新配置中的loadfactor
会话粘滞与算法冲突规避
Java 应用若依赖 HttpSession,必须开启 sticky session,否则 lbmethod 再合理也无意义:
- 在
BalancerMember中声明route=app1,并在响应 Cookie 中携带JSESSIONID=xxx.app1 - 全局启用
ProxySet stickysession=JSESSIONID,Apache 自动提取.app1后缀匹配 route - 注意:启用 sticky 后,
bybusyness仍有效——它只影响新会话的首次分发;已有会话始终路由到原节点,不参与忙闲计算
健康检查联动调度可靠性
算法再优,若转发到宕机节点就失去意义。健康检查不是可选项,而是调度的前提:
- 基础被动检测:依靠
timeout=5 retry=60参数,在连续超时或返回错误码后自动标记down,60 秒后重试 - 主动探测(推荐):Apache 2.4.43+ 启用
mod_proxy_hcheck,配置hcmethod=GET hcuri="/health" hcexpr="%{REQUEST_STATUS} == 200",探测失败立即剔除,恢复后秒级回归 - 关键点:健康检查必须与
lbmethod协同——例如使用bybusyness时,被标记为down的节点将彻底从活跃计数中移除,确保调度结果真实反映可用容量










