温馨提示×

centos下tomcat如何实现高可用性

小樊
33
2025-12-13 14:24:19
栏目: 智能运维

架构总览

  • CentOS 上构建 Tomcat 高可用,通常采用“负载均衡层 + Tomcat 集群层 + 会话保持/复制”的三层架构。
  • 负载均衡层:使用 Nginx(或 HAProxy/Apache httpd+mod_jk)对外提供统一入口,并做健康检查与故障转移。
  • Tomcat 集群层:多台服务器或多实例运行相同应用,通过 SimpleTcpCluster 实现会话复制,保证节点宕机不丢会话。
  • 会话与数据:优先使用“应用无状态 + 外置会话存储(如 Redis)”,或采用 Tomcat 内置的 DeltaManager 进行内存复制;共享文件/上传目录建议放到 NFS/对象存储,数据库使用主从或集群。

部署步骤

  1. 准备环境
    • 安装 JDK 8/11,统一 Tomcat 版本 与目录结构;为每台服务器(或同机多实例)规划唯一标识(如 jvmRoute=node1)。
    • 如部署多实例,修改 server.xml 中的 Server port(8005)Connector port(8080)AJP port(8009)shutdown port,避免端口冲突。
  2. 部署多个 Tomcat 实例
    • 建议同机多实例时按目录复制模板实例并逐一调整端口;跨机部署时保持版本与配置一致,便于运维与回滚。
  3. 配置 Tomcat 集群与会话复制
    • server.xml 内加入:
      • 集群:
      • 节点标识:<Engine … jvmRoute=“node1”>(各实例唯一)
    • context.xml 启用会话复制:
    • 在应用的 WEB-INF/web.xml 增加 ,声明应用支持分布式会话。
  4. 配置负载均衡器(以 Nginx 为例)
    • 安装:sudo yum install -y nginx
    • 配置 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/tomcat.conf:
      • upstream:server node1:8080; server node2:8080;
      • location /:proxy_pass 到 upstream;设置 Host/X-Real-IP/X-Forwarded-For/X-Forwarded-Proto 头。
    • 健康检查与故障转移:在 upstream 中为 server 增加 max_fails=3 fail_timeout=30s 等参数,自动摘除异常节点。
  5. 启动与验证
    • 启动 Tomcat 集群与 Nginx;访问负载均衡地址,观察请求在多实例间分发;登录各实例日志与监控,确认会话复制与健康检查生效。

关键配置示例

  • Nginx 负载均衡与健康检查
http {
  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;
    # 可选:ip_hash; 或 nginx-plus 的 health_check;
  }
  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;
    }
  }
}
  • Tomcat 内置集群与会话复制(server.xml 片段)
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
  <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.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)
<web-app ...>
  <distributable/>
</web-app>
  • 可选:使用 Apache httpd + mod_jk(AJP)
# workers.properties
worker.list=loadbalancer
worker.node1.type=ajp13
worker.node1.host=192.168.1.11
worker.node1.port=8009
worker.node2.type=ajp13
worker.node2.host=192.168.1.12
worker.node2.port=8009
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=1
# httpd.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkMount /* loadbalancer

以上示例覆盖了 Nginx/HAProxy/mod_jk 三种常见负载均衡方式、Tomcat 内置 DeltaManager 复制与 jvmRoute 使用要点。

进阶与最佳实践

  • 提升入口高可用:在 Nginx 前再加一层 Keepalived VIP,实现 主备自动切换,对外暴露 虚拟IP,消除单点。
  • 会话方案选型:
    • 小规模且可接受内存复制时,用 DeltaManager;跨机房/大规模建议 外置 Redis/Memcached 集中会话,避免网络分区导致脑裂与复制风暴。
  • 健康检查增强:
    • Nginx 开源版可用 max_fails/fail_timeout 与主动探测脚本;若需更细粒度,可使用 Nginx Plus 的 health_check 或引入 HAProxy 做四层/七层健康探测。
  • 单机上多实例部署:
    • 按目录复制实例并逐一修改 Server/Connector/AJP 端口;用 systemd 或自定义脚本管理多实例启停与日志轮转。
  • 监控与可观测性:
    • 暴露 JMXPrometheus JMX Exporter,结合 Grafana 做指标与告警;日志统一收集(如 rsyslog/filebeat),便于排障与审计。

验证与故障演练

  • 基础验证
    • 访问 VIP/域名,多次刷新或并发请求,确认请求在多个 Tomcat 实例间轮询;查看 Nginx access/error 与各实例 catalina.out,核对后端命中与健康检查状态。
  • 会话保持与复制验证
    • 登录应用生成 JSESSIONID,在响应头或页面中打印 session IDjvmRoute;停掉当前承载实例,刷新页面,确认会话仍可用且 jvmRoute 变化符合预期(无感切换)。
  • 故障演练
    • 依次关闭某台 Tomcat 或模拟网络抖动,观察 Nginx 摘除节点、业务无中断;恢复节点后验证自动回归与健康检查恢复。

0