温馨提示×

Linux上Tomcat集群搭建方法

小樊
41
2025-12-06 23:14:10
栏目: 智能运维

Linux上Tomcat集群搭建方法

一 架构与准备

  • 架构建议:前端使用NginxApache HTTP Server做负载均衡,后端部署2–NTomcat实例,开启会话复制(DeltaManager/BackupManager),实现高可用与横向扩展。
  • 环境与版本建议:操作系统选用CentOS 7/8Ubuntu 20.04+JDK 1.8;Tomcat 8.5/9.x
  • 基础检查:确保各节点时间同步(NTP)主机名可解析防火墙/安全组放通相关端口(HTTP/HTTPS、AJP、集群通信端口)。

二 安装与多实例端口规划

  • 安装单实例:下载并解压 Tomcat 至如**/opt/tomcat**;设置环境变量(示例):
    • 编辑**/etc/profile**或对应 profile 文件:
      • export JAVA_HOME=/usr/java/jdk1.8.0_xxx
      • export CATALINA_HOME=/opt/tomcat
    • 使配置生效:source /etc/profile
  • 复制多实例:
    • 复制目录:cp -r /opt/tomcat /opt/tomcat01;cp -r /opt/tomcat /opt/tomcat02
  • 端口规划(示例两台机器各两实例,避免冲突):
    • 实例 | HTTP | AJP | 关闭端口 | 集群 Receiver 端口
    • tomcat01 | 8080 | 8009 | 8005 | 4000
    • tomcat02 | 8081 | 8010 | 8006 | 4001
    • tomcat03 | 8082 | 8011 | 8007 | 4002
    • tomcat04 | 8083 | 8012 | 8008 | 4003
  • 修改各实例的conf/server.xml
    • 仅示例关键 Connector 与 Server 端口(其余保持默认或按需调整):
      • <Connector port=“8080/8081/8082/8083” protocol=“HTTP/1.1” … />
    • 如需开机自启,可为每个实例配置 systemd 服务或 rc.local 启动脚本(示例思路:在 /etc/profile 定义多个 CATALINA_BASE/CATALINA_HOME,在各自的 catalina.sh 中识别并使用对应 BASE)。

三 配置Tomcat集群与会话复制

  • 在每台实例的conf/server.xmlEngine/Host内加入或启用Cluster(示例为 SimpleTcpCluster,使用 DeltaManager,适合大多数同应用多节点场景):
    • 关键要点:
      • 同一集群使用相同的组播地址/端口(示例:228.0.0.4:45564)。
      • 同机多实例需配置不同的Receiver 端口(示例:4000/4001/4002/4003)。
      • 使用ReplicationValve并在 filter 中排除静态资源,减少复制流量。
      • 应用需在web.xml中加入:
    • 示例片段(放到 内):
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
               channelSendOptions="8">
        <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=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
        <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                  tempDir="/tmp/war-temp/"
                  deployDir="/tmp/war-deploy/"
                  watchDir="/tmp/war-listen/"
                  watchEnabled="false"/>
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>
      
    • 可选优化(异步复制、按应用复制):
      • channelSendOptions设为10(异步并开启确认)或4(同步);
      • 多应用且节点较多时,可将DeltaManager替换为BackupManager(仅向部署了当前应用的节点复制),但成熟度与测试面相对有限,需充分验证。
    • 应用侧:在应用的WEB-INF/web.xml中加入,并确保会话对象可序列化。

四 配置负载均衡

  • 方案A 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;
        server 192.168.1.103:8080;
        # 可选:开启会话保持(基于 JSESSIONID 的 cookie)
        # ip_hash; 或 使用 sticky session 模块
      }
      
      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
  • 方案B Apache HTTP Server + mod_jk(AJP)
    • 启用模块并配置 workers.properties(定义 AJP 节点与负载权重),在 httpd.conf 或虚拟主机中使用BalancerMember指向各实例的AJP 端口(如8009/8010),示例思路:
      • BalancerMember ajp://192.168.1.101:8009 route=tomcat01
      • BalancerMember ajp://192.168.1.102:8010 route=tomcat02
    • 如需会话粘滞,可结合jvmRouteJSESSIONID路由。

五 启动验证与常见问题

  • 启动与验证
    • 启动所有 Tomcat:/opt/tomcat0*/bin/startup.sh
    • 查看进程与端口:ps -ef | grep tomcat;ss -lntp | grep -E ‘808|8009|4000’
    • 访问 Nginx/Apache 前端域名或 IP,刷新与切换节点,确认业务正常与页面一致。
  • 会话复制验证
    • 部署含**的测试应用,登录后在多个节点间切换,确认登录状态不丢失**;查看各实例catalina.out是否有会话复制日志(如“replication”)。
  • 常见问题与排查
    • 节点无法互相发现:检查组播地址/端口一致、网络可达、云环境安全组/防火墙放通45564(UDP/TCP 视环境)、必要时将Receiver 地址固定为本机 IP 而非 auto。
    • 同机多实例端口冲突:确保Server/HTTP/AJP/Receiver端口均唯一。
    • 复制性能与可靠性:根据业务选择同步/异步(channelSendOptions),静态资源建议通过filter排除复制;多应用可考虑BackupManager并充分回归测试。
    • 防火墙/SELinux:开放必要端口(HTTP/HTTPS、AJP、集群通信),必要时调整 SELinux 策略或临时设为 permissive 验证问题所在。

0