中国足球进世界杯

Tomcat 集群搭建

目录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

至此,验证结束。