温馨提示×

Linux环境下Tomcat如何集群部署

小樊
39
2025-11-25 04:14:49
栏目: 智能运维

Linux环境下Tomcat集群部署

一 架构与准备

  • 架构建议:前端使用Nginx/Apache HTTPD做负载均衡,后端部署2个及以上Tomcat实例组成集群,开启会话复制(DeltaManager),实现高可用与横向扩展。
  • 环境与版本:操作系统建议CentOS 7/8Ubuntu 20.04+JDK 1.8;Tomcat建议8.5/9.x版本一致。
  • 基础准备:安装JDK并配置环境变量(如JAVA_HOME),下载解压Tomcat到不同目录(如**/opt/tomcat1**、/opt/tomcat2),保证各实例端口不冲突。

二 单节点Tomcat基础配置

  • 目录与权限:解压Tomcat后,确保**/opt/tomcat/bin/*.sh**具备执行权限。
  • 环境变量:在**/etc/profile或用户环境配置CATALINA_HOME/CATALINA_BASE**,便于多实例管理。
  • 端口规划(示例两节点同机):
    • Tomcat1:Server Port 8005,HTTP 8080,AJP 8009,Receiver 4000
    • Tomcat2:Server Port 8006,HTTP 8081,AJP 8010,Receiver 4001
  • 多机部署时,各实例的Receiver端口可相同;同机必须不同,避免端口占用。

三 集群会话复制配置

  • server.xmlEngineHost内加入Cluster配置(以Tomcat 8.5为例):
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
  <Manager className="org.apache.catalina.ha.session.DeltaManager"
           expireSessionsOnShutdown="false"
           notifyListenersOnReplication="true"/>
  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Membership className="org.apache.catalina.tribes.membership.McastService"
                address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
              address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/>
    <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
      <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
    </Sender>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
  </Channel>
  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="false"/>
  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
  • 在应用的META-INF/context.xml或全局conf/context.xmlContext上添加:
<Context distributable="true">
  • 关键说明:
    • DeltaManager会将Session变更复制到所有节点,适合各节点应用一致的场景;如需差异化部署可考虑BackupManager
    • Membership使用组播地址228.0.0.4:45564发现节点;同网段可用,跨网段或云环境常因组播受限需改用单播/TCP或前置L4/L7负载均衡。
    • Receiver address同机多实例请设为本机IP或明确绑定,避免“auto”引发识别问题;必要时将port设为不同值。

四 负载均衡部署

  • Nginx示例(HTTP代理,位于**/etc/nginx/nginx.conf/etc/nginx/conf.d/upstream.conf**):
upstream tomcat_cluster {
  server 192.168.1.101:8080;
  server 192.168.1.102:8080;
  # 可选:ip_hash; 或 least_conn;
}

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;
  }
}
  • 使配置生效:执行nginx -t && systemctl reload nginx
  • 说明:也可用Apache httpd + mod_proxy/mod_jk;若需会话粘滞可启用ip_hash或基于JSESSIONID的路由策略(注意粘滞与复制的取舍)。

五 启动验证与常见问题

  • 启动与验证:依次启动各Tomcat与Nginx,访问应用并通过日志与监控确认:
    • 查看catalina.out是否出现“Joining cluster/Member added”等信息;
    • 访问应用,登录后获取JSESSIONID,在另一节点日志中确认session replication
    • 停掉一个节点,验证业务仍可用(会话保持或复制生效)。
  • 常见问题与处理:
    • 节点无法互相发现:检查组播是否被网络/云安全组限制;同机多实例确保Receiver port唯一;必要时改为单播通信或前置负载均衡。
    • 会话未复制:确认应用distributable=true,且各节点部署内容一致(使用DeltaManager时);检查ReplicationValve是否生效。
    • 启动日志提示“skipping state transfer. No members active in cluster group”:通常是Membership参数不一致或网络不通,核对address/port/frequency/dropTime并排查防火墙。
    • 端口冲突:核对Server/HTTP/AJP/Receiver端口在各实例唯一。

0