Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
apache本身不原生支持跨机房容灾,但可通过mod_proxy、mod_proxy_balancer等模块组合健康探测、权重调度与外部监控,构建主备机房隔离、秒级故障识别、无损流量切换的容灾架构。

Apache 本身不原生支持跨机房容灾的自动故障切换与地理感知路由,但可通过组合模块、策略配置和外部协同机制,在多机房场景下构建具备容灾能力的负载均衡架构。关键不是“单靠 Apache 配置实现容灾”,而是以 Apache 为流量入口,配合健康探测、权重调度、会话隔离与运维联动,达成机房级降级与快速切换目标。
多机房容灾的核心设计原则
真正的容灾不是“多加几台服务器”,而是围绕三个刚性要求展开:
- 机房优先级隔离:默认只将请求分发到主用机房(如北京),备用机房(如上海)仅在主用全量不可用时启用
- 故障秒级识别:不能依赖超时被动发现,需主动、高频探测后端服务可用性(非仅 TCP 连通)
- 流量无损切换:切换过程不中断长连接、不丢失会话、不放大雪崩(例如避免所有请求瞬间压向单个备用节点)
基础模块与必要配置准备
确保以下模块已启用(缺一不可):
- mod_proxy 和 mod_proxy_http:提供反向代理能力
- mod_proxy_balancer:支撑集群定义与调度逻辑
-
mod_lbmethod_bybusyness 或 mod_lbmethod_bytraffic:推荐用
bybusyness,更适合长连接/高并发场景下的真实负载感知 - mod_slotmem_shm:必需,用于共享健康状态与连接数,否则 balancer-manager 无法读取实时数据
- mod_headers 和 mod_rewrite:用于注入机房标识、做条件路由
验证命令:httpd -M | grep -E 'proxy|lbmethod|slotmem|headers|rewrite'
按机房分组定义集群并设置降级策略
不把所有后端混在一个 balancer 里,而是按物理位置拆分成独立集群,并通过 RewriteRule 实现“主用优先 + 故障兜底”:
<virtualhost>
ServerName app.example.com
<pre class="brush:php;toolbar:false;"># 主机房集群(北京)
<Proxy "balancer://bj-cluster">
BalancerMember http://10.1.10.10:8080 route=bj1 loadfactor=5
BalancerMember http://10.1.10.11:8080 route=bj2 loadfactor=5
ProxySet lbmethod=bybusyness
ProxySet timeout=10 retry=30
# 主动健康检查:每 5 秒探 /health,失败 3 次即摘除
ProxySet failonstatus=503 hcmethod=GET hcuri="/health" hcinterval=5 hcfailures=3
</Proxy>
# 备机房集群(上海)
<Proxy "balancer://sh-cluster">
BalancerMember http://10.2.20.10:8080 route=sh1 loadfactor=3
BalancerMember http://10.2.20.11:8080 route=sh2 loadfactor=3
ProxySet lbmethod=bybusyness
ProxySet timeout=15 retry=60
ProxySet failonstatus=503 hcmethod=GET hcuri="/health" hcinterval=10 hcfailures=3
</Proxy>
# 默认走北京集群;若北京全部不可用(balancer 返回 503),则 fallback 到上海
RewriteEngine On
RewriteCond %{ENV:balancer_error} =503
RewriteRule ^/(.*)$ balancer://sh-cluster/$1 [P,L]
ProxyPass / balancer://bj-cluster/
ProxyPassReverse / balancer://bj-cluster/
# 可选:通过请求头标记来源机房,便于后端日志分析
RequestHeader set X-Datacenter "beijing"
说明:
- Apache 不会自动“检测整个集群宕机”,但可通过
RewriteCond %{ENV:balancer_error}捕获 ProxyPass 失败事件(需开启ProxyBadStatus 503或使用自定义错误页触发环境变量) - 更稳妥的做法是搭配外部脚本定期调用
balancer-manager接口,监控up状态数,当 bj-cluster 健康节点数为 0 时,动态重写配置或触发 DNS 切流 -
loadfactor在备用集群设低值,防止主用恢复初期流量突增冲击
会话一致性与跨机房状态同步
容灾≠简单转发,用户会话必须延续:
-
禁用 sticky session 跨机房传递:JSESSIONID 或 PHPSESSID 仅在同机房内有效,不要用
stickysession绑定到 sh-cluster - 后端需统一共享 Session 存储:Redis Cluster 或数据库,且主备机房 Redis 间做双向同步(如 CRDT 模式)或采用全局唯一 Session ID + 异步复制
-
前端可增加 location hint:首次访问时由后端返回
X-Preferred-DC: bj,后续请求带该 header,Apache 用 RewriteRule 优先匹配对应集群
示例规则:
RewriteCond %{HTTP:X-Preferred-DC} ^bj$
RewriteRule ^/(.*)$ balancer://bj-cluster/$1 [P,L]
<p>RewriteCond %{HTTP:X-Preferred-DC} ^sh$
RewriteRule ^/(.*)$ balancer://sh-cluster/$1 [P,L]</p><h1>默认 fallback</h1><p>ProxyPass / balancer://bj-cluster/</p>
不复杂但容易忽略:多机房容灾不是配置一次就万事大吉,它依赖健康探测精度、状态同步延迟、切换阈值合理性三者闭环。Apache 是执行层,真正的容灾决策应由外部监控系统(如 Prometheus + Alertmanager)驱动,Apache 只负责按指令精准转发。









