Tomcat在CentOS中的集群如何搭建
导读:架构与准备 架构建议:前端使用 Nginx 做反向代理与负载均衡,后端 2 台或以上 Tomcat 组成集群,应用无状态或会话共享(推荐外置 Redis 或 Tomcat 内置组播复制)。 环境建议:CentOS 7/8、JDK 8、To...
架构与准备
- 架构建议:前端使用 Nginx 做反向代理与负载均衡,后端 2 台或以上 Tomcat 组成集群,应用无状态或会话共享(推荐外置 Redis 或 Tomcat 内置组播复制)。
- 环境建议:CentOS 7/8、JDK 8、Tomcat 9(各节点版本保持一致)。
- 安装基础组件(两台 Tomcat 节点均执行):
- 安装 JDK
- sudo yum install -y java-1.8.0-openjdk-devel
- 安装 Tomcat 9(示例)
- wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.56/bin/apache-tomcat-9.0.56.tar.gz
- tar xvf apache-tomcat-9.0.56.tar.gz & & sudo mv apache-tomcat-9.0.56 /opt/tomcat
- 安装 JDK
- 规划端口(避免单机多实例冲突):
- 节点1:HTTP 8080,AJP 8009,关闭端口 8005,Receiver 端口 4000
- 节点2:HTTP 8081,AJP 8010,关闭端口 8006,Receiver 端口 4001
- 防火墙放行(两台 Tomcat 与 Nginx 节点均需放行):
- sudo firewall-cmd --permanent --add-port={ 8080,8081,8009,8010,80} /tcp
- sudo firewall-cmd --reload
- 可选:在 Tomcat 的 bin 目录创建 setenv.sh(便于自定义内存与启动参数):
- JAVA_OPTS=“-Xms512m -Xmx1024m -Dfile.encoding=UTF-8”
Tomcat 节点配置
- 为引擎设置唯一路由标识(用于粘性会话与识别节点):
- 节点1:
- 节点2:
- 启用集群会话复制(示例为组播复制,适合同网段;跨机房建议改用外置会话存储):
- 在 或 内加入(两台节点基本一致,Receiver 端口不同):
< 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" < !-- 节点2改为4001 --> 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>
- 在 或 内加入(两台节点基本一致,Receiver 端口不同):
- 应用开启分布式会话:在应用的 WEB-INF/web.xml 中加入 。
- 单机多实例时,确保各实例的 Server port、HTTP Connector port、AJP Connector port、Receiver port 均不冲突。
负载均衡配置
- 安装 Nginx(负载均衡器节点执行):
- sudo yum install -y nginx
- 配置反向代理与负载均衡(/etc/nginx/nginx.conf 或 /etc/nginx/conf.d/tomcat.conf):
upstream tomcat_cluster { # 可按需开启 ip_hash 实现会话粘滞(不建议与外置会话存储混用) # ip_hash; server 192.168.1.11:8080 max_fails=3 fail_timeout=30s; server 192.168.1.12:8081 max_fails=3 fail_timeout=30s; } server { listen 80; server_name _; 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; proxy_connect_timeout 5s; proxy_send_timeout 10s; proxy_read_timeout 30s; } } - 启动与开机自启:
- sudo systemctl enable --now nginx
- 可选(Apache + mod_jk):使用 AJP 1.3 与 workers.properties 分发请求,配置 sticky_session=1 实现会话粘滞。
会话共享方案对比与落地
- 内置组播复制(DeltaManager):配置简单、同网段效果好;跨机房/云上 VPC 多播受限,扩容到大量节点时复制流量较大。
- 外置会话存储(推荐):将 Session 存入 Redis 或 Memcached,解耦 Tomcat、易横向扩展、跨机房友好。
- Redis 方案示例(Tomcat 端引入会话管理器与依赖,示例组件:tomcat-redis-session-manager、Jedis、commons-pool2):
- 将相关 JAR 放入 $CATALINA_HOME/lib;在 conf/context.xml 的 中加入:
< Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto"/> < Manager className="org.redisson.tomcat.RedissonSessionManager" configPath="${ catalina.base} /conf/redisson.yaml" readMode="REDIS" updateMode="DEFAULT"/> - 配置 redisson.yaml(示例单机 Redis):
singleServerConfig: address: "redis://10.11.10.99:6379" password: "redis_123456" - 部署后重启 Tomcat,会话将存储到 Redis。
- 将相关 JAR 放入 $CATALINA_HOME/lib;在 conf/context.xml 的 中加入:
- Memcached 方案:使用 memcached-session-manager(MSM),配置 Sticky 或 Non-Sticky 模式,适合已有 Memcached 基础设施的场景。
- Redis 方案示例(Tomcat 端引入会话管理器与依赖,示例组件:tomcat-redis-session-manager、Jedis、commons-pool2):
部署验证与常见问题
- 部署与验证
- 部署测试应用(含 ),或打印 session.getId() 与 jvmRoute:
- 多次刷新页面,观察请求在 8080/8081 间分发;登录后切换节点,确认会话不丢失(粘滞或外置会话生效)。
- 查看集群日志:
- tail -f $CATALINA_HOME/logs/catalina.out | grep -i cluster
- 关注 Membership 发现、复制消息、节点加入/离开等信息。
- 部署测试应用(含 ),或打印 session.getId() 与 jvmRoute:
- 常见问题排查
- 端口冲突:单机多实例需确保 Server port、HTTP、AJP、Receiver 均唯一。
- 组播不通:跨网段/云环境多播被限制,改用外置会话存储(Redis/Memcached)。
- 会话粘滞与一致性:开启 ip_hash 可实现粘滞,但与外置会话存储混用可能导致误解;建议统一策略。
- 防火墙/安全组:放行 80、8080、8081、8009、8010 等端口。
- 应用一致性:使用 DeltaManager 时,各节点应用版本与部署内容需保持一致;使用 BackupManager 可容忍差异。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Tomcat在CentOS中的集群如何搭建
本文地址: https://pptw.com/jishu/776773.html
