温馨提示×

Tomcat在CentOS中的集群如何搭建

小樊
36
2025-12-19 13:03:57
栏目: 智能运维

架构与准备

  • 架构建议:前端使用 Nginx 做反向代理与负载均衡,后端 2 台或以上 Tomcat 组成集群,应用无状态或会话共享(推荐外置 Redis 或 Tomcat 内置组播复制)。
  • 环境建议:CentOS 7/8JDK 8Tomcat 9(各节点版本保持一致)。
  • 安装基础组件(两台 Tomcat 节点均执行):
    • 安装 JDK
      • sudo yum install -y java-1.8.0-openjdk-devel
    • 安装 Tomcat 9(示例)
      • 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 && sudo mv apache-tomcat-9.0.56 /opt/tomcat
  • 规划端口(避免单机多实例冲突):
    • 节点1:HTTP 8080,AJP 8009,关闭端口 8005,Receiver 端口 4000
    • 节点2:HTTP 8081,AJP 8010,关闭端口 8006,Receiver 端口 4001
  • 防火墙放行(两台 Tomcat 与 Nginx 节点均需放行):
    • sudo firewall-cmd --permanent --add-port={8080,8081,8009,8010,80}/tcp
    • sudo firewall-cmd --reload
  • 可选:在 Tomcat 的 bin 目录创建 setenv.sh(便于自定义内存与启动参数):
    • JAVA_OPTS=“-Xms512m -Xmx1024m -Dfile.encoding=UTF-8”

Tomcat 节点配置

  • 为引擎设置唯一路由标识(用于粘性会话与识别节点):
    • 节点1:
    • 节点2:
  • 启用集群会话复制(示例为组播复制,适合同网段;跨机房建议改用外置会话存储):
    • 内加入(两台节点基本一致,Receiver 端口不同):
      <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"   <!-- 节点2改为4001 -->
                    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=""/>
        <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>
      
  • 应用开启分布式会话:在应用的 WEB-INF/web.xml 中加入
  • 单机多实例时,确保各实例的 Server port、HTTP Connector port、AJP Connector port、Receiver port 均不冲突。

负载均衡配置

  • 安装 Nginx(负载均衡器节点执行):
    • sudo yum install -y nginx
  • 配置反向代理与负载均衡(/etc/nginx/nginx.conf 或 /etc/nginx/conf.d/tomcat.conf):
    upstream tomcat_cluster {
        # 可按需开启 ip_hash 实现会话粘滞(不建议与外置会话存储混用)
        # ip_hash;
        server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
        server 192.168.1.12:8081 max_fails=3 fail_timeout=30s;
    }
    
    server {
        listen 80;
        server_name _;
        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;
            proxy_connect_timeout 5s;
            proxy_send_timeout 10s;
            proxy_read_timeout 30s;
        }
    }
    
  • 启动与开机自启:
    • sudo systemctl enable --now nginx
  • 可选(Apache + mod_jk):使用 AJP 1.3 与 workers.properties 分发请求,配置 sticky_session=1 实现会话粘滞。

会话共享方案对比与落地

  • 内置组播复制(DeltaManager):配置简单、同网段效果好;跨机房/云上 VPC 多播受限,扩容到大量节点时复制流量较大。
  • 外置会话存储(推荐):将 Session 存入 RedisMemcached,解耦 Tomcat、易横向扩展、跨机房友好。
    • Redis 方案示例(Tomcat 端引入会话管理器与依赖,示例组件:tomcat-redis-session-manager、Jedis、commons-pool2):
      • 将相关 JAR 放入 $CATALINA_HOME/lib;在 conf/context.xml 的 中加入:
        <Valve className="org.apache.catalina.valves.RemoteIpValve"
               remoteIpHeader="X-Forwarded-For"
               protocolHeader="X-Forwarded-Proto"/>
        <Manager className="org.redisson.tomcat.RedissonSessionManager"
                 configPath="${catalina.base}/conf/redisson.yaml"
                 readMode="REDIS"
                 updateMode="DEFAULT"/>
        
      • 配置 redisson.yaml(示例单机 Redis):
        singleServerConfig:
          address: "redis://10.11.10.99:6379"
          password: "redis_123456"
        
      • 部署后重启 Tomcat,会话将存储到 Redis。
    • Memcached 方案:使用 memcached-session-manager(MSM),配置 Sticky 或 Non-Sticky 模式,适合已有 Memcached 基础设施的场景。

部署验证与常见问题

  • 部署与验证
    • 部署测试应用(含 ),或打印 session.getId()jvmRoute
      • 多次刷新页面,观察请求在 8080/8081 间分发;登录后切换节点,确认会话不丢失(粘滞或外置会话生效)。
    • 查看集群日志:
      • tail -f $CATALINA_HOME/logs/catalina.out | grep -i cluster
      • 关注 Membership 发现、复制消息、节点加入/离开等信息。
  • 常见问题排查
    • 端口冲突:单机多实例需确保 Server port、HTTP、AJP、Receiver 均唯一。
    • 组播不通:跨网段/云环境多播被限制,改用外置会话存储(Redis/Memcached)。
    • 会话粘滞与一致性:开启 ip_hash 可实现粘滞,但与外置会话存储混用可能导致误解;建议统一策略。
    • 防火墙/安全组:放行 80、8080、8081、8009、8010 等端口。
    • 应用一致性:使用 DeltaManager 时,各节点应用版本与部署内容需保持一致;使用 BackupManager 可容忍差异。

0