centos

centos下tomcat如何实现高可用性

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

架构总览

部署步骤

  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;访问负载均衡地址,观察请求在多实例间分发;登录各实例日志与监控,确认会话复制与健康检查生效。

关键配置示例

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;
    }
  }
}
<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-app ...>
  <distributable/>
</web-app>
# 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 使用要点。

进阶与最佳实践

验证与故障演练

0
看了该问题的人还看了