温馨提示×

Linux Tomcat如何实现集群部署

小樊
35
2025-12-08 22:38:10
栏目: 智能运维

Linux Tomcat 集群部署实操指南

一 架构与准备

  • 架构选型:前端使用Nginx/HAProxy做负载均衡,后端部署2–N 个 Tomcat 实例组成集群,通过 Tomcat 内置的组播 TCP 集群实现会话复制,达到高可用横向扩展的目的。
  • 环境建议:
    • 操作系统:CentOS 7/8Debian 11/12 等稳定发行版。
    • Java:JDK 8JDK 11(与所用 Tomcat 版本匹配)。
    • Tomcat:9.x 为主流稳定版本。
    • 网络:同一二层网段/VPC,确保节点间互通;若跨机房,优先改用单播或外部会话存储。
  • 基础安装示例(以 CentOS 为例):
    • 安装 JDK:sudo yum install -y java-1.8.0-openjdk-devel
    • 安装 Tomcat:
      wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.56/bin/apache-tomcat-9.0.56.tar.gz
      tar xvf apache-tomcat-9.0.56.tar.gz -C /opt
      sudo mv /opt/apache-tomcat-9.0.56 /opt/tomcat
      以上为后续配置与负载均衡的前置条件。

二 配置 Tomcat 集群节点

  • 多实例端口隔离(同一台机器演示两个实例):
    • 修改 server.xml 中的 Server port(如:8005/8006)、Connector port(如:8080/8081)、AJP port(如:8009/8010)、jvmRoute(如:tomcat1/tomcat2)。
    • 示例(仅展示关键差异):
      • 实例1:Server port=8005;Connector port=8080;AJP=8009;jvmRoute=tomcat1
      • 实例2:Server port=8006;Connector port=8081;AJP=8010;jvmRoute=tomcat2
  • 启用内置集群(推荐在每个实例的 Engine 内加入 SimpleTcpCluster):
    • 最小可用配置(放入 Engine 标签内):
    • 常用完整配置(含会话管理与复制阀,便于开箱即用):













    • 说明:
      • 组播地址 228.0.0.4:45564 为示例,生产可自定义;同一集群内必须一致。
      • Receiver port(如 4000)需在每个实例上唯一。
      • 若使用 AJP 接入前端(httpd/mod_jk),请同步配置各实例的 AJP 端口与 jvmRoute
  • 应用会话可分发:在应用的 WEB-INF/web.xml 中加入 ,并确保放入 session 的对象实现 Serializable

三 配置负载均衡

  • Nginx 示例(HTTP 反向代理,位于前端):
    • 安装:sudo yum install -y nginx(或 apt 安装)
    • 配置 /etc/nginx/nginx.conf(http 段内):
      upstream tomcat_cluster {
      server 192.168.1.11:8080;
      server 192.168.1.12:8080;

      可按需开启:ip_hash; 或配置权重/健康检查

      }
      server {
      listen 80;
      server_name yourdomain.com;
      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 systemctl start nginx && sudo systemctl enable nginx
  • 可选方案:使用 HAProxyApache httpd + mod_jk/AJP 实现负载均衡与会话粘滞(Sticky Session)。

四 启动与验证

  • 启动顺序:先启动所有 Tomcat 实例,再启动 Nginx/HAProxy
  • 基础验证:
    • 访问前端地址,刷新多次,观察各 Tomcat 实例日志是否交替命中
    • 登录应用,写入会话数据(如用户标识),在另一节点继续操作,验证会话保持(DeltaManager 复制生效)。
    • 查看 catalina.outlocalhost_access_log,确认无端口冲突与集群加入异常。
  • 常见问题速查:
    • 端口冲突:检查 Server/Connector/AJP/Receiver 端口唯一性。
    • 组播不通:确认云厂商安全组/物理交换机未屏蔽 IGMP/组播,或改用单播配置。
    • 会话不复制:确认应用 web.xml,放入 session 的对象可序列化,且 ReplicationValve 已启用。

五 生产优化与安全建议

  • 会话与一致性:读多写少场景可用 DeltaManager;跨地域/大规模建议引入 外部会话存储(如 Redis)替代内置复制。
  • 部署方式:优先使用外部共享静态资源(Nginx 静态目录/CDN),减轻节点压力。
  • 粘性与会话亲和:无状态优先;如需粘性,可在 Nginx 使用 ip_hash 或基于 Cookie 的会话保持。
  • 监控与告警:采集 JVM/线程/GC/连接池 指标与访问日志,设置节点宕机与复制延迟告警。
  • 启动与运行身份:建议使用非 root 专用用户运行 Tomcat,并配置 systemd 服务(示例模板见下文)。
  • 网络与内核:开启 TCP keepalive,合理设置 ulimit -n,避免文件句柄不足。

附:systemd 服务模板(多实例示例)

  • 文件:/etc/systemd/system/tomcat1.service
    [Unit]
    Description=Tomcat 9 servlet container
    After=network.target

    [Service]
    Type=forking
    User=tomcat
    Group=tomcat
    Environment=“JAVA_HOME=/usr/lib/jvm/default-java”
    Environment=“CATALINA_PID=/opt/tomcat1/temp/tomcat.pid”
    Environment=“CATALINA_HOME=/opt/tomcat”
    Environment=“CATALINA_BASE=/opt/tomcat1”
    Environment=“CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC”
    ExecStart=/opt/tomcat/bin/startup.sh
    ExecStop=/opt/tomcat/bin/shutdown.sh
    Restart=always

    [Install]
    WantedBy=multi-user.target

  • CATALINA_BASE 指向各实例目录(如 /opt/tomcat1/opt/tomcat2),分别启用服务:
    sudo systemctl daemon-reload && sudo systemctl enable --now tomcat1 tomcat2。

0