首页主机资讯Tomcat在Ubuntu中如何进行集群配置

Tomcat在Ubuntu中如何进行集群配置

时间2025-12-01 11:14:04发布访客分类主机资讯浏览300
导读:Ubuntu下搭建 Tomcat 集群的标准做法 一 环境准备与约定 准备至少2台 Ubuntu 服务器(同一内网),安装相同版本的 JDK 与 Tomcat。 规划实例端口:每个节点需确保 SHUTDOWN、HTTP、AJP、Rece...

Ubuntu下搭建 Tomcat 集群的标准做法


一 环境准备与约定

  • 准备至少2台 Ubuntu 服务器(同一内网),安装相同版本JDKTomcat
  • 规划实例端口:每个节点需确保 SHUTDOWN、HTTP、AJP、Receiver 端口互不冲突;同一台机器跑多个实例时尤其要注意。
  • 统一主机名解析:在 /etc/hosts 为各节点配置主机名与内网 IP,保证 InetAddress.getLocalHost().getHostAddress() 返回非 127.0.0.1 的地址,避免集群通信异常。
  • 时间同步:所有节点启用 NTP 时间同步,避免因时间漂移导致会话过期判断异常或集群不稳定。
  • 防火墙放行:开放 AJP 8009(如使用 AJP)、HTTP 8080、以及集群通信端口(见下文的 Receiver 端口组播 45564/UDP)。

二 配置 Tomcat 集群与会话复制

  • 方式 A 快速默认集群(适合节点数较少,如少于10台)

    • $CATALINA_HOME/conf/server.xml 中取消注释或新增:
      <
          Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
          
      
    • 将需要会话复制的应用在其 WEB-INF/web.xml 中加入:
      <
          distributable/>
          
      
    • 确保放入 Session 的对象实现 java.io.Serializable。以上即可完成最简集群与会话复制。
  • 方式 B 显式配置(可控性与可观测性更好)

    • 内添加如下 Cluster 配置,按需调整端口与网卡:
      <
          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=""/>
          
        <
          ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
          
      <
          /Cluster>
          
      
    • 关键说明:
      • Membership 使用组播 228.0.0.4:45564/UDP 发现成员;跨机房或云环境若无组播,可改用 StaticMembershipInterceptor 静态配置成员。
      • Receiver port=“4000” 为接收复制消息端口,同一物理机多实例需改为不同端口。
      • Manager 可用 DeltaManager(全量复制,适合小集群)或 BackupManager(备份复制,适合较大集群)。
      • 将需要会话复制的应用加入 ,并确保会话属性对象可序列化。

三 配置负载均衡

  • 方案 1 Apache HTTP Server + mod_jk(AJP)

    • 安装模块:sudo apt-get install libapache2-mod-jk
    • 配置 workers.properties(示例为两台节点):
      worker.list=loadbalancer,status
      worker.tomcat1.port=8009
      worker.tomcat1.host=192.168.0.11
      worker.tomcat1.type=ajp13
      worker.tomcat1.lbfactor=1
      
      worker.tomcat2.port=8009
      worker.tomcat2.host=192.168.0.12
      worker.tomcat2.type=ajp13
      worker.tomcat2.lbfactor=1
      
      worker.loadbalancer.type=lb
      worker.loadbalancer.balance_workers=tomcat1,tomcat2
      worker.loadbalancer.sticky_session=1
      worker.status.type=status
      
    • 启用模块并配置 mod_jk
      a2enmod jk
      # /etc/apache2/mods-enabled/jk.conf 或 apache2.conf 中
      LoadModule jk_module modules/mod_jk.so
      JkWorkersFile /path/to/workers.properties
      JkLogFile   /var/log/apache2/mod_jk.log
      JkLogLevel  info
      
      <
          VirtualHost *:80>
          
        ServerName yourdomain.com
        JkMount  /*  loadbalancer
        JkMount  /jk-status status
      <
          /VirtualHost>
      
      
    • 重启 Apache:sudo systemctl restart apache2。
  • 方案 2 Nginx 或 HAProxy(HTTP)

    • Nginx 示例(HTTP 轮询):
      upstream backend {
          
        server 192.168.0.11:8080;
          
        server 192.168.0.12:8080;
          
        # 如需会话保持(粘性会话),可添加:ip_hash;
      
      }
      
      server {
          
        listen 80;
      
        location / {
          
          proxy_pass http://backend;
      
        }
      
      }
          
      
    • HAProxy 示例(HTTP 轮询):
      frontend http-in
        bind *:80
        default_backend servers
      backend servers
        balance roundrobin
        server s1 192.168.0.11:8080 check
        server s2 192.168.0.12:8080 check
      
    • 提示:使用 HTTP 代理时,Tomcat 侧通常无需开启 AJP;使用 AJP 时选择 mod_jk 更常见。

四 部署与验证

  • 部署应用:将应用(已加入 )部署到各节点的 webapps,或统一共享目录;确保应用会话对象可序列化。
  • 启动顺序:先启动所有 Tomcat 实例,再启动 Apache/Nginx/HAProxy
  • 验证要点:
    • 访问应用,观察日志是否出现 JOINED/MESSAGE 等集群事件;使用 PSI Probe 等工具查看节点与会话状态。
    • 会话粘性与复制:
      • 使用 mod_jk + sticky_session=1 时,刷新页面 JSESSIONID 后缀通常不变;关闭当前节点后,若会话仍可用,说明会话复制生效(或会话保持生效)。
      • 关闭 sticky_session 或节点宕机后仍能保持登录,说明会话复制在集群内生效。
    • 组播连通性(如采用组播发现):在节点上抓包或利用工具测试 228.0.0.4:45564/UDP 的收发,确保网络与防火墙策略允许。

五 常见问题与优化

  • 节点无法互相发现
    • 检查 组播地址/端口 一致、网络与防火墙放行 45564/UDP;云环境若无组播,改用 StaticMembershipInterceptor 静态成员配置。
    • 确认 Receiver address 为本机非 127.0.0.1 的 IP,且多实例 Receiver port 不冲突。
  • 会话不复制或丢失
    • 应用 web.xml 缺少 、会话对象未实现 Serializable、或复制 Valve 未生效。
    • 时间不同步导致会话过期判断异常,启用 NTP 同步时间。
  • 单台机器运行多实例
    • 必须修改 SHUTDOWN、HTTP、AJP、Receiver 端口,避免端口冲突;必要时为各实例设置不同的 jvmRoute(配合 AJP 粘性会话)。
  • 高可用增强
    • Apache/Nginx/HAProxy 前增加 Keepalived 实现 VRRP 虚拟 IP,避免单点故障。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Tomcat在Ubuntu中如何进行集群配置
本文地址: https://pptw.com/jishu/759906.html
Debian中Go语言如何保障安全性 Ubuntu下Tomcat内存溢出怎么解决

游客 回复需填写必要信息