不安分的黑娃
踏踏实实,坚持学习,慢慢就懂了~

Tomcat 集群搭建

参考资料

环境准备

  1. 确保本地已安装 JDK 1.8
  2. 下载 apache-tomcat-8.5.61并解压到本地
  3. web 应用(提供修改和查看 session 内容的服务)

搭建步骤

服务器资源有限,Tomcat 集群的 3 个实例搭建在本地。

1 web 应用

准备一个普通的 Spring Web MVC 应用即可。需要着重改造的点有:

  • 添加 Controller 操作 HttpSession
  • src/main/webapp/WEB-INF/web.xml 添加 <distributable/> 标签

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

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>  
    ...
  <distributable/>
    ...
</web-app>

2 Tomcat 集群

集群示意图

image

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
image

image

2.1.3 调整实例配置文件

主要是调整 conf/server.xml 文件中占用端口、应用上下文和集群配置。

调整占用端口
  1. 调整 Server 实例关闭端口为 9005
<Server port="9005" shutdown="SHUTDOWN">
    ...
</Server>
  1. 调整 Connector 端口为 9081
<Connector port="9081" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />
添加应用上下文
<Host>
    ...
    <!-- 定义应哟目录 api 和应用上下文 '/api'  -->
    <Context docBase="api" path="/api"></Context>
    ...
</Host>
添加集群配置
<Engine name="Catalina" defaultHost="localhost">
    ...

   <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">
            <!-- 指定组播地址  228.0.0.4:45564  -->
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <!-- 监听 4000~4100 任一端口,接收组播消息   -->
            <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"/>

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

2.1.4 部署 web 应用

将 《1 web 应用》打包成 api.war 放于 tomcat 实例 1 目录(C:\work\soft\apache-tomcat-8-1\webapps)下。

image

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

image

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 文件中占用端口、应用上下文和集群配置。

调整占用端口
  1. 调整 Server 实例关闭端口为 9006
<Server port="9006" shutdown="SHUTDOWN">
    ...
</Server>
  1. 调整 Connector 端口为 9082
<Connector port="9082" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />
添加应用上下文(如已配置可跳过)
<Host>
    ...
    <!-- 定义应哟目录 api 和应用上下文 '/api'  -->
    <Context docBase="api" path="/api"></Context>
    ...
</Host>
调整集群端口
<Engine name="Catalina" defaultHost="localhost">
    ...

   <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">
        <!-- 指定组播地址  228.0.0.4:45564  -->
        <Membership className="org.apache.catalina.tribes.membership.McastService"
                    address="228.0.0.4"
                    port="45564"
                    frequency="500"
                    dropTime="3000"/>
        <!-- 监听 4200~4300 任一端口,接收组播消息   -->
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                  address="auto"
                  port="4200"
                  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"/>

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

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 文件中占用端口、应用上下文和集群配置。

调整占用端口
  1. 调整 Server 实例关闭端口为 9007
<Server port="9007" shutdown="SHUTDOWN">
    ...
</Server>
  1. 调整 Connector 端口为 9083
<Connector port="9083" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />

添加应用上下文(如已配置可跳过)
<Host>
    ...
    <!-- 定义应哟目录 api 和应用上下文 '/api'  -->
    <Context docBase="api" path="/api"></Context>
    ...
</Host>

调整集群端口
<Engine name="Catalina" defaultHost="localhost">
    ...

   <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">
        <!-- 指定组播地址  228.0.0.4:45564  -->
        <Membership className="org.apache.catalina.tribes.membership.McastService"
                    address="228.0.0.4"
                    port="45564"
                    frequency="500"
                    dropTime="3000"/>
        <!-- 监听 4300~4400 任一端口,接收组播消息   -->
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                  address="auto"
                  port="4200"
                  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"/>

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

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

image

3.3 实例 2 获取 session 中 name 属性的值

访问:http://localhost:9082/api/session/name

image

3.4 实例 3 获取 session 中 name 属性的值

访问:http://localhost:9083/api/session/name

image

至此,验证结束。

posted on 2023-09-01 08:57  不安分的黑娃  阅读(129)  评论(0编辑  收藏  举报