温馨提示×

Tomcat在Linux上如何实现集群

小樊
46
2025-11-29 03:41:41
栏目: 智能运维

Linux上实现Tomcat集群的实用方案

一、架构与准备

  • 架构选型:前端使用Nginx/HAProxy做负载均衡,后端部署2个及以上Tomcat实例;会话保持可用Sticky会话复制两种策略。
  • 环境与版本:安装JDK 8(或与应用兼容的版本),各节点使用相同版本的Tomcat(如Tomcat 9),保证目录结构与配置一致,便于维护。
  • 网络与端口:同一台机器部署多实例时需避免端口冲突;跨机器部署需开放相应TCP端口(如AJP/HTTP/集群通信端口)。

二、Tomcat节点集群配置

  • 修改server.xml
    • 在多实例同机时,调整各实例的Server port、Connector port、AJP port等,避免冲突;跨机部署保持各实例端口唯一。
    • 在**上设置jvmRoute**(如:tomcat1、tomcat2),用于会话粘滞与识别节点。示例:
      <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
      
    • 在****内启用集群(将默认片段粘贴到中),常用组件包含:
      • Manager:会话管理器,常用DeltaManager(全量复制)或BackupManager(备份复制)。
      • Channel/Transport:使用NioReceiverPooledParallelSender提升复制性能。
      • Membership:组播发现,默认228.0.0.4:45564(可按网络环境调整或改用单播)。
      • ValveReplicationValve用于触发会话复制;JvmRouteBinderValve用于粘滞会话绑定。
      • ClusterListenerClusterSessionListener、JvmRouteSessionIDBinderListener
  • 配置context.xml或web.xml
    • conf/context.xml上添加:(或在每个应用的web.xml中使用**),并确保放入会话的对象实现Serializable**。

三、负载均衡器配置

  • Nginx示例(HTTP代理)
    http {
      upstream tomcat_cluster {
        server 192.168.1.11:8080;
        server 192.168.1.12:8080;
        # 可选:ip_hash; 实现会话粘滞(Sticky)
      }
      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;
        }
      }
    }
    
  • Apache HTTP Server + mod_jk(AJP)
    • 启用模块并配置workers.properties与JkMount,示例要点:
      worker.list=controller,tomcat1,tomcat2
      worker.tomcat1.port=8009
      worker.tomcat1.host=192.168.1.11
      worker.tomcat1.type=ajp13
      worker.tomcat2.port=8009
      worker.tomcat2.host=192.168.1.12
      worker.tomcat2.type=ajp13
      worker.controller.type=lb
      worker.controller.balance_workers=tomcat1,tomcat2
      worker.controller.sticky_session=1
      
    • 注意:jvmRoute必须与workers.properties中的节点名一致,用于Sticky Session。

四、启动与验证

  • 启动顺序:先启动所有Tomcat实例,再启动Nginx/Apache;使用tail -f logs/catalina.out观察各节点是否加入集群、是否出现复制相关日志。
  • 验证要点:
    • 会话粘滞:登录应用后,刷新或新开浏览器标签,检查是否仍落在同一后端(使用JSESSIONID后缀或日志确认)。
    • 会话复制:在应用中打印session属性,停止当前处理节点,确认会话仍可用(无中断或重复登录)。
    • 负载均衡:通过多客户端或压测工具观察请求是否按权重分发到不同Tomcat实例。

五、常见问题与优化

  • 组播不通:云环境或容器网络常禁用IGMP/组播,可将Membership改为StaticMembershipInterceptor使用单播,或改用Nginx/HAProxy + Sticky方案规避组播依赖。
  • 端口冲突:同机多实例需确保Server、HTTP、AJP、Receiver端口均唯一;跨机部署需放通相关端口与防火墙策略。
  • 序列化问题:放入session的对象及嵌套对象必须实现Serializable,否则复制失败或抛出序列化异常。
  • 复制性能:会话数据量大时优先使用DeltaManager并调优ReplicationValve filter(过滤静态资源),必要时考虑BackupManager或外置会话存储(如数据库/Redis)。

0