前言:
在tomcat集群中,当一个节点出现故障时候,其他节点如何接管故障节点的session信息,下面内容是基于Msm+Memcached来实现session共享的。
Msm: memcached session manager是一个高可用的tomcat sesion 共享解决方案,除了可以从本机的内存中快读读取session信息外,同时可以使用memcached存取session,以实现高可用。
安装在tomcat上的Msm使用本机内存保存session,当一个请求执行完毕之后,如果对应的session在本地不存在,则将该session复制一份到memcached,当该session的下。
[简单环境说明:主机两台,192.168.1.122,192.168.1.123,在192.168.1.122上安装nginx,两台上面分别安装memcached和tomcat,nginx上面放静态文件实现动静分离,分别安装tomcat进行做负载让nginx去调度。具体实现方法如下]
Tomcat的配置
1,确保已经将所需的jar包放入到各个tomcat节点的tomcat安装目录下的lib目录中(/usr/local/tomcat/lib/)
可以在一台或者多台服务器安装tomcat服务,一台多实例看我博客,多实例tomcat安装。http://www.mrliangqi.com/988.html
jar包官网下载:http://code.google.com/p/memcached-session-manager/downloads/list
本地下载地址:https://yunpan.cn/cqZmjbThBUhyN 访问密码 e8c9
[[email protected] soft]# cd msm_lib/
[[email protected] msm_lib]# ls
javolution-5.4.3.1.jar
memcached-session-manager-tc7-1.6.3.jar
spymemcached-2.7.3.jar
memcached-session-manager-1.6.3.jar
msm-javolution-serializer-1.6.3.jar
2,然后修改/usr/local/tomcat/conf/context.xml配置文件,添加以下配置。
<Manager className=”de.javakaffee.web.msm.MemcachedBackupSessionManager”
memcachedNodes=”n1:192.168.1.122:11211,n2:192.168.1.123:11211″
requestUriIgnorePattern=”.*\.(png|gif|jpg|css|js)$”
sessionBackupAsync=”false”
sessionBackupTimeout=”100″
transcoderFactoryClass=”de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory”
copyCollectionsForSerialization=”false” />
3,在各节的/usr/local/tomcat/webapps/ROOT/目录中新建一个aa.jsp的文件并添加以下内容,来验证session.
[在为了区分,把TomcatA改成B,把red改成blue。]
<%@ page language=”java” %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color=”red”>TomcatA.mrliangqi.com</font></h1>
<table align=”centre” border=”1″>
<tr>
<td>Session ID</td>
<% session.setAttribute(“mrliangqi.com”,”mrlianqgi.com”); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
4,启动tomcat来测试session共享是否成功
下面来模拟tomcatA节点故障,看看session会发生什么改变。虽然tomcatA故障,用户请求被调度到tomcatB节点上,但是session集群内的所有的节点都保存了全局的session信息,很好的实现了用户访问的不中断。Session信息在n1上面,而且sessionid没有发现变化。