apache与tomcat主备高可用由keepalived(vip漂移)、健康检查脚本(业务级探测)、apache(反向代理+后端健康剔除)和tomcat(无状态+外置会话)协同实现,核心是“谁发现故障、谁触发切换、谁承接流量”。

Apache 与 Tomcat 联合构建主备高可用架构时,故障自动转移不是靠单个组件完成的,而是由 Keepalived(负责 VIP 漂移)、健康检查脚本(探测服务存活)、Apache(反向代理/负载分发)和 Tomcat(应用层无状态或会话外置)四者协同实现。核心在于“谁发现故障、谁触发切换、谁承接流量”。
Keepalived 管理虚拟 IP 漂移
Keepalived 是主备切换的执行中枢,通过 VRRP 协议在主节点和备节点间选举 MASTER 角色,并绑定同一个 VIP(如 10.10.0.40)。当主节点异常,备节点在几秒内接管 VIP,所有发往该 IP 的请求自然转向备机。
- 主节点配置
state MASTER、优先级(如priority 100),备节点设为state BACKUP、较低优先级(如priority 90) - 必须配置
track_script关联自定义健康检查脚本(如检测 Apache 是否响应/health或端口 80 是否监听) - 一旦脚本返回非零值,Keepalived 自动降级自身状态,触发 VRRP 投票,备节点升为 MASTER 并绑定 VIP
Apache 作为反向代理承担流量分发与健康感知
Apache 不仅转发请求到后端 Tomcat,还可通过 mod_proxy_balancer 实现主动健康检查,剔除不可用节点。即使 Keepalived 已完成 VIP 切换,Apache 仍需确保不把请求打到已宕机的 Tomcat 实例上。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 启用
ProxyStatus on和<proxy balancer:></proxy>定义后端 Tomcat 列表 - 配置
ping=5参数让 Apache 每 5 秒对每个 Tomcat 发起轻量探测(如 HEAD /) - 结合
failonstatus=503或自定义retry=60,实现在连续失败后临时下线该 Tomcat 节点 - 若使用 sticky session,需确保
jvmRoute与 Tomcat 的server.xml中配置一致,避免会话错乱
Tomcat 侧保障无状态与会话可恢复
Tomcat 本身不参与 VIP 切换,但它的部署方式直接影响故障转移是否“无感”。关键是要消除本地状态依赖。
- 禁用默认
StandardManager,改用MemcachedSessionManager或RedisSessionManager,将会话存到共享缓存中 - 确保每个 Tomcat 实例的
jvmRoute唯一(如jvmRoute="tomcat1"),便于 Apache 做粘性路由或故障后重映射 - 关闭
expireSessionsOnShutdown="true",防止进程退出时主动销毁会话数据 - 静态资源、上传文件等不能存在本地磁盘,应统一走对象存储或 NFS
健康检查脚本要真实反映服务可用性
Keepalived 的 vrrp_script 如果只检查进程是否存在,就无法发现 Apache 配置错误、Tomcat 启动但未加载应用、或数据库连不上导致 500 的情况。脚本必须深入业务层面。
- 推荐检查路径如
curl -f -s -o /dev/null http://127.0.0.1:80/health?ready=1,后端返回 200 才算通过 - 响应时间超 2 秒、返回非 200 状态码、或 body 不含预期字符串(如
"status":"up"),均应退出并返回非零码 - 脚本中加入日志记录(如
echo "$(date): fail" >> /var/log/keepalived_health.log),便于复盘切换原因 - 避免检查过于频繁(
interval 2已足够),防止压垮健康接口










