Apache负载均衡heartbeat lbmethod失效返回503错误问题求助
Apache heartbeat负载均衡模式返回503故障排查
问题现象
- 负载均衡方法设置为bybusyness、bytraffic、byrequests时,Apache服务运行完全正常
- 切换为heartbeat负载均衡方法后,浏览器访问负载均衡服务端返回
503 Service Unavailable错误,日志报错信息如下:
AH01170: balancer://mycluster: All workers are in error state
当前环境配置
使用的httpd.conf配置如下:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule slotmem_shm_module modules/mod_slotmem_shm.so LoadModule status_module modules/mod_status.so LoadModule watchdog_module modules/mod_watchdog.so LoadModule heartbeat_module modules/mod_heartbeat.so LoadModule heartmonitor_module modules/mod_heartmonitor.so LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so Listen *:8888 ServerName http://localhost:8888 HeartbeatListen localhost:8888 HeartbeatAddress localhost:8888 HeartbeatMaxServers 20 <VirtualHost *:8888> <Proxy balancer://mycluster> BalancerMember http://localhost:8081 route=1 BalancerMember http://localhost:8082 route=2 ProxySet lbmethod=heartbeat </Proxy> <Location "/balancer-manager"> SetHandler balancer-manager </Location> ProxyPass /test balancer://mycluster ProxyPassReverse /test balancer://mycluster </VirtualHost>
已确认的前置信息
- heartbeat方法依赖的所有相关模块均已加载,slotmem模块配置正常,对应验证日志如下:
AH02283: Using slotmem from mod_heartmonitor
- 完全相同的配置下,使用bybusyness、bytraffic、byrequests三种负载均衡算法均可正常运行
- 公开渠道暂未检索到heartbeat负载均衡方法的可参考正确配置示例,官方文档标注该方法处于*实验性(Experimental)*状态
故障根因与修复方案
核心配置错误点
- 模块部署位置错误:
mod_heartbeat的作用是安装在后端真实业务节点上,主动向负载均衡器发送自身存活状态、负载数据;mod_heartmonitor才是安装在前端负载均衡器上,用于接收后端心跳上报的模块。当前配置把两个模块都部署在负载均衡器节点,后端8081、8082节点没有安装配置mod_heartbeat发送心跳,负载均衡器收不到任何后端节点的存活信号,自然判定所有后端节点处于错误状态。 - 端口复用冲突:
HeartbeatListen配置的监听端口为8888,该端口已经被Listen *:8888指令占用,用于对外提供HTTP代理服务,心跳监听服务无法正常绑定端口启动。 - 配置项归属错误:
HeartbeatAddress是后端业务节点的配置项,用于指定心跳上报的目标地址,不应该出现在负载均衡器的配置中。
修复步骤
- 调整负载均衡器(8888端口节点)配置:
- 删除配置中的
HeartbeatAddress localhost:8888行 - 将
HeartbeatListen修改为独立未被占用的端口,例如HeartbeatListen 0.0.0.0:9999,禁止和对外服务的8888端口复用 - 重启负载均衡器的Apache服务
- 删除配置中的
- 配置两个后端业务节点(8081、8082端口的Apache实例):
- 两个节点仅需加载
mod_heartbeat.so模块,无需加载proxy_balancer、lbmethod_heartbeat、heartmonitor等仅负载均衡端需要的模块 - 在两个后端节点的全局配置中添加
HeartbeatAddress <负载均衡器IP>:9999,指向负载均衡器配置的心跳监听端口 - 分别重启两个后端节点的Apache服务
- 两个节点仅需加载
- 验证:等待10秒左右待心跳完成周期上报,访问balancer-manager管理页面查看后端节点状态,确认节点状态正常后再测试
/test路径的代理访问即可。
注意:heartbeat负载均衡算法不会像其他三种算法一样主动发起后端存活探测,仅以后端上报的心跳数据作为节点存活判定依据,只要连续多个周期收不到对应节点的心跳包,就会直接将节点标记为失效,这也是该实验性算法和其他内置算法的核心逻辑差异。
内容的提问来源于stack exchange,提问作者tomaxo14
相关产品推荐
相关产品推荐

