tomcat使用memcached实现session存储

msm工作原理(转载

MSM工作原理: a)Sticky Session(黏性) 模式下的工作原理:
Tomcat本地Session为主Session,Memcached 中的Session为备Session。Request请求到来时,从memcached加载备 Session到 tomcat (仅当tomcat jvmroute发生变化时, 否则直接取Tomcat Session);Request请求结束时,将Tomcat Session更新至memcached,以达到主备同步之目的。 安装在Tomcat上的MSM使用本机内存保存Session,当一个请求执行完毕之后,如果对应的Session在本地不存在(即某用户的第一次请求),则将该Session复制一份至Memcached;当该Session的下一个请求到达时,会使用Tomcat的本地Session,请求处理结束之后,Session的变化会同步更新到 Memcached,保证数据一致。当集群中的一个Tomcat挂掉,下一次请求会被路由到其他Tomcat上。负责处理此此请求的Tomcat并不清楚Session信息,于是从Memcached查找该Session,更新该Session并将其保存至本机。此次请求结束,Session被修改,送回Memcached备份。

b)Non-sticky Session
(非黏性)模式下的工作原理(记住:多台tomcat集群或多个tomcat实例时需要选择Non-Sticky模式,即sticky=“false”):
Tomcat本地Session为中转Session,Memcached1为主Session,Memcached2为备Session。Request请求到来时,从Memcached2加载备Session到tomcat,(当容器中还是没有Session 则从Memcached1加载主Session到tomcat,这种情况是只有一个memcached节点,或者有Memcached1 出错时),Request请求结束时,将Tomcat Session更新至主Memcached1和备memcached2,并且清除Tomcat Session 。以达到主备同步之目的。 多台tomcat集群时 需要选择Non-Sticky模式,即sticky=“false”

1)主机分配

主机 功能
192.168.199.155 tomcat和memcached
192.168.199.157 tomcat和memcached

2)使用yum的方式安装tomcat和memcached

yum install -y tomcat.noarch tomcat-admin-webapps.noarch  tomcat-docs-webapp.noarch    tomcat-webapps.noarch      memcached

3)为两台tomcat准备context目录,此处两台主机同样操作

 <Context path="/myapp"  docBase="/webapps/myapp" reloadable="">
         
       </Context>

4)创建context的网页内容


157主机上
[root@ydong ~]# cat /webapps/myapp/index.jsp 
<html>
    <body bgcolor="green">     
    <center>    
    <%=  request.getSession().getId()  %>    
    <h1>192.168.199.157</h1>
    <h1>port:8080</h1>
    <h1>this is Tomcat-node1 ! </h1> 
    </center>
    </body>
</html>
 
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%><BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%>
<%     out.println("This is Tomcat server 157 !");     %>



155主机上
[root@ydong tomcat]# cat /webapps/myapp/index.jsp 
<html>
    <body bgcolor="green">     
    <center>    
    <%=  request.getSession().getId()  %>    
    <h1>192.168.199.155</h1>
    <h1>port:8080</h1>
    <h1>this is Tomcat-node2! </h1> 
    </center>
    </body>
</html>
 
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%><BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%>
<%     out.println("This is Tomcat server 157 !");     %>

5)启动两台的memcached。此处直接启动,没有修改memcached的属性,可以在/etc/sysconfig/memcached下自行定义。

systemctl start memcached

6)修改tomcatserver.xml文件,在context中间添加以下内容。 此处为stick session方式。 两台主机一样

  <Context path="/myapp"  docBase="/webapps/myapp" reloadable="">
            <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
             memcachedNodes="n1:192.168.199.155:11211,n2:192.168.199.157:11211"         
             sticky="true"
             failoverNodes="n2"                                           
             requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|swf|flv)$"
             transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
             copyCollectionsForSerialization="true"
    />
       </Context>

7)传入需要的jar包,忽略apache-tomcat-9.0.40在这里插入图片描述
8)重启tomcat,观察日志是否有启动成功提示

十二月 09, 2020 8:16:50 下午 de.javakaffee.web.msm.MemcachedSessionService startInternal
信息: --------
-  finished initialization:
- sticky: true
- operation timeout: 1000
- node ids: [n1]
- failover node ids: [n2]
- storage key prefix: null
- locking mode: null (expiration: 5s)

9)进行nginx反代,此处只进行了简单的反代,如需添加其中选项,可以参考此处

10)访问nginx
在这里插入图片描述
在这里插入图片描述
可以发现此处内容会变,但是session不会改变,证明已经成功

PS

如果利用nginx访问发现session一直改变,而且tomcat日志已经显示msm启动成功,是jar包兼容的问题,jar包的版本很关键。上述jar包只测试了yum安装下的tc7版。

猜你喜欢

转载自blog.csdn.net/qq_44564366/article/details/110940427
今日推荐