温馨提示×

Linux Tomcat如何实现高可用性

小樊
34
2025-12-08 22:40:09
栏目: 智能运维

Linux Tomcat高可用落地方案

一、总体架构与组件

  • 前端入口层:使用Nginx/HAProxy做反向代理与负载均衡,统一暴露服务端口,隐藏后端实例。
  • 会话层:开启Tomcat内置集群会话复制(DeltaManager),保证节点宕机不丢会话;对跨机房/大规模场景可改用Redis集中会话
  • 数据层:业务数据使用数据库主从/集群或分布式缓存,避免单点。
  • 入口高可用:在负载均衡器前再加一层Keepalived VIP,消除负载均衡器单点。
  • 监控与告警:接入Prometheus + Grafana等,持续观测吞吐、延迟、错误率与JVM指标。

二、部署步骤

  • 准备环境
    • 安装JDK 8+,在多个节点部署相同版本的 Tomcat;建议每个实例使用独立目录与端口。
    • 示例:下载解压 Tomcat 9 至**/opt/tomcat**,创建专用系统用户运行。
  • 配置 Tomcat 集群与会话复制
    • server.xmlEngine内加入:
      • 集群:<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      • 节点标识:为 Engine 设置唯一jvmRoute(如 server1、server2),便于粘性会话与排障。
    • context.xml(或应用 context 片段)启用会话复制:
      • 管理器:<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
      • 监听器:<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    • 在应用的web.xml中加入:<distributable/>
  • 配置负载均衡(Nginx 示例)
    • 安装 Nginx,配置 upstream 与反向代理:
      • upstream:server 192.168.1.11:8080; server 192.168.1.12:8080;
      • location:设置proxy_pass与头部转发(Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto)。
  • 配置入口高可用(Keepalived VIP)
    • 两台负载均衡器安装 Keepalived,配置VRRPvirtual_ipaddress(如 192.168.1.100),实现主备自动切换。
  • 启动与验证
    • 启动 Tomcat 集群与 Nginx/Keepalived;访问 VIP 验证分发与会话复制。

三、关键配置示例

  • Tomcat 内置集群片段(server.xml,Engine 内)
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="server1">
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
        <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.TcpPingInterceptor"/>
          <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=""/>
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>
    </Engine>
    
  • Nginx 负载均衡片段(/etc/nginx/conf.d/tomcat.conf)
    upstream tomcat_cluster {
        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;
        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;
        }
    }
    
  • Keepalived 主节点片段(/etc/keepalived/keepalived.conf)
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication { auth_type PASS; auth_pass 42 }
        virtual_ipaddress { 192.168.1.100/24 }
    }
    
  • 应用侧:在WEB-INF/web.xml中加入<distributable/>,确保会话可复制。

四、健康检查与故障转移

  • 负载均衡健康检查
    • Nginx:在 upstream 中使用max_fails/fail_timeout实现被动探测;商业版支持主动health_check
    • HAProxy:内置主动健康检查与多种算法(roundrobin、leastconn 等),可按应用特性选择。
  • 入口高可用
    • Keepalived VRRP实现秒级主备切换,对外提供稳定VIP
  • 会话容错
    • 开启DeltaManager后,节点失效时请求被转发到健康节点,已复制的会话可继续使用;对写入密集场景建议结合sticky session或改为集中式会话存储(如 Redis)

五、验证与运维要点

  • 验证清单
    • 分发验证:多次刷新页面,观察不同jvmRoute出现在响应或日志中。
    • 会话复制:登录后关闭当前节点,刷新应仍保持登录状态。
    • 故障转移:停止某实例或拔网线,确认Nginx/HAProxy摘除节点且业务不中断;恢复后自动回归。
    • VIP 漂移:停止主 Keepalived,确认VIP漂移到备机。
  • 运维建议
    • 统一JDK/Tomcat版本与配置基线;为集群开放必要端口(如8080、4000、45564)。
    • 打开访问日志与AccessLogValve,便于审计与排障。
    • 接入Prometheus + Grafana监控 JVM、线程、连接、GC、吞吐与错误率,设置告警阈值。

0