Seesion 共享 一(Tomcat Cluster组件)
官网介绍:
The tomcat cluster implementation provides session replication, context attribute replication and cluster wide WAR file deployment. While the Cluster
configuration is fairly complex, the default configuration will work for most people out of the box.
The Tomcat Cluster implementation is very extensible, and hence we have exposed a myriad of options, making the configuration seem like a lot, but don't lose faith, instead you have a tremendous control over what is going on.
大概意思说:Tomcat Cluster 实现Session复制,虽然Cluster 配置复杂,但是还是能满足大多数人要求
Tomcat Cluster 配置详解
<!-- channelSendOptions: Cluster 发送消息的方式 2 = Channel.SEND_OPTIONS_USE_ACK(确认发送) 4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步发送) 8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(异步发送) 10= 在异步模式下,可以通过加上确认发送(Acknowledge)来提高可靠性,此时channelSendOptions设为 --> <Cluster channelSendOptions="8" className="org.apache.catalina.ha.tcp.SimpleTcpCluster"> <!-- Manager:决定如何管理集群的Session信息 BackupManager:-集群下的所有Session,将放到一个备份节点。集群下的所有节点都可以访问此备份节点 DeltaManager:-集群下某一节点生成、改动的Session,将复制到其他节点。DeltaManager是Tomcat默认的集群Manager,能满足一般的开发需求 使用DeltaManager,每个节点部署的应用要一样;使用BackupManager,每个节点部署的应用可以不一样 expireSessionsOnShutdown: 设置为true时,一个节点关闭,将导致集群下的所有Session失效 notifyListenersOnReplication: 集群下节点间的Session复制、删除操作,是否通知session listeners --> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <!-- Channel:Tomcat节点之间进行通讯的工具。 5个组件:Membership、Receiver、Sender、Transport、Intercept --> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <!-- Membership 组件:Membership维护集群的可用节点列表。它可以检查到新增的节点,也可以检查到没有心跳的节点 className : 指定Membership使用的类 address :组播地址 port : 组播端口 frequency : 发送心跳(向组播地址发送UDP数据包)的时间间隔(单位:ms)。默认值为500 dropTime:Membership在dropTime(单位:ms)内未收到某一节点的心跳,则将该节点从可用节点列表删除。默认值为3000 组播(Multicast):一个发送者和多个接收者之间实现一对多的网络连接。一个发送者同时给多个接收者传输相同的数据,只需复制一份相同的数据包。它提高了数据传送效率,减少了骨干网络出现拥塞的可能性 相同组播地址、端口的Tomcat节点,可以组成集群下的子集群 --> <Membership address="228.0.0.4" className="org.apache.catalina.tribes.membership.McastService" dropTime="3000" frequency="500" port="45564"/> <!-- Receiver 组件:接收器,负责接收消息; Receiver 组件分为两种:BioReceiver(阻塞式)、NioReceiver(非阻塞式) className:指定Receiver接收器 address:接收消息的地址 port:接收消息的端口 autoBind:端口的变化区间 如果port为4000,autoBind为100,接收器将在4000-4099间取一个端口,进行监听 selectorTimeout:NioReceiver内轮询的超时时间 maxThreads:线程池的最大线程数 --> <Receiver address="auto" autoBind="100" className="org.apache.catalina.tribes.transport.nio.NioReceiver" maxThreads="6" port="4000" selectorTimeout="5000"/> <!-- Sender 组件:发送器,负责发送消息 内嵌了Transport组件,Transport真正负责发送消息 Transport分为两种: bio.PooledMultiSender(阻塞式) nio.PooledParallelSender(非阻塞式) --> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <!-- Interceptor : Cluster的拦截器 MessageDispatch15Interceptor-MessageDispatch15Interceptor 查看Cluster组件发送消息的方式是否设置为Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster标签下的channelSendOptions为8时)。 设置为 Channel.SEND_OPTIONS_ASYNCHRONOUS时,MessageDispatch15Interceptor先将等待发送的消息进行排队,然后将排好队的消息转给Sender --> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel> <!-- Valve :Tomcat的拦截器 --> <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" deployDir="/tmp/war-deploy/" tempDir="/tmp/war-temp/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <!-- ClusterListener:监听Cluster组件接收的消息 --> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
参考:http://wiki.jikexueyuan.com/project/tomcat/clustering.html
官网:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html#Bind_session_after_crash_to_failover_node
具体用法:
1.在tomcat server.xml Engine 标签里面加上如上的配置,或者使用默认配置
<Engine defaultHost="localhost" jvmRoute="cluster2" name="Catalina"> <!--For clustering, please take a look at documentation at: /docs/cluster-howto.html (simple how to) /docs/config/cluster.html (reference documentation) --> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> .......
2. 配置 项目的web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>cluster Demo</display-name> <distributable/> ...............
3. 启动项目 测试
启动日志出现如下情况,
四月 09, 2018 8:50:41 下午 org.apache.catalina.tribes.io.BufferPool getBufferPool
信息: Created a buffer pool with max size:104857600 bytes of type:org.apache.catalina.tribes.io.BufferPool15Impl
四月 09, 2018 8:50:42 下午 org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
信息: Replication member added:org.apache.catalina.tribes.membership.MemberImpl[tcp://{10, 10, 12, 151}:4001,{10, 10, 12, 151},4001, alive=1010, securePort=-1, UDP Port=-1, id={-48 -29 -8 78 31 -94 74 123 -71 68 -22 -26 68 -99 -81 -94 }, payload={}, command={}, domain={}, ]
具体实现,tomcat 组播地址,第一个tomcat 启动完成,组播创建,第二个tomcat 启动优先访问组播有没有创建,如果创建则通知组播成员,我也是seesion 复制的成员
注意点:
1.需放在session 中的对象必须实现 java.io.Serializable 接口
2.需要在你的项目的web.xml 加上 <distributable/>
个人遇见的坑:
1.不要把request、response、session 对象存储到 session 中,会出现 java.lang.Object NotSerializable 之类的错误,发现找不到错误来源,来来回回兜了一大圈