Tomcat 入门实战(4)--Tomcat 集群 Session 复制

打印 上一主题 下一主题

主题 985|帖子 985|积分 2955

本文主要介绍在 Tomcat 集群中如何进行 Session 复制,文中所使用到的软件版本:Centos 7.9.2009、Java 1.8.0_321、Tomcat 8.5.87。
1、快速配置

取消 conf/server.xml 文件中的以下注释来启用集群:
  1. [/code]使用上述配置将启用 all-to-all 会话复制,它使用 DeltaManager 进行会话增量复制。all-to-all 意味着每个会话都将被复制到群集中的所有其他节点。这对于较小的集群非常有效,但不建议在大型集群(超过4个节点左右)中使用它。此外,当使用 DeltaManage r时,Tomcat 将会话复制到所有节点,甚至是没有部署该应用程序的节点。
  2. 为了解决这些问题,您将需要使用 BackupManager。BackupManager 仅将会话数据复制到一个备份节点,并且仅复制到已部署该应用程序的节点。一旦您使用 DeltaManage r运行了一个简单的集群,您可能希望随着增加集群中节点的数量而迁移到 BackupManager。
  3. 上述配置对应的详细默认配置如下:
  4. [code]<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
  5.          channelSendOptions="8">
  6.   <Manager className="org.apache.catalina.ha.session.DeltaManager"
  7.            expireSessionsOnShutdown="false"
  8.            notifyListenersOnReplication="true"/>
  9.   <Channel className="org.apache.catalina.tribes.group.GroupChannel">
  10.     <Membership className="org.apache.catalina.tribes.membership.McastService"
  11.                 address="228.0.0.4"
  12.                 port="45564"
  13.                 frequency="500"
  14.                 dropTime="3000"/>
  15.     <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
  16.               address="auto"
  17.               port="4000"
  18.               autoBind="100"
  19.               selectorTimeout="5000"
  20.               maxThreads="6"/>
  21.     <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
  22.       <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
  23.     </Sender>
  24.     <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
  25.     <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
  26.   </Channel>
  27.   <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
  28.          filter=""/>
  29.   <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
  30.   <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
  31.             tempDir="/tmp/war-temp/"
  32.             deployDir="/tmp/war-deploy/"
  33.             watchDir="/tmp/war-listen/"
  34.             watchEnabled="false"/>
  35.   <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
  36. </Cluster>
复制代码
以下是一些重要的默认值:
1、组播地址为 228.0.0.4
2、组播端口为 45564(端口和地址一起确定集群成员身份)
3、广播的 IP 是 java.net.InetAddress.getLocalHost().getHostAddress()(确保不要广播127.0.0.1,这是一个常见错误)
4、用于监听复制消息的 TCP 端口是在 4000-4100 范围内第一个可用的服务器套接字
5、侦听器配置为 ClusterSessionListener
6、配置了两个拦截器 TcpFailureDetector 和 MessageDispatchInterceptor
2、Session 复制实现步骤

1、所有会话属性必须实现 java.io.Serializable 接口。
2、在 conf/server.xml 文件中取消注释 Cluster 元素。
3、如果您定义了自定义集群阀门,请确保在 conf/server.xml 文件的 Cluster 元素下也定义了 ReplicationValve。
4、如果 Tomcat 实例在同一台机器上运行,确保每个实例的 Receiver.port 属性是唯一的。在大多数情况下,Tomcat 可以通过自动检测 4000-4100 范围内可用端口来解决此问题。
5、确保应用的 web.xml 具有  元素。
6、如果使用 mod_jk,请确保在 Engine() 中设置 jvmRoute 属性,并且 jvmRoute 属性值与 workers.properties 中的 worker 名称匹配。
7、确保所有节点具有相同的时间并与 NTP 服务同步.
8、确保负载均衡器配置为粘性会话模式。
3、实际操作

3.1、规划

IP端口用途
10.49.196.108080Tomcat1
10.49.196.118080Tomcat2
10.49.196.138080反向代理(Nginx)
3.2、修改 server.xml

取消 Tomcat 中 conf/server.xml 文件的以下注释:
  1. [/code][size=4]3.3、添加 [/size]
  2. 这里直接使用 Tomcat 自带的应用 ROOT 做测试,在 webapps/ROOT/WEB-INF/web.xml 文件中增加 :
  3. [code]<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  4.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  6.                       http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  7.   version="3.1"
  8.   metadata-complete="true">
  9.   <display-name>Welcome to Tomcat</display-name>
  10.   <description>
  11.      Welcome to Tomcat
  12.   </description>
  13.   <distributable/>
  14. </web-app>
复制代码
3.4、添加测试页面

新增 webapps/ROOT/index2.jsp 文件:
  1. <body>
  2. SessionID:<%=session.getId()%>
  3. <br>
  4. SessionIP:<%=request.getLocalAddr()%>
  5. <br>
  6. SessionPort:<%=request.getLocalPort()%>
  7. </body>
复制代码
3.5、配置反向代理

Nginx 的配置如下:
  1. upstream tomcat {
  2.   server 10.49.196.30:8080;
  3.   server 10.49.196.31:8080;
  4. }
  5. server {
  6.   listen 7070;
  7.   server_name  localhost;
  8.   
  9.   location / {
  10.     proxy_pass  http://tomcat;
  11.   }
  12. }
复制代码
3.6、测试

启动两个 Tomcat 及 Nginx,访问代理页面:

 
多次访问代理页面,可以看到 IP 不停的变化,但 SessionID 不变,说明 Session 复制有效。
 
 
参考:https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表