Linux上Tomcat如何实现高可用性
小樊
39
2025-12-14 21:20:50
Linux上实现 Tomcat 高可用的核心思路
- 通过多实例 + 负载均衡分摊流量,避免单点故障。
- 通过会话保持/会话复制保证用户状态不因节点宕机而丢失。
- 通过VIP/Keepalived让入口网关具备故障转移能力。
- 通过数据库与应用层数据的高可用(主从复制、分布式缓存)消除后端单点。
- 通过监控与自动恢复快速发现与处置异常。
推荐架构
- 方案A(通用):Nginx + Tomcat 集群 + Keepalived(VIP)
- 前端两台 Nginx 互为主备,绑定虚拟IP,对外提供统一入口。
- Nginx 反向代理到后端多个 Tomcat 实例,实现负载均衡与故障节点摘除。
- Tomcat 节点间开启内置集群会话复制,应用标记为****。
- 方案B(AJP 场景):Apache httpd + mod_jk + Tomcat 集群
- 使用 AJP 8009 连接,httpd 做负载均衡与静态资源服务。
- Tomcat 配置 jvmRoute 与集群,保证会话粘滞与复制。
- 方案C(会话外置):Nginx + Tomcat + Redis/Memcached 会话共享
- 适用于跨机房、容器化或会话数据量较大的场景,避免 Tomcat 间网络广播。
关键配置步骤
- 多实例与端口规划
- 同机多实例需修改:Server 8005、HTTP 8080、AJP 8009、以及 Receiver 4000 等端口,避免冲突。
- 示例(两个实例):
- 实例A:Server=8005,HTTP=8080,AJP=8009,Receiver=4000
- 实例B:Server=8006,HTTP=8081,AJP=8010,Receiver=4001
- Tomcat 内置集群与会话复制(示例核心片段)
- 在 server.xml 的 内加入:
- 在 conf/context.xml 的 中加入:
- 在应用的 WEB-INF/web.xml 中加入:
- 如采用 AJP,需在 server.xml 配置 AJP Connector(port=8009/8010),并为每个实例设置 jvmRoute(如 tomcat1/tomcat2),以便会话粘滞与路由恢复。
- 负载均衡器配置
- Nginx 示例(/etc/nginx/nginx.conf 或 /etc/nginx/conf.d/tomcat.conf):
- upstream tomcat_cluster { server 192.168.1.11:8080; server 192.168.1.12:8080; }
- server { listen 80; location / { proxy_pass http://tomcat_cluster; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
- Apache + mod_jk 示例:
- LoadModule jk_module modules/mod_jk.so
- JkWorkersFile conf/workers.properties
- JkMount /app/* lbcontroller
- workers.properties:worker.list=lbcontroller; worker.lbcontroller.type=lb; worker.lbcontroller.balance_workers=tomcat1,tomcat2; worker.tomcat1.type=ajp13; worker.tomcat1.host=192.168.1.11; worker.tomcat1.port=8009; worker.tomcat2.type=ajp13; worker.tomcat2.host=192.168.1.12; worker.tomcat2.port=8010;
- 会话外置(可选,Redis/Memcached)
- 引入 memcached-session-manager(MSM) 相关 JAR,配置 为 Memcached 或 Redis 会话管理器,实现跨节点与会话共享,适合云原生与跨机房部署。
- 入口高可用(Keepalived VIP)
- 两台 Nginx/Apache 部署 Keepalived,配置 vrrp_instance 与 virtual_ipaddress(如 192.168.1.100),实现主备切换与统一入口。
- 数据与后端高可用
- 数据库采用 MySQL 主从复制 或 PostgreSQL 流复制;缓存层使用 Redis 集群/主从 提升可用性与伸缩性。
验证与运维要点
- 功能验证
- 访问入口地址,确认请求在多个 Tomcat 实例间轮询分发。
- 登录应用,输出 JSESSIONID,重启某实例后,确认会话仍可用(内置复制或外置会话生效)。
- 主动停掉一个 Tomcat,验证自动摘除与故障转移,业务无中断或最小感知。
- 日志与排错
- 检查 catalina.out、localhost..log、负载均衡器日志(如 mod_jk.log 或 nginx/access.log)。
- 集群通信异常时,核对 多播地址 228.0.0.4:45564、Receiver 端口 4000/4001 是否可达,防火墙是否放行。
- 监控与告警
- 监控 HTTP 5xx、后端响应时延、Tomcat 线程/内存、VIP 漂移 等关键指标,结合 Prometheus + Grafana 可视化与告警。
常见坑与优化建议
- 同一主机多实例务必修改 Server/HTTP/AJP/Receiver 端口,避免端口冲突。
- 使用 DeltaManager 时适合小中型集群;节点多、跨机房建议改用 BackupManager 或会话外置(Redis/Memcached)。
- 组播在某些云环境受限,优先使用静态成员配置或改为外置会话方案。
- 开启 JVM 路由绑定 与 ReplicationValve,确保会话粘滞与复制链路正确。
- 静态资源交由 Nginx/Apache 处理,Tomcat 专注动态请求,降低负载。
- 为入口与数据库配置自动故障转移(Keepalived/数据库复制),并定期演练切换。