在 Debian 上搭建 Tomcat 集群的主流做法
- 使用 Nginx/HAProxy/Apache HTTP Server(mod_jk) 做前端负载均衡,后端运行多个 Tomcat 实例。
- 在 Tomcat 间启用 会话复制(DeltaManager + SimpleTcpCluster),实现无状态横向扩展与故障切换。
- 同一主机多实例需调整 HTTP、Shutdown、AJP 端口;跨主机需开放相应 TCP 端口 与组播网络。
- 建议为实例设置 jvmRoute,便于会话粘滞与排障。
部署架构与组件
- 负载均衡层:
- Nginx:七层反向代理,配置 upstream 分发到多个 Tomcat。
- HAProxy:四/七层,支持健康检查与权重。
- Apache + mod_jk:通过 AJP 8009 与 Tomcat 通信。
- 应用层:多个 Tomcat 实例(同版本、同应用、不同端口/目录)。
- 会话层:Tomcat 内置 DeltaManager + SimpleTcpCluster 进行会话复制(也可用 BackupManager,视规模与一致性需求而定)。
快速落地步骤
- 准备环境
- 安装 OpenJDK:sudo apt update && sudo apt install default-jdk
- 下载解压 Apache Tomcat 9(示例:/opt/tomcat/latest),创建 tomcat 系统用户。
- 创建多实例(同一主机示例)
- 复制实例目录(如 /opt/tomcat/instance1、instance2),分别修改 conf/server.xml:
- Engine 增加 jvmRoute=“tomcat1”/“tomcat2”
- HTTP Connector 改为 8081/8082
- 关闭端口改为 8006/8007
- 如需 AJP,保持 8009(或改为不同端口)
- 使用 systemd 管理(示例服务文件要点):
- Environment 设置 JAVA_HOME、CATALINA_HOME、CATALINA_BASE、CATALINA_PID
- ExecStart=/opt/tomcat/latest/bin/startup.sh,ExecStop=/opt/tomcat/latest/bin/shutdown.sh
- User=tomcat,Restart=always
- 启动:sudo systemctl daemon-reload && sudo systemctl start tomcat1 tomcat2 && sudo systemctl enable tomcat1 tomcat2。
- 配置负载均衡(Nginx 示例)
- 安装:sudo apt install nginx
- /etc/nginx/sites-available/tomcat:
- upstream tomcat_cluster { server 127.0.0.1:8081; server 127.0.0.1:8082; }
- 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; } }
- 启用并重启:sudo ln -s /etc/nginx/sites-available/tomcat /etc/nginx/sites-enabled/ && sudo nginx -t && sudo systemctl restart nginx。
- 配置 Tomcat 会话复制(两节点示例)
- 在每个实例的 Engine 内加入(或取消注释并调整)Cluster 片段:
- 关键要点:
- 各实例 Receiver port(如 4000) 必须唯一;
- 如用组播,确保网络允许 228.0.0.4:45564 多播;云环境常禁用多播,可改用 静态成员/TCP 单播 或改用 AJP/前端会话亲和。
- 部署与验证
- 将应用部署到各实例 webapps(或使用外部部署工具);
- 访问域名/IP,检查请求是否分发到不同实例;
- 登录后操作并重启某实例,确认会话仍有效(复制生效)。
关键配置要点与排错清单
- 端口与网络
- 同机多实例:确保 HTTP(8080/8081/8082)、SHUTDOWN(8005/8006/8007)、AJP(8009)、Receiver(4000/4001) 不冲突;
- 跨机:开放相应 TCP 端口;组播需放通 228.0.0.4:45564;云上优先用 TCP 单播 或前端会话粘滞。
- 会话复制
- 使用 DeltaManager 时,所有节点默认全量复制,适合中小规模;大数据量/跨机房可考虑 BackupManager;
- 为 设置 distributable(或在 web.xml 根元素设置 ),否则复制不生效;
- 确认已添加 ReplicationValve 与 JvmRouteBinderValve。
- 负载均衡与健康检查
- Nginx/HAProxy 建议开启 主动健康检查 与 失败重试;
- 如需会话粘滞,Nginx 可加 ip_hash 或基于 cookie 的 sticky(应用无共享会话时更稳妥)。
- JVM 与 GC
- 示例:CATALINA_OPTS=“-Xms512M -Xmx1024M -server -XX:+UseParallelGC”(按内存与负载调优)。
- 日志与排错
- 查看 catalina.out、localhost_access_log 与 集群日志;
- 使用 JVisualVM/JConsole 或 Prometheus + JMX Exporter + Grafana 做指标与可用性监控。
可选方案与扩展
- 使用 Apache HTTP Server + mod_jk:通过 workers.properties 定义多个 AJP 8009 节点与负载均衡器,适合既有 Apache 栈的场景。
- 使用 HAProxy:简洁可靠的四/七层负载均衡,配置健康检查与权重,适合容器化或虚拟化环境。
- 高可用与自动故障转移:在 Debian 上结合 Pacemaker + Corosync 对 Tomcat/Apache 做资源管理与故障切换(需额外集群栈与 STONITH 配置)。
- 容器化与编排:使用 Docker/Kubernetes 部署多副本 Tomcat,结合 Service/Ingress 实现负载均衡与滚动升级。