阅读量:24
Ubuntu环境下搭建Tomcat集群的详细步骤
1. 准备工作
- 服务器要求:至少2台Ubuntu服务器(物理机或虚拟机),确保网络互通(建议使用私有网络,避免防火墙拦截集群通信端口)。
- 软件准备:下载Tomcat(建议版本8.5+或9.x,需所有节点版本一致)、JDK(1.8+,需配置环境变量
JAVA_HOME)。 - 基础配置:每台服务器需安装并配置JDK(通过
java -version验证),并解压Tomcat到指定目录(如/opt/tomcat)。
2. 安装与基础配置Tomcat
- 解压Tomcat:在每台服务器上执行
tar -zxvf apache-tomcat-x.x.x.tar.gz -C /opt/,重命名为tomcat(便于管理)。 - 配置环境变量:编辑
/etc/profile,添加export CATALINA_HOME=/opt/tomcat,执行source /etc/profile生效。 - 修改端口:为避免节点间端口冲突,需修改每台服务器的
conf/server.xml中的以下端口(示例为两台节点的配置差异):- 节点1:
Server Port=8005、Connector Port=8080、AJP Port=8009; - 节点2:
Server Port=9005、Connector Port=9080、AJP Port=9009(确保端口不重复)。
- 节点1:
3. 配置Tomcat集群(核心步骤)
编辑每台服务器conf/server.xml文件,在标签内添加集群配置(关键参数说明见注释):
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1"> <!-- jvmRoute需唯一,对应负载均衡节点标识 -->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<!-- 会话管理器:DeltaManager用于主节点复制,BackupManager用于备份节点 -->
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<!-- 集群通信通道:组播(Multicast)用于节点发现 -->
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<!-- 组播地址(224.0.0.0-239.255.255.255)和端口,所有节点需一致 -->
<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" <!-- 自动获取本机IP -->
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.TcpPingInterceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
</Channel>
<!-- 负载均衡阀:控制请求是否复制到其他节点 -->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.css;.*\.txt"/> <!-- 过滤静态资源,减少复制开销 -->
<!-- 部署器:同步war包到集群节点(可选,建议手动部署) -->
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<!-- 集群监听器:监听集群事件(如会话创建、销毁) -->
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
</Engine>
- 关键说明:
jvmRoute:每台节点需唯一(如node1、node2),对应负载均衡配置中的balance_workers名称;- 组播地址:确保所有节点在同一网段,且防火墙允许该地址的UDP通信(端口45564);
- 接收器端口:每台节点需唯一(如
4000、4001),避免端口冲突。
4. 启用应用会话复制
为了让应用支持集群会话同步,需在应用的WEB-INF/web.xml文件中添加标签(示例):
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<distributable/> <!-- 启用会话复制 -->
</web-app>
- 注意事项:仅标注
的应用会话才会被复制,未标注的应用会话仅在当前节点有效。
5. 配置负载均衡(以Nginx为例)
Tomcat集群需要负载均衡器将请求分发到各节点,以下是Nginx的配置步骤:
- 安装Nginx:执行
sudo apt update && sudo apt install nginx。 - 配置负载均衡:编辑
/etc/nginx/sites-available/default,添加以下内容:
upstream tomcat_cluster {
server 192.168.1.101:8080; # 节点1的IP和Tomcat端口
server 192.168.1.102:9080; # 节点2的IP和Tomcat端口
# 可添加更多节点
}
server {
listen 80;
server_name yourdomain.com; # 替换为你的域名或IP
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;
}
}
- 启用配置:执行
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/,然后重启Nginx:sudo systemctl restart nginx。
6. 启动集群并验证
- 启动Tomcat:在每台服务器上执行
/opt/tomcat/bin/startup.sh,通过ps -ef | grep tomcat验证进程是否启动。 - 查看集群状态:访问
http://节点IP:8080/manager/status(需输入管理员账号密码),查看“Cluster”栏目中的节点列表(显示所有节点已加入集群)。 - 测试会话同步:
- 访问
http://yourdomain.com(通过Nginx负载均衡),登录应用并记录Session ID; - 关闭当前节点的Tomcat(如
/opt/tomcat/bin/shutdown.sh); - 刷新页面,若仍能保持登录状态且Session ID变化,说明会话复制成功。
- 访问
7. 可选优化
- 静态资源分离:将CSS、JS、图片等静态资源放在Nginx或其他CDN服务器,减少Tomcat负载;
- 会话持久化:将会话存储到Redis(需添加Redisson依赖),避免节点宕机导致会话丢失;
- 监控报警:使用Prometheus+Granafa监控Tomcat集群的CPU、内存、会话数等指标,设置报警阈值。
通过以上步骤,即可在Ubuntu环境下搭建一个基本的Tomcat集群,实现负载均衡和高可用性。根据实际需求,可进一步调整集群配置(如优化组播参数、调整复制模式)以满足高并发场景。