tomcat+memcached会话存储
Posted Linux日记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tomcat+memcached会话存储相关的知识,希望对你有一定的参考价值。
session存储的方式
本篇文章实现tomcat集群中的session存储的另一种实现方式:使用memcached缓存存储session
会话的解决方案:
会话绑定 (nginx 的ip_hash算法,haproxy的url_param算法)
会话共享(各tomcat集群会话共享) :小规模集群
会话存储(共享存储服务:memcached的一致性哈希算法)
tomcat+memcached的session存储方案
memcached-session-manager是一个tomcat会话管理器,它将会话保存在memcached或Redis中,用于高可用性,可伸缩和容错的Web应用程序。它支持粘性和非粘性配置,目前正在使用tomcat 6.x,7.x,8.x和9.x. 对于粘性会话,支持会话故障转移(tomcat崩溃),对于非粘性会话,这是默认值(默认情况下,不同的tomcats为不同的请求提供会话)。还通过迁移会话来支持memcached故障转移(memcached crash)。也不存在单点故障,因此当memcached失败时,会话不会丢失(但可以在tomcat或其他memcached中使用)。
memcached-session-manager官方安装与介绍文档:mem官方文档
部署tomcat+memcached session存储
下载msm jar包到tomcat
wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/2.3.0/memcached-session-manager-tc7-2.3.0.jar
wget http://repo1.maven.org/maven2/net/spy/spymemcached/2.12.3/spymemcached-2.12.3.jar
wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.0/memcached-session-manager-2.3.0.jar
下载序列化工具 (所有tomcat节点都下载)
wget http://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/2.3.0/msm-kryo-serializer-2.3.0.jar
wget http://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.42/kryo-serializers-0.42.jar
wget http://repo1.maven.org/maven2/com/esotericsoftware/kryo/4.0.2/kryo-4.0.2.jar
wget http://repo1.maven.org/maven2/com/esotericsoftware/minlog/1.3.0/minlog-1.3.0.jar
wget http://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.7/reflectasm-1.11.7.jar
wget http://repo1.maven.org/maven2/org/ow2/asm/asm/6.2/asm-6.2.jar
wget http://repo1.maven.org/maven2/org/objenesis/objenesis/2.6/objenesis-2.6.jar
将上面的下载的所有的jar包放到tomcat的库文件目录中,在/usr/locat/tomcat/lib 目录下
[root@tomcat-1 jar]# mv * /usr/local/tomcat/lib/
[root@tomcat-1 kryo]# mv * /usr/local/tomcat/lib/
上面的操作所有tomcat都要进行
配置tomcat
在要使用session存储的Host上配置,配置前最好先关闭tomcat服务进行配置。
#关闭服务
[root@tomcat-1 ~]# /usr/local/tomcat/bin/catalina.sh stop
配置tomcat server.xml 文件,配置tomcat会话管理器的时候就不需要使用session共享的方式了,在原来的tomcat服务中使用了session共享的方式,这里要将cluster集群配置的内容删掉,使用msm的配置
在tomcat各节点配置如下
vim /usr/local/tomcat/conf/server.xml
#添加Context标签定义,定义tomcat会话粘性
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/" docBase="ROOT" reloadable="">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.214.148:11211,n2:192.168.214.150:11211" #定义memcached节点
failoverNodes="n2" #故障转移节点,当前活动节点为n2
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" #忽略静态内容uri匹配
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/> #转码类,就是下载的那一堆类包
</Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
在tomcat各节点上添加memcached节点的主机名解析
vim /etc/hosts
192.168.214.148 memcached1.node01
192.168.214.150 memcached2.node02
启动各节点tomcat,同时查看日志信息
#启动
[root@tomcat-1 ~]# /usr/local/tomcat/bin/catalina.sh start
#查看各节点日志
信息: --------
- finished initialization: #初始化完成
- sticky: true #默认启用了sticky机制
- operation timeout: 1000 # 超时时长1000毫秒
- node ids: [n1] #当前活动节点
- failover node ids: [n2] #备用节点
- storage key prefix: null
- locking mode: null (expiration: 5s)
--------
至此,tomcat的session存储配置结束配置完成后,检查前端调度器,tomcat节点的nginx与tomcat服务和后端memcached复制状态是否正常,最好将tomcat与memcached服务都重启一下
测试
此时的会话不会改变,访问后正常情况下会话已经存在在memcached中,查看memcached缓存内容使用memdum指令:安装包为 libmemcached
[root@memcached1 ~]# memdump --servers="memcached1.node01:11211"
34D27F5EAFEB3670738B4EF7767845F0-n1.node02
34D27F5EAFEB3670738B4EF7767845F0-n1.node01
86242EB704442CB77226A0A88CBADD4E-n1.node02
73B91D605A9126483FB1BD81C202FDF8-n1.node01
73B91D605A9126483FB1BD81C202FDF8-n1.node02
86EAF407CEB1EF018E8A1D19854ED8FA-n1.node02
0BA7F8A51161173C863477796D468C87-n1.node02
564BBE900BA926CB19EFA76E99B47F35-n1.node02
BFB896A93CCA1FC9F9A1B5C16E72247D-n1.node02
8F5CDCEFEBB6340F7160AE61C2DF23B5-n1.node02
1E855FEA26BA1E43E4080D9A95C0A7F3-n1.node02
粘性会话与非粘性会话
如果是tomcat down机,将会导致该节点的session丢失,因为上面的配置是粘性会话( sticky sessions + kryo)的方式,这种方式不会故障自动转移,也不会复制session。
规避这样的问题,应该使用非粘性会话(non-sticky sessions)方式,使用non-sticky sessions方式不会出现这样的问题,non-sticky sessions有session复制的功能。但是其缺
点在于Session复制需要系统资源和网络开销。
non-sticky sessions的配置如下
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/" docBase="ROOT" reloadable="">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.214.148:11211,n2:192.168.214.150:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="auto"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
以上是关于tomcat+memcached会话存储的主要内容,如果未能解决你的问题,请参考以下文章