Apache通过mod_proxy_balancer的lbset参数实现主备切换:lbset=0为主集群,全宕后降级至lbset=1备用集群,再宕则切至lbset=2灾备服务;需配合健康检查(status=+H、ping、retry、failonstatus)确保准确识别故障。
apache 本身不内置“主备切换”逻辑,但通过 mod_proxy_balancer + lbset 参数可实现多层级故障转移:主集群全挂后,自动降级到备用集群,再挂则切至灾备服务。关键不是简单配个 backup 地址,而是按优先级分组、配合健康检查、严格隔离失效域。
用 lbset 实现明确的优先级分组
lbset 是 BalancerMember 的核心参数,决定 Apache 何时启用哪一组后端。数值越小,优先级越高;只有当前 lbset 内所有节点都被标记为 down,才会尝试下一个 lbset:
- 主集群设为
lbset=0(默认值,也可显式写) - 同城备用集群设为
lbset=1 - 异地灾备服务设为
lbset=2
Apache 不会在各组间混用节点——这是硬性故障转移,不是负载均衡。
必须开启健康检查并正确标记失败
仅靠 lbset 不会自动识别宕机。需配合主动探测机制,否则节点长期“假活”,降级无法触发:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 每个
BalancerMember加上status=+H启用定期健康检查 - 用
ProxySet failonstatus=503或failonstatus=5xx明确哪些 HTTP 状态代表不可用 - 设置
ping=5(每 5 秒探一次)和retry=60(失败后 60 秒内不重试),避免抖动误判
没有健康检查,lbset 降级形同虚设。
配置示例:三层容灾结构
以下配置定义了一个名为 myapp 的均衡器,含主、备、灾备三组:
<Proxy balancer://myapp> # 主集群:双节点,lbset=0 BalancerMember http://192.168.10.10:8080 route=main1 loadfactor=1 status=+H lbset=0 ping=5 retry=60 BalancerMember http://192.168.10.11:8080 route=main2 loadfactor=1 status=+H lbset=0 ping=5 retry=60 <h1>备集群:同城异地,lbset=1</h1><p>BalancerMember <a href="https://www.php.cn/link/aead8b287c9480f564ba2d333612bbfa">https://www.php.cn/link/aead8b287c9480f564ba2d333612bbfa</a> route=standby1 loadfactor=1 status=+H lbset=1 ping=5 retry=60 BalancerMember <a href="https://www.php.cn/link/078f6d6470a41e12c979c33387bb8928">https://www.php.cn/link/078f6d6470a41e12c979c33387bb8928</a> route=standby2 loadfactor=1 status=+H lbset=1 ping=5 retry=60</p><h1>灾备集群:只读轻量服务,lbset=2</h1><p>BalancerMember <a href="https://www.php.cn/link/acd3da98a97c10892671c6f02c7aae49">https://www.php.cn/link/acd3da98a97c10892671c6f02c7aae49</a> route=dr1 loadfactor=1 status=+H lbset=2 ping=5 retry=60 </Proxy></p><h1>在虚拟主机中调用</h1><p>ProxyPass / balancer://myapp/ stickysession=ROUTEID|jsessionid
补充建议:避免常见陷阱
实际部署中容易忽略但影响成败的细节:
- 备用和灾备服务不应是主集群的完整镜像——推荐只提供核心只读接口(如查单、验状态),降低资源依赖和共性故障风险
- 确保所有后端节点返回一致的
Set-Cookie路由标识(如ROUTEID),否则会话粘滞失效 - 禁用
ProxySet lbmethod=bytraffic等动态算法——lbset降级要求确定性行为,应使用byrequests或bybusyness - 在
ProxyStatus页面或日志中定期验证各lbset是否真实进入 down 状态,而非仅靠理论推断

















