tomcat-自带的简单session共享,小集群适用
前言
在多个tomcat集群中,session共享就是必须,不然前端nginx转发过来不知道之前请求在哪台,就找不到session,导致请求失败。
下面是tomcat自带的session共享的例子,对于小集群够用了,大集群还是建议使用redis或者memcache进行共享。
例子
安装apache-tomcat比较简单可以参照:tomcat-你会怎么部署多个tomcat?
集群配置:
在conf/server.xml文件中找到这行:
<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">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<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.MessageDispatch15Interceptor"/>
</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="/opt/tomcat/tmp/war-temp/"
deployDir="/opt/tomcat/tmp/war-deploy/"
watchDir="/opt/tomcat/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
记得多个tomcat都需要配置,同一个集群里面配置信息保持一直就可以了。如果是其他集群,修改一下address就好了。
测试页面
<html>
<head>
<title> test1</title>
</head>
<body>
SessionID is <%=session.getId()%>
<BR>
SessionIP is <%=request.getServerName()%>
<BR>
SessionPort is <%=request.getServerPort()%>
<%
out.println("Response from tomcat1");
%>
</body>
</html>
nginx上面默认配置是轮询的,请求会依次分发。
第一次访问:
第二次访问:
可以发现两次访问获取到的sessionid是一样的,但是Response是不同的tomcat。
总结
之前公司业务访问量比较少就是用这种方式进行session共享,但是后面业务增长大了,发现session共享会使机器的负载增大,所以还是用redis或者memcache,效率比较高。