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 &quot;%r&quot; %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服务都重启一下

测试

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 &quot;%r&quot; %s %b" />


</Host>







以上是关于tomcat+memcached会话存储的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat实现session会话保持

tomcat session会话保持实验-之Nginx+tomcat+memcached

Apache+Tomcat+Memcached实现会话保持

Nginx+Tomcat+Memcached实现会话保持

Nginx+Tomcat+memcached高可用会话保持

Tomcat+Memcached+Nginx实现session会话共享