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

如何在Linux上实现Tomcat高可用

时间2026-01-22 03:52:04发布访客分类主机资讯浏览990
导读:Linux上实现 Tomcat 高可用的落地方案 一、总体架构与组件选型 前端入口:使用 Nginx/HAProxy 做反向代理与负载均衡,支持健康检查与故障摘除,必要时可启用会话保持(如基于 Cookie 的 sticky)。 业务承...

Linux上实现 Tomcat 高可用的落地方案


一、总体架构与组件选型

  • 前端入口:使用 Nginx/HAProxy 做反向代理与负载均衡,支持健康检查与故障摘除,必要时可启用会话保持(如基于 Cookie 的 sticky)。
  • 业务承载:至少部署 2 台 Tomcat 实例 组成集群,同一应用版本、相同配置,避免单点。
  • 会话保持:优先采用 Tomcat 内置集群会话复制(DeltaManager);跨机房或大规模场景建议改为 Redis/Memcached 等外置会话存储。
  • 入口高可用:在 Nginx 前再加一层 Keepalived VIP,实现 L4 故障切换,对外暴露 虚拟 IP
  • 进程看护:每个 Tomcat 以 systemd 托管,配置崩溃自启与开机自启,作为兜底。
  • 监控告警:采集 JVM/线程/连接/GC 等指标,结合 Prometheus + Grafana 可视化与阈值告警。

二、快速落地步骤

  • 步骤 1 准备环境
    • 安装 JDK 8/11/17(各节点版本一致),创建 tomcat 系统用户,下载解压 Apache Tomcat(建议同版本)。
  • 步骤 2 部署多个 Tomcat 实例
    • 单机多实例时,修改 server.xml 中的 Server port、Connector 8080、AJP 8009、shutdown 端口 避免冲突;多机部署则保持各实例端口一致即可。
  • 步骤 3 配置 Tomcat 集群与会话复制
    • EngineContext 内加入
    • 使用 DeltaManagerBackupManager;在应用的 web.xml 增加
    • 典型集群通信参数包括 组播地址 228.0.0.4:45564Receiver 端口 4000、以及 ReplicationValve/JvmRouteBinderValve 等。
  • 步骤 4 配置负载均衡器
    • Nginx 示例:
      • upstream:server 192.168.1.11:8080; server 192.168.1.12:8080;
      • location / { proxy_pass http://upstream; 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_hashsticky session 提升有状态会话体验(集群复制更通用)。
  • 步骤 5 配置入口高可用(Keepalived)
    • 两台 Nginx 主机部署 Keepalived,配置 VRRP虚拟 IP(VIP),实现主机故障自动切换。
  • 步骤 6 进程看护与自启
    • systemd 管理 Tomcat:设置 Restart=always/RestartSec=10,保证异常退出自动拉起。
  • 步骤 7 监控与验证
    • 部署 Prometheus + Grafana 监控 Tomcat(JMX Exporter 或内置指标端点);
    • 验证:停一台 Tomcat/拔网线/关闭 Nginx,观察 VIP 漂移请求无感切换会话不丢失

三、关键配置示例

  • Tomcat 内置集群最小配置(server.xml 片段)

    <
        Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
        
      <
        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=""/>
        
        <
        Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
        
        <
        ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        
      <
        /Cluster>
        
    <
        /Engine>
    
    

    应用需在 WEB-INF/web.xml 增加

  • Nginx 负载均衡配置(/etc/nginx/conf.d/tomcat.conf)

    upstream tomcat_cluster {
        
        server 192.168.1.11:8080;
        
        server 192.168.1.12:8080;
        
        # 可选:ip_hash;
     或 nginx-sticky-module 实现 sticky
    }
    
    
    server {
        
        listen 80;
        
        server_name yourdomain.com;
    
    
        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;
    
        }
    
    }
        
    

    如需会话粘滞,可启用 ip_hashnginx-sticky-module

  • systemd 服务示例(/etc/systemd/system/tomcat.service)

    [Unit]
    Description=Apache Tomcat Web Application Container
    After=syslog.target network.target
    
    [Service]
    Type=forking
    Environment=JAVA_HOME=/usr/java/jdk1.8.0_291
    Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
    Environment=CATALINA_HOME=/opt/tomcat
    Environment=CATALINA_BASE=/opt/tomcat
    ExecStart=/opt/tomcat/bin/startup.sh
    ExecStop=/opt/tomcat/bin/shutdown.sh
    User=tomcat
    Group=tomcat
    Restart=always
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
    

    启用:systemctl daemon-reload & & systemctl enable --now tomcat。


四、会话保持与数据一致性建议

  • 优先方案:使用 Tomcat 集群会话复制(DeltaManager),配置简单、对应用侵入小;适合同机房、节点数不多的场景。
  • 增强方案:对跨机房、大规模或需要更强一致性的场景,使用 Redis/Memcached 集中存储会话,应用侧改造为从外部缓存读写会话。
  • 兼容性:若启用 jvmRoute(如 node1/node2),需保证负载均衡器或会话粘滞策略与之匹配,避免会话绑定异常。
  • 有状态场景:尽量避免依赖本地文件/内存会话;将 文件上传、缓存、消息 等外置到共享存储或中间件。

五、验证与运维要点

  • 故障演练:依次停止单个 Tomcat、关闭 Nginx、断开 Keepalived 主节点,确认 VIP 漂移负载均衡摘除异常节点用户无感或最小感知;恢复后验证 会话仍有效
  • 监控告警:采集 JVM 内存/GC、线程池、连接器队列、请求时延 等指标;设置节点宕机、响应超时、JVM Full GC 等告警。
  • 变更发布:采用 蓝绿/金丝雀 发布,先引流少量流量到新版本,观察无异常再全量切换;回滚预案就绪。
  • 日志与审计:统一收集 catalina.out、localhost_access_log、nginx 访问/错误日志,便于问题定位与容量评估。
  • 风险提示:生产环境务必在灰度/预发环境充分验证;会话复制与网络组播对 网络质量 较敏感,必要时改为 单播/TCP 或外置会话存储以提升稳定性。

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


若转载请注明出处: 如何在Linux上实现Tomcat高可用
本文地址: https://pptw.com/jishu/789501.html
在Debian上配置vsftp虚拟用户 Linux下如何限制Tomcat资源使用

游客 回复需填写必要信息