温馨提示×

Linux上Tomcat集群负载均衡配置

小樊
39
2025-12-06 23:20:13
栏目: 云计算

Linux上Tomcat集群负载均衡配置

一、架构与准备

  • 组件选型
    • 负载均衡器:优先选用 NginxApache HTTP Server(mod_proxy/mod_jk)
    • 通信方式:同机房优先 AJP 1.3(性能更好),跨公网或不便启用AJP时可用 HTTP
  • 基础环境
    • 各节点安装相同版本的 JDKTomcat,统一时区与字符集,准备待发布的 WAR 应用。
    • 规划实例端口,避免同机多实例端口冲突;准备防火墙放行 80/443/8080/8009 等端口。
  • 建议拓扑
    • 至少 2 台 Tomcat 构成集群,前置 1 台 Nginx/Apache 做反向代理与负载均衡;生产可扩展到 3–4 节点 提升容错。

二、方案一 Nginx + Tomcat(HTTP)

  • 负载均衡器配置(/etc/nginx/nginx.conf 或 /etc/nginx/conf.d/tomcat.conf)
    • 核心要点:定义 upstream、开启长连接、传递客户端真实 IP 与协议头。
    • 示例:
      upstream tomcat_cluster {
          least_conn;                 # 可选:最小连接数
          server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
          server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
          keepalive 32;                # 与后端保持的空闲连接数
      }
      
      server {
          listen 80;
          server_name app.example.com;
      
          location / {
              proxy_pass http://tomcat_cluster;
              proxy_http_version 1.1;
              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_next_upstream error timeout http_502 http_503 http_504;
          }
      
          # 静态资源建议由Nginx直接服务
          location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
              root /var/www/static;
              expires 7d;
          }
      }
      
    • 验证与热加载:
      • 检查配置:nginx -t
      • 热加载:nginx -s reload
  • Tomcat 侧要点
    • 保持默认 HTTP Connector 8080 监听;如多实例同机,修改 Server portHTTP 8080AJP 8009 避免冲突。
    • 为启用会话保持(Sticky),在 Engine 增加 jvmRoute(示例:jvmRoute=“node1”),并确保应用 web.xml 包含

三、方案二 Apache HTTP Server + Tomcat(AJP,mod_proxy 或 mod_jk)

  • 使用 mod_proxy_ajp(推荐,配置简洁)
    • 启用模块(httpd.conf 或 /etc/httpd/conf.modules.d/00-proxy.conf):
      LoadModule proxy_module modules/mod_proxy.so
      LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
      LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
      LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
      # 可选:按流量/繁忙度调度
      # LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
      # LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
      
    • 反向代理与负载均衡:
      <Proxy "balancer://mycluster">
          BalancerMember "ajp://192.168.1.11:8009" route=node1 loadfactor=1
          BalancerMember "ajp://192.168.1.12:8009" route=node2 loadfactor=1
          ProxySet lbmethod=byrequests
          # 可选:热备
          # BalancerMember "ajp://192.168.1.13:8009" status=+H
      </Proxy>
      
      ProxyPass        /  "balancer://mycluster/"
      ProxyPassReverse /  "balancer://mycluster/"
      
      # 可选:管理页面
      <Location "/balancer-manager">
          SetHandler balancer-manager
          Require ip 127.0.0.1 192.168.1.0/24
      </Location>
      
  • 使用 mod_jk(JK Workers)
    • 启用模块并配置 workers.properties:
      LoadModule jk_module modules/mod_jk.so
      JkWorkersFile /etc/httpd/conf/workers.properties
      JkLogFile     /var/log/httpd/mod_jk.log
      JkLogLevel    info
      
      worker.list=loadbalancer
      worker.node1.type=ajp13
      worker.node1.host=192.168.1.11
      worker.node1.port=8009
      worker.node1.lbfactor=1
      
      worker.node2.type=ajp13
      worker.node2.host=192.168.1.12
      worker.node2.port=8009
      worker.node2.lbfactor=1
      
      worker.loadbalancer.type=lb
      worker.loadbalancer.balance_workers=node1,node2
      worker.loadbalancer.sticky_session=1
      
    • 在 httpd.conf 挂载应用:
      JkMount /* loadbalancer
      # 或按路径:JkMount /app/* loadbalancer
      
  • Tomcat 侧要点
    • 启用 AJP Connector(默认端口 8009),并在 Engine 设置 jvmRoute(与上面 route 一致:node1/node2)。
    • 部署应用并在 web.xml 加入

四、Tomcat集群与会话保持

  • 内置集群 SimpleTcpCluster(用于节点间会话复制)
    • server.xmlEngine 内加入(示例为最小可用配置,按实际网络调整):
      <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" 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.MessageDispatch15Interceptor"/>
        </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>
      
    • 注意:同机多实例需确保 Receiver port(如 4000) 唯一;多机部署可使用默认 auto/不同端口。
  • 会话保持策略
    • 粘性会话(Sticky):Nginx 可用 ip_hash;Apache mod_proxy 可用 stickysession=JSESSIONID;mod_jk 设置 sticky_session=1。适合多数有状态业务,减少复制开销。
    • 会话复制(DeltaManager):配置如上,应用 web.xml。适合容错优先,注意网络与序列化开销。
    • 外部会话存储:大规模或跨机房建议 Redis/Memcached 集中会话(如 Tomcat Redis Session Manager),解耦集群规模与复制压力。

五、验证与运维要点

  • 健康检查与失败隔离
    • Nginx:在 upstream 使用 max_fails/fail_timeoutproxy_next_upstream;按需增加主动健康检查(商业版或配合脚本/第三方模块)。
    • Apache:使用 BalancerMemberstatus=+H 配置热备;mod_jk 可通过 worker.*.lbfactorsticky_session 调整。
  • 日志与排错
    • Nginx:access/error 日志、upstream 响应码分布。
    • Apache:error_log、mod_jk 日志(JkLogLevel info/debug)。
    • Tomcat:catalina.out、localhost..log,关注 JVM RouteCluster 启动与复制日志。
  • 静态资源与压缩
    • 由负载均衡器直接服务静态资源并开启 gzip,降低后端压力。
  • 监控与调优
    • 监控:连接数、线程池、请求耗时、会话复制延迟;必要时引入 Prometheus + Grafana
    • 调优:Tomcat 线程池与连接器、Nginx/Apache 连接复用与超时、JVM 堆与 GC 策略。

0