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)修改tomcat
的server.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版。