温馨提示×

Ubuntu Tomcat集群配置指南

小樊
44
2025-12-19 22:26:17
栏目: 智能运维

Ubuntu Tomcat 集群配置指南

一 架构与准备

  • 架构建议:前端使用Nginx/Apache HTTP Server + mod_jk/HAProxy做负载均衡,后端部署2–N 个 Tomcat 实例;会话通过 Tomcat 内置的集群会话复制保持可用。
  • 节点规划示例:
    • 负载均衡:192.168.1.40(Nginx 或 Apache+mod_jk)
    • Tomcat A:192.168.1.50:8080(AJP 8009
    • Tomcat B:192.168.1.51:8080(AJP 8009
  • 基础要求:
    • 所有节点安装相同版本JDKTomcat,系统时间通过 NTP 同步。
    • 各节点能通过主机名解析到非 127.0.0.1的本机地址(检查 /etc/hosts 或网卡地址)。
    • 防火墙放行:Tomcat 8080/8009、负载均衡 80/443,以及集群通信端口(见下文)。
    • 需要会话粘滞时,负载均衡开启sticky session;若应用可改造,优先使用无状态会话或外部会话存储(如 Redis)。

二 安装与基础配置

  • 安装 JDK 与 Tomcat(示例为解压安装,生产建议使用包管理或标准化目录):
    • 配置环境变量(/etc/profile 或 systemd 环境文件):
      • JAVA_HOME、CATALINA_HOME、PATH
    • 验证:java -version、catalina.sh version
  • 统一应用部署:将应用 WAR 放到各实例的 webapps/,或使用外部共享目录/自动化发布。
  • 重要提示:集群内各实例的应用版本与配置需保持一致,避免路由与会话兼容性问题。

三 配置 Tomcat 集群与会话复制

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

    • 在 server.xml 的 中取消注释或新增:
    • 该默认配置使用组播自动发现成员,适合快速验证与小规模部署。
  • 方式 B 显式配置(可控性与可观测性更好)

    • 内添加如下 Cluster(示例为两台节点,按实际修改 IP/端口):
      <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 为默认组播地址/端口,同一集群需一致;跨网段或云环境常禁用组播,改用静态配置(见下节排错)。
      • Receiver:port=4000 为接收端口,单机多实例需不同;address 建议设为本机非回环地址(auto 通常可用)。
      • 应用需标记为可分布式:在应用的 WEB-INF/web.xml 中加入
      • 会话对象需实现 java.io.Serializable,否则复制会失败或不完整。

四 配置负载均衡

  • 方案 1 Apache HTTP Server + mod_jk

    • 安装:sudo apt-get install libapache2-mod-jk
    • 配置 /etc/apache2/mods-enabled/jk.conf(或 httpd.conf):
      • LoadModule jk_module modules/mod_jk.so
      • JkWorkersFile /etc/libapache2-mod-jk/workers.properties
      • JkLogFile /var/log/apache2/mod_jk.log
      • JkLogLevel info
      • JkMount /* loadbalancer
      • JkMount /jk-status jkstatus
    • workers.properties 示例:
      worker.list=loadbalancer,status
      worker.tomcat1.type=ajp13
      worker.tomcat1.host=192.168.1.50
      worker.tomcat1.port=8009
      worker.tomcat1.lbfactor=1
      
      worker.tomcat2.type=ajp13
      worker.tomcat2.host=192.168.1.51
      worker.tomcat2.port=8009
      worker.tomcat2.lbfactor=1
      
      worker.loadbalancer.type=lb
      worker.loadbalancer.balance_workers=tomcat1,tomcat2
      worker.loadbalancer.sticky_session=1
      worker.status.type=status
      
    • 如需会话粘滞,保持 sticky_session=1;若应用完全无状态,可关闭粘滞以便更均衡。
  • 方案 2 Nginx 负载均衡(HTTP 转发)

    • 配置 /etc/nginx/nginx.conf 的 http 段:
      upstream backend {
        server 192.168.1.50:8080 weight=1 max_fails=3 fail_timeout=20s;
        server 192.168.1.51:8080 weight=1 max_fails=3 fail_timeout=20s;
        # 可选:ip_hash; 实现基于客户端 IP 的会话粘滞
      }
      server {
        listen 80;
        server_name your.domain;
        location / {
          proxy_pass http://backend;
          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;
        }
      }
      
    • 如需会话粘滞,可使用 ip_hash 或结合 Tomcat 的 JSESSIONID 策略。

五 启动与验证及高可用扩展

  • 启动与验证

    • 启动顺序:先 Tomcat 集群,再负载均衡。
    • 验证步骤:
      • 访问应用首页,确认返回节点 IP 随请求在实例间切换(Nginx 轮询或 mod_jk 转发)。
      • 登录后刷新/切换节点,检查会话是否保持(粘滞或复制生效)。
      • 查看日志:
        • Tomcat:catalina.out、localhost..log(关注集群成员加入、复制消息)
        • mod_jk:/var/log/apache2/mod_jk.log
        • Nginx:/var/log/nginx/access.log、error.log
      • 部署验证:将应用 WAR 同时部署到各实例 webapps,或观察 FarmWarDeployer(若启用)同步情况。
  • 高可用扩展(可选)

    • 在负载均衡层再叠加 Keepalived + VIP,实现主备自动切换:
      • Keepalived 配置 VRRP 实例与 虚拟 IP(VIP),两台 Nginx/Apache 互为主备。
      • 业务域名指向 VIP,故障时自动漂移,避免单点。
  • 常见问题与排错

    • 组播不通(云环境常见):默认 228.0.0.4:45564 可能被禁用,改用静态成员配置(StaticMembershipInterceptor)或改用 Nginx/HAProxy + AJP/HTTP 直连方式;确认交换机/安全组未拦截组播。
    • Receiver 端口冲突:同一机器多实例需设置不同 Receiver port(如 4000/4001)。
    • 会话不复制:应用未加 、会话对象未实现 Serializable、复制 Valve 未生效或过滤器配置不当。
    • 时间漂移:集群节点需 NTP 同步,否则会影响过期判断与集群稳定性。
    • 本机地址为 127.0.0.1:检查 /etc/hosts 主机名映射与网卡地址,确保 Receiver address 可绑定到非回环地址。

0