首页主机资讯Linux Tomcat如何实现高可用性

Linux Tomcat如何实现高可用性

时间2025-12-09 16:16:03发布访客分类主机资讯浏览635
导读:Linux Tomcat高可用落地方案 一、总体架构与组件 前端入口层:使用Nginx/HAProxy做反向代理与负载均衡,统一暴露服务端口,隐藏后端实例。 会话层:开启Tomcat内置集群会话复制(DeltaManager),保证节点宕...

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、吞吐与错误率,设置告警阈值。

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


若转载请注明出处: Linux Tomcat如何实现高可用性
本文地址: https://pptw.com/jishu/767214.html
vsftp与Debian防火墙的兼容性 Linux Tomcat如何配置安全策略

游客 回复需填写必要信息