Tomcat集群的session会话共享方案
一、session黏性
Nginx的ip_hash方式进行负载均衡。
如果用户的IP地址不发生变化,将每次都访问同一台服务器。
upstream tomcat{
ip_hash;
server 192.168.1.1:8080 ;
server 192.168.1.2:8080 ;
}
#nginx配置文件使用session粘性,使客户端在一端时间内访问同一台tomcat,从而避免切换后导致的session丢失。但是如果tomcat节点挂掉,session依然会丢失。
二、Tomcat Session集群
Tomcat官方文档,默认集群配置:
<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.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和Host内,配置的影响范围不同。
复制web.xml到项目的WEB-INF目录内,并且在 web.xml 中的倒数第二行加入 <distributable/> 选项。
最后重启Tomcat服务。
官方文档地址:https://tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html
三、seesion共享服务器
3.1 memcached-session-manager
下载memcached-session-manager,将以下2个jar包,放置在CATALINA_HOME/lib/下。
memcached-session-manager-${version}.jar
memcached-session-manager-tc8-${version}.jar
#tomcat8则使用tc83.2 数据库驱动
下载memcached驱动,将驱动jar包,放置在CATALINA_HOME/lib/下。
spymemcached-${version}.jar
#若使用redis则为jedis-3.0.0.jar3.3序列化
官方推荐方式
- kryo-serializer:msm-kryo-serializer,kryo-serializers-0.34 +,kryo-3.x,minlog,reflectasm,asm-5.x,objenesis-2.x
3.4 sticky模式
3.4.1 将配置内容放到$CATALINA_HOME/conf/context.xml中。
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
#默认使用的节点,这里的n1、n2为别名。
failoverNodes="n1"
#发生故障时,使用的节点
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>以tomcat的内存为主,以memcached n2为备。若默认的memcached不可用,则使用切换节点n1作为备。
3.4.2 原理
当请求结束时Tomcat的session会送给memcached备份。即Tomcat session主session,memcached session 为备session,使用memcached相当于备份了一份seesion。
查询session时Tomcat会优先从自己内存的session,Tomcat通过jvmRoute发现不是自己的session,便从memcached中找到该session,更新本机session,请求完成后更新memcached。
3.4.3 部署
<t1> <t2>
. \ / .
. X .
. / \ .
<m1> <m2>3.5 non-sticky模式
3.5.1 原理
从msm 1.4.0之后开始支持non-sticky模式。
Tomcat session为中转session,如果n1为主session,n2为备session。产生新的session会发送给主、备memcached,并清除本地session。
n1下线,n2转正,n1再次上线,n2依然是主session存储节点。
3.5.2 配置
将配置内容放到$CATALINA_HOME/conf/context.xml中。
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>3.6 non-sticky模式下使用redis配置
下载jedis.jar,放到CATALINA_HOME/lib/下。
#yum install redis
#vim /etc/redis.conf
bind 0.0.0.0
#systemctl restart redis将配置内容放到$CATALINA_HOME/conf/context.xml中。
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="redis://redis.example.com"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>3.7 memcached-session-manager的GitHub文档页面:
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration