首页 > 技术文章 > Tomcat集群 实现Session复制共享

xiaozhebao 2020-03-30 17:47 原文

环境:

IP 角色 软件
192.168.1.131 proxy-server nginx
192.168.1.124:8080 Tomcat1 tomcat
192.168.1.124:8081 Tomcat2 tomcat
192.168.1.124:8082 Tomcat3 tomcat
192.168.1.124:8083 Tomcat4 tomcat

 

 

 

 

 

 

 

 

 

proxy-server配置代理:

 

 1  [root@gz01-nginx-proxy-master ~]# vim /usr/local/nginx/conf/nginx.conf
 2   http {
 3       include       mime.types;
 4       default_type  application/octet-stream;
 5       upstream tomcatlist {
 6          
 7          server 192.168.1.124:8080 weight=1;
 8          server 192.168.1.124:8081 weight=2;
 9          server 192.168.1.124:8082 weight=3;
10          server 192.168.1.124:8083 weight=4;
11          }
12  location / {
13 
14       proxy_pass http://tomcatlist;
15 
16        }
17  location ~* \.(jsp|do)$ {
18              proxy_pass http://tomcatlist;
19            proxy_set_header Host $host;
20        }
21  [root@gz01-nginx-proxy-master ~]# /usr/local/nginx/sbin/nginx -t
22   nginx: the configuration file /usr/local/nginx-1.8.1/conf/nginx.conf syntax is ok
23   nginx: configuration file /usr/local/nginx-1.8.1/conf/nginx.conf test is successful
24  [root@gz01-nginx-proxy-master ~]# /usr/local/nginx/sbin/nginx -s reload

tomcat 集群会话共享的配置:

192.168.1.124:8080

192.168.1.124:8081

192.168.1.124:8082

192.168.1.124:8083

配置一样的信息即可

 1 [root@gz01-tomcat-node01 ~]# vim /usr/local/tomcat/conf/server.xml
 2  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
 3   <Manager className="org.apache.catalina.ha.session.DeltaManager"
 4   expireSessionsOnShutdown="false"
 5   notifyListenersOnReplication="true"/>
 6  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
 7  <Membership className="org.apache.catalina.tribes.membership.McastService"
 8  address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
 9  <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
10  address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/>
11  <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
12  <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
13  </Sender>
14  <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
15  <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
16  </Channel>
17  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="/"/>
18  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
19  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
20  </Cluster>

保存配置启动tomcat

 1 [root@gz01-tomcat-node01 logs]# /usr/local/tomcat/bin/startup.sh  

 

创建测试页面

设置web.xml 的配置文件所有tomcat集群主机上(/usr/local/tomcat/webapps/ROOT/WEB-INF)加入<distributable/> 表示分布式

 [root@gz01-tomcat-node01 WEB-INF]# vim web.xml

<distributable/>

</web-app> 

所有tomcat集群主机上写个测试配置文件

 1 vim /usr/local/tomcat/webapps/ROOT/index.jsp 

 1 <%@ page language="java" %>
 2 <%@ page import="java.util.*" %>
 3 <html>
 4 <head>
 5 <title>>Tomcat 192.168.1.124:8080 </title>
 6         </head>
 7         <body>
 8 
 9 <h1><font color="blue">Tomcat 192.168.1.124:8080 </h1>
10 <table align="centre" border="1">
11 <tr>
12 <td>Session ID</td>
13 <% session.setAttribute("abc","abc"); %>
14 <td><%= session.getId() %></td>
15 </tr>
16 <tr>
17 <td>Created on</td>
18 <td><%= session.getCreationTime() %></td>
19 </tr>
20 </table>
21         </body>
22 </html>

 

浏览器测试(轮询,但是session ID是一样的,会话保持成功)

 

 

 

 

 

 

 

 

 

 

 

 

session复制共享:session replication,tomcat自带session共享,主要是指集群环境下,多台应用服务器之间同步session,使session保持一致,对外透明。 如果其中一台服务器发生故障,根据负载均衡的原理,调度器会遍历寻找可用节点,分发请求,由于session已同步,故能保证用户的session信息不会丢失,会话复制,。

此方案的不足之处:
必须在同一种中间件之间完成(如:tomcat-tomcat之间).

session复制带来的性能损失会快速增加.特别是当session中保存了较大的对象,而且对象变化较快时, 性能下降更加显著,会消耗系统性能。这种特性使得web应用的水平扩展受到了限制。

Session内容通过广播同步给成员,会造成网络流量瓶颈,即便是内网瓶颈。
在大并发下表现并不好

 

 

  1  Cluster配置参数
  2 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
  3   <Manager className="org.apache.catalina.ha.session.DeltaManager"
  4   expireSessionsOnShutdown="false"
  5   notifyListenersOnReplication="true"/>
  6  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
  7  <Membership className="org.apache.catalina.tribes.membership.McastService"
  8  address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
  9  <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
 10  address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/>
 11  <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
 12  <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
 13  </Sender>
 14  <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
 15  <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
 16  </Channel>
 17  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="/"/>
 18  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
 19  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
 20  </Cluster>
 21  
 22 
 23 1、Cluster配置:
 24 Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点.
 25 className 表示tomcat集群时,之间相互传递信息使用那个类来实现信息之间的传递.
 26 channelSendOptions可以设置为2、4810,每个数字代表一种方式
 27   2 = Channel.SEND_OPTIONS_USE_ACK(确认发送)
 28   4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步发送)
 29   8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(异步发送)
 30 在异步模式下,可以通过加上确认发送(Acknowledge)来提高可靠性,此时channelSendOptions设为10,半同步
 31 例:
 32 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
 33  
 34 2、Manager
 352-1)Manager介绍
 36 Manger对象用于实现HTTP会话管理的功能,Tomcat中有4种Manger的实现:
 37 ① StandardManager
 38 Tomcat6的默认会话管理器,用于非集群环境中对单个处于运行状态的Tomcat实例会话进行管理。当Tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名叫SESSION.ser的文件,并在Tomcat下次启动时读取此文件。
 39 ② PersistentManager
 40 当一个会话长时间处于空闲状态时会被写入到swap会话对象,这对于内存资源比较吃紧的应用环境来说比较有用。
 41 ③ DeltaManager
 42 用于Tomcat集群的会话管理器,它通过将改变了会话数据同步给集群中的其它节点实现会话复制。这种实现会将所有会话的改变同步给集群中的每一个节点,也是在集群环境中用得最多的一种实现方式。
 43 ④ BackupManager
 44 用于Tomcat集群的会话管理器,与DeltaManager不同的是,某节点会话的改变只会同步给集群中的另一个而非所有节点
 452-2)Manager配置
 46 className-指定实现org.apache.catalina.ha.ClusterManager接口的类,信息之间的管理
 47 expireSessionsOnShutdown-设置为true时,一个节点关闭,将导致集群下的所有Session失效
 48 notifyListenersOnReplication-集群下节点间的Session复制、删除操作,是否通知session listeners
 49  
 50 3、Channel 频道的介绍和配置
 513-1)介绍
 52 Channel是Tomcat节点之间进行通讯的工具。Channel包括4个组件:
 53   Membership:集群的可用节点列表
 54   Receiver :接收器,负责接收消息
 55   Sender :发送器,负责发送消息
 56   Interceptor :Cluster的拦截器
 57  
 583-2)Membership 配置
 59 ① Membership:维护集群的可用节点列表,它可以检查到新增的节点,也可以检查到没有心跳的节点
 60 ② className-指定Membership使用的类
 61 ③ address-组播地址
 62 ④ port-组播端口
 63 ⑤ frequency-发送心跳(向组播地址发送UDP数据包)的时间间隔(单位:ms)。默认值为500
 64 ⑥ dropTime-Membership在dropTime(单位:ms)内未收到某一节点的心跳,则将该节点从可用节点列表删除。默认值为3000
 65  
 66 注:组播(Multicast):一个发送者和多个接收者之间实现一对多的网络连接。
 67 一个发送者同时给多个接收者传输相同的数据,只需复制一份相同的数据包。
 68 它提高了数据传送效率,减少了骨干网络出现拥塞的可能性
 69 相同组播地址、端口的Tomcat节点,可以组成集群下的子集群
 70 例:
 71 <Membership className="org.apache.catalina.tribes.membership.McastService"
 72 address="228.0.0.4"
 73 port="45564"
 74 frequency="500"
 75 dropTime="3000"/>
 76  
 773-3)Receiver 配置
 78 Receiver : 接收器,负责接收消息
 79 接收器分为两种:BioReceiver(阻塞式)、NioReceiver(非阻塞式)
 80   className-指定Receiver使用的类
 81   address-接收消息的地址
 82   port-接收消息的端口
 83   autoBind-端口的变化区间
 84   如果port为4000,autoBind为100,接收器将在4000-4099间取一个端口,进行监听
 85   selectorTimeout-NioReceiver内轮询的超时时间
 86   maxThreads-线程池的最大线程数
 87 例:
 88 <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
 89 address="auto"
 90 port="4000"
 91 autoBind="100"
 92 selectorTimeout="5000"
 93 maxThreads="6"/>
 94  
 953-4)Sender 配置
 96 Sender : 发送器,负责发送消息
 97 Sender内嵌了Transport组件,Transport真正负责发送消息
 98 Transport:定义传输方式
 99 Transport分为两种:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式)
100 例:
101 <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
102 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
103 </Sender>
104  
1053-5)Interceptor 配置
106 Interceptor : Cluster的拦截器
107 ① TcpFailureDetector-网络、系统比较繁忙时,Membership可能无法及时更新可用节点列表,此时TcpFailureDetector可以拦截到某个节点关闭的信息,并尝试通过TCP连接到此节点,以确保此节点真正关闭,从而更新集群可以用节点列表
108 ② MessageDispatch15Interceptor-查看Cluster组件发送消息的方式是否设置为Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster标签下的channelSendOptions为8时)。 设置为Channel.SEND_OPTIONS_ASYNCHRONOUS时,MessageDispatch15Interceptor先将等待发送的消息进行排队,然后将排好队的消息转给Sender
109 例:
110 <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
111 <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
112  
113 4、ClusterListener 配置
114 ClusterListener : 监听器,监听Cluster组件接收的消息
115 使用DeltaManager时,Cluster接收的信息通过ClusterSessionListener传递给DeltaManager
116 例:
117 <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
118  

 

推荐阅读