目录Tomcat 集群搭建参考资料环境准备搭建步骤1 web 应用Controllerweb.xml2 Tomcat 集群2.1 Tomcat 实例12.1.1 创建实例目录2.1.2 拷贝配置文件到实例目录2.1.3 调整实例配置文件调整占用端口添加应用上下文添加集群配置2.1.4 部署 web 应用2.1.5 启动 tomcat 实例 12.2 Tomcat 实例22.2.1 创建实例目录2.2.2 拷贝实例1 的配置文件到实例 2 目录2.2.3 调整实例配置文件调整占用端口添加应用上下文(如已配置可跳过)调整集群端口2.2.4 部署 web 应用2.1.5 启动 tomcat 实例 22.3 Tomcat 实例32.3.1 创建实例目录2.3.2 拷贝实例1 的配置文件到实例 2 目录2.3.3 调整实例配置文件调整占用端口添加应用上下文(如已配置可跳过)调整集群端口2.3.4 部署 web 应用2.3.5 启动 tomcat 实例 33 验证3.1 方案3.2 实例 1 设置 name = black3.3 实例 2 获取 session 中 name 属性的值3.4 实例 3 获取 session 中 name 属性的值
Tomcat 集群搭建
参考资料
官方文档:https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html
《 Tomcat 单机多实例使用记录 》
环境准备
确保本地已安装 JDK 1.8
下载 apache-tomcat-8.5.61并解压到本地
web 应用(提供修改和查看 session 内容的服务)
搭建步骤
服务器资源有限,Tomcat 集群的 3 个实例搭建在本地。
1 web 应用
准备一个普通的 Spring Web MVC 应用即可。需要着重改造的点有:
添加 Controller 操作 HttpSession
src/main/webapp/WEB-INF/web.xml 添加
Controller
提供 2 个接口用于通过浏览器操作 HttpSession:
/session/{key}/{value}: 设置 session 属性 {key} 的值为
/session/{key} : 获取 session 属性
@Controller
@RequestMapping("/session")
public class SessionReplicaController {
@GetMapping("/{key}")
public void getSession(@PathVariable("key") String key, HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
String attributeValue = (String)session.getAttribute(key);
try {
response.getWriter().write("get attribute [" + key + "] from session ,value: " + attributeValue);
response.getWriter().flush();
response.getWriter().close();
} catch (IOException e) {
e.printStackTrace();
}
}
@GetMapping("/{key}/{value}")
public void setSession(@PathVariable("key") String key, @PathVariable("value") String value, HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
session.setAttribute(key, value);
try {
response.getWriter().write("setSession - key: " + key + ", value: " + value);
response.getWriter().flush();
response.getWriter().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
web.xml
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
...
...
2 Tomcat 集群
集群示意图
2.1 Tomcat 实例1
本地 Tomcat 安装目录:C:\work\soft\apache-tomcat-8.5.61
2.1.1 创建实例目录
创建目录 C:\work\soft\apache-tomcat-8-1 用于存放 tomcat 实例1 内容。
2.1.2 拷贝配置文件到实例目录
将 Tomcat 安装目录下的 conf 文件夹拷贝到 实例目录下:
即 C:\work\soft\apache-tomcat-8.5.61\conf拷贝到C:\work\soft\apache-tomcat-8-1\conf
2.1.3 调整实例配置文件
主要是调整 conf/server.xml 文件中占用端口、应用上下文和集群配置。
调整占用端口
调整 Server 实例关闭端口为 9005
...
调整 Connector 端口为 9081
添加应用上下文
...
...
添加集群配置
...
expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> filter=""/> tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> ... 2.1.4 部署 web 应用 将 《1 web 应用》打包成 api.war 放于 tomcat 实例 1 目录(C:\work\soft\apache-tomcat-8-1\webapps)下。 2.1.5 启动 tomcat 实例 1 cd C:\work\soft\apache-tomcat-8.5.61 set CATALINA_BASE=C:\work\soft\apache-tomcat-8-1 bin\startup.bat 2.2 Tomcat 实例2 和实例 1 配置步骤一致,但是需要调整占用的端口,避免启动时报端口冲突。 2.2.1 创建实例目录 创建目录 C:\work\soft\apache-tomcat-8-2 用于存放 tomcat 实例2 内容。 2.2.2 拷贝实例1 的配置文件到实例 2 目录 将 Tomcat 实例 1 下的 conf 文件夹拷贝到 实例目录下: 即 C:\work\soft\apache-tomcat-8-1\conf拷贝到C:\work\soft\apache-tomcat-8-2\conf 2.2.3 调整实例配置文件 主要是调整 conf/server.xml 文件中占用端口、应用上下文和集群配置。 调整占用端口 调整 Server 实例关闭端口为 9006 ... 调整 Connector 端口为 9082 添加应用上下文(如已配置可跳过) ... ... 调整集群端口 ... expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> address="auto" port="4200" autoBind="100" selectorTimeout="5000" maxThreads="6"/> filter=""/> tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> ... 2.2.4 部署 web 应用 将 《1 web 应用》打包成 api.war 放于 tomcat 实例 2 目录(C:\work\soft\apache-tomcat-8-2\webapps)下。 2.1.5 启动 tomcat 实例 2 cd C:\work\soft\apache-tomcat-8.5.61 set CATALINA_BASE=C:\work\soft\apache-tomcat-8-2 bin\startup.bat 控制台打印: 01-Sep-2023 08:26:06.706 信息 [main] org.apache.catalina.ha.tcp.SimpleTcpCluster.startInternal 群集即将启动 01-Sep-2023 08:26:06.723 信息 [main] org.apache.catalina.tribes.transport.ReceiverBase.bind 服务器套接字接收器绑定到:[/192.168.1.3:4200] 01-Sep-2023 08:26:06.731 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.setupSocket 设置集群多播超时时间:[500] 01-Sep-2023 08:26:06.733 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠[1000]毫秒后启动连接集群,启动登记:[4] 01-Sep-2023 08:26:07.211 信息 [Membership-MemberAdded.] org.apache.catalina.ha.tcp.SimpleTcpCluster.memberAdded 添加同步成员:[org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 3}:4000,{192, 168, 1, 3},4000, alive=797912, securePort=-1, UDP Port=-1, id={-118 86 -88 -8 -75 91 79 99 -77 114 104 -107 124 -35 -123 64 }, payload={}, command={}, domain={}]] 01-Sep-2023 08:26:07.735 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠完毕,成员已连接,启动等级:[4] 01-Sep-2023 08:26:08.879 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠[1000]毫秒后启动连接集群,启动登记:[8] 01-Sep-2023 08:26:08.888 信息 [Tribes-Task-Receiver[Catalina-Channel]-1] org.apache.catalina.tribes.io.BufferPool.getBufferPool 已创建缓冲池,最大大小为:[104857600]字节,类型为:[org.apache.catalina.tribes.io.BufferPool15Impl] 01-Sep-2023 08:26:09.887 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠完毕,成员已连接,启动等级:[8] 01-Sep-2023 08:26:09.890 严重 [main] org.apache.catalina.ha.deploy.FarmWarDeployer.start FarmWarDeployer 只有做为 host cluster 的子元素是才生效 2.3 Tomcat 实例3 和实例 1 配置步骤一致,但是需要调整占用的端口,避免启动时报端口冲突。 2.3.1 创建实例目录 创建目录 C:\work\soft\apache-tomcat-8-3 用于存放 tomcat 实例3 内容。 2.3.2 拷贝实例1 的配置文件到实例 2 目录 将 Tomcat 实例 1 下的 conf 文件夹拷贝到 实例目录下: 即 C:\work\soft\apache-tomcat-8-1\conf拷贝到C:\work\soft\apache-tomcat-8-3\conf 2.3.3 调整实例配置文件 主要是调整 conf/server.xml 文件中占用端口、应用上下文和集群配置。 调整占用端口 调整 Server 实例关闭端口为 9007 ... 调整 Connector 端口为 9083 添加应用上下文(如已配置可跳过) ... ... 调整集群端口 ... expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> address="auto" port="4200" autoBind="100" selectorTimeout="5000" maxThreads="6"/> filter=""/> tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> ... 2.3.4 部署 web 应用 将 《1 web 应用》打包成 api.war 放于 tomcat 实例 3 目录(C:\work\soft\apache-tomcat-8-3\webapps)下。 2.3.5 启动 tomcat 实例 3 cd C:\work\soft\apache-tomcat-8.5.61 set CATALINA_BASE=C:\work\soft\apache-tomcat-8-3 bin\startup.bat 控制台打印: 01-Sep-2023 08:34:55.031 信息 [main] org.apache.catalina.ha.tcp.SimpleTcpCluster.startInternal 群集即将启动 01-Sep-2023 08:34:55.050 信息 [main] org.apache.catalina.tribes.transport.ReceiverBase.bind 服务器套接字接收器绑定到:[/192.168.1.3:4300] 01-Sep-2023 08:34:55.058 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.setupSocket 设置集群多播超时时间:[500] 01-Sep-2023 08:34:55.060 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠[1000]毫秒后启动连接集群,启动登记:[4] 01-Sep-2023 08:34:55.473 信息 [Membership-MemberAdded.] org.apache.catalina.ha.tcp.SimpleTcpCluster.memberAdded 添加同步成员:[org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 3}:4200,{192, 168, 1, 3},4200, alive=528738, securePort=-1, UDP Port=-1, id={13 -55 -106 -62 -3 -93 64 -108 -108 -68 -18 19 -25 60 46 -46 }, payload={}, command={}, domain={}]] 01-Sep-2023 08:34:55.483 信息 [Membership-MemberAdded.] org.apache.catalina.ha.tcp.SimpleTcpCluster.memberAdded 添加同步成员:[org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 3}:4000,{192, 168, 1, 3},4000, alive=1326191, securePort=-1, UDP Port=-1, id={-118 86 -88 -8 -75 91 79 99 -77 114 104 -107 124 -35 -123 64 }, payload={}, command={}, domain={}]] 01-Sep-2023 08:34:56.060 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠完毕,成员已连接,启动等级:[4] 01-Sep-2023 08:34:56.062 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠[1000]毫秒后启动连接集群,启动登记:[8] 01-Sep-2023 08:34:56.067 信息 [Tribes-Task-Receiver[Catalina-Channel]-1] org.apache.catalina.tribes.io.BufferPool.getBufferPool 已创建缓冲池,最大大小为:[104857600]字节,类型为:[org.apache.catalina.tribes.io.BufferPool15Impl] 01-Sep-2023 08:34:57.078 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠完毕,成员已连接,启动等级:[8] 3 验证 3.1 方案 实例1 用于设置 session 的值 实例 2、实例 3 用于获取 session 的值 3.2 实例 1 设置 name = black 访问:http://localhost:9081/api/session/name/black 3.3 实例 2 获取 session 中 name 属性的值 访问:http://localhost:9082/api/session/name 3.4 实例 3 获取 session 中 name 属性的值 访问:http://localhost:9083/api/session/name 至此,验证结束。