温馨提示×

centos上tomcat高可用性配置

小樊
41
2026-01-06 02:07:57
栏目: 智能运维

架构与组件

  • 前端入口:使用 Nginx 作为反向代理与负载均衡,将请求分发到后端多个 Tomcat 实例。
  • 会话保持:Tomcat 节点间启用内置集群的 会话复制(DeltaManager),保证节点故障时会话不丢失。
  • 入口高可用:在 Nginx 前部署 Keepalived 提供 VIP,实现主备自动切换。
  • 典型拓扑:两台 Nginx+Keepalived(主/备),两台或多台 Tomcat 实例。

部署步骤

  • 准备环境
    • 安装 JDK 8(所有节点一致版本),配置环境变量;安装并启动 Tomcat(建议同版本)。
    • 规划实例端口,避免同机多实例端口冲突(如 8080/8081,对应 8005/9005 关闭端口、8009/8010 AJP 端口)。
  • 配置 Tomcat 集群与会话复制
    • 在 server.xml 的 上设置唯一 jvmRoute(如 node1、node2),并加入
    • 在 conf/context.xml 的 中启用集群会话管理(DeltaManager),并为需要会话粘滞的应用在 web.xml 增加
  • 配置 Nginx 负载均衡
    • 在 /etc/nginx/conf.d/tomcat.conf 定义 upstream 指向各 Tomcat 的 8080 端口,location 中使用 proxy_pass 并传递 Host/X-Real-IP/X-Forwarded-For/X-Forwarded-Proto 等头。
  • 配置 Keepalived 主备
    • 两台 Nginx 分别部署 Keepalived,主节点 state=MASTER、备节点 state=BACKUP,设置 virtual_router_id 一致、priority 主高备低,配置 virtual_ipaddress(VIP);启用 vrrp_instance 与认证。
  • 启动与验证
    • 启动 Tomcat → 启动 Nginx → 启动 Keepalived;访问 VIP 验证轮询与故障切换。

关键配置示例

  • Nginx 负载均衡(/etc/nginx/conf.d/tomcat.conf)
http {
  upstream tomcat_cluster {
    server 192.168.205.152:8080 max_fails=3 fail_timeout=30s;
    server 192.168.205.153:8080 max_fails=3 fail_timeout=30s;
  }
  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>
  • 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.205.135/24 }
}
  • 应用开启会话分发(WEB-INF/web.xml)
<web-app ...>
  <distributable/>
</web-app>
  • 健康检查与故障转移要点
    • Nginx 使用 max_fails/fail_timeout 进行后端健康检查与摘除;Keepalived 通过 VRRP 实现 VIP 漂移,主节点宕机后 VIP 自动漂移至备节点。

验证与运维

  • 会话粘滞与复制验证
    • 部署测试页打印 SessionID 与服务器标识,刷新与关闭节点验证会话是否保持与复制生效。
  • 健康检查与摘除
    • 停止某 Tomcat 实例,Nginx 应在 fail_timeout 后将实例标记为不可用并继续服务其余实例。
  • 主备切换演练
    • 停止主 Nginx 或关闭网卡,观察 VIP 是否漂移至备机、访问是否不受影响。
  • 监控与日志
    • 建议接入 Prometheus + Grafana 监控 Tomcat/Nginx 指标,集中日志便于排障。

常见问题与优化

  • 组播与网络
    • Tomcat 集群默认使用 UDP 组播 228.0.0.4:45564,确保云服务器或容器网络策略放通;跨机房/跨 VPC 建议改用 TCP 单播 或外置会话存储。
  • 会话复制策略
    • 节点多且会话较大时,考虑 BackupManager 或外置 Redis/Memcached 集中会话,降低复制风暴。
  • 单点风险
    • 仅一台 Nginx 仍是单点,生产建议 双机 + Keepalived VIP;对外域名解析到 VIP
  • 启动顺序
    • 先启动 Tomcat 再启动 Nginx/Keepalived,避免转发到未就绪实例。
  • 安全加固
    • 限制管理端口与 AJP 暴露面,启用防火墙,必要时仅内网开放。

0