不积跬步,无以至千里;不积小流,无以成江海。

Tomat集群,使用memcached-session-manager实现session共享

服 务 器 康康 1765℃ 0评论

软件集群部署一个比较关注的问题就是session共享,在多数情况下,为了解决缓解服务器压力,会将软件部署到多个服务器上,这就是集群。一旦集群,用户的请求就可能被分配到不同服务器,此时就产生session不同步的问题,可能这边刚登录,下一个请求就提示掉线了。Memcached_Session_Manager,简称msm,这就是一个用于解决分布式tomcat环境下session共享的问题的开源解决方案。

一 简介

(原文地址:http://code.google.com/p/memcached-session-manager/

引言

MSM--memcached session manager是一个高可用的Tomcat session共享解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,同时可使用memcached存取Session,以实现高可用。

对于非黏性Session,memcached直接存储session。

除memcached外,还可以其他缓存组件如memcachedbmembase等。

特性

支持Tomcat6、Tomcat7

支持黏性、非黏性Session

无单一故障点

可处理tomcat故障转移

可处理memcached故障转移

插件式session序列化

允许异步保存session,以提升响应速度

只有当session有修改时,才会将session写回memcached

JMX管理&监控

MSM解决的问题

假设你有一个Tomcat集群,使用黏性session,如何应对单点故障问题?为了应对更多的并发量和可用性,你可以不断的增加Tomcat节点,但是单点故障仍旧会是个问题:如果使用黏性Session,一个Tomcat故障时,其他Tomcat并不能接管故障Tomcat节点的Session。

解决此问题的思路就是将黏性Session同时保存在Memcached中,如果单个Tomcat发生故障,集群中的其他Tomcat可以从Memcached中得到Session信息。

【注】对于非黏性Session,MSM  V1.4.0及以后版本已经支持。

MSM如何工作

【注】以下论述仅针对黏性Session

安装在Tomcat上的MSM使用本机内存保存session,和StandardManager一样。另外,当一个请求结束时,session会被送回Memcached进行备份。当下一次请求开始时,本地Session可用,直接服务,请求结束后,session又被送回Memcached备份。

当集群中的一个Tomcat挂掉,下一次请求会被路由到其他Tomcat上。负责处理此此请求的Tomcat并不清楚Session的信息。此时它会从Memcached查找该Session,更新该Session并将其保存在本机内容。此次请求结束,session被修改,送回Memcached备份。

What else?

上边介绍的是处理Tomcat故障转移,MSM又是如何处理Memcached故障转移呢?

如果一个Memcached故障,当前Memcached中的Session会转移到其他Memcached节点,同时,JSESSIONID被修改并送回浏览器。

如果使用黏性Session,应确保loadbalancer中配置生成的JSESSIONID无任何后缀。

SESSIONID的格式

MSM知道Memcached节点列表,这些节点标识会存储在SESSIONID中,SESSIONID值类似:602F7397FBE4D9932E59A9D0E52FE178-n1 【其中n1为Memcached节点标识】

二 安装和使用

环境

memcached  端口11211

tomcat7 端口 8180

tomcat7 端口 8280

jdk1.8

使用kryo序列化,所需jar包,放到tomcat/lib下

kryo-3.0.3.jar
kryo-serializers-0.38.jar
asm-5.1.jar
minlog-1.3.0.jar
spymemcached-2.11.1.jar
reflectasm-1.11.3.jar
msm-kryo-serializer-1.9.3.jar
memcached-session-manager-1.9.3.jar
memcached-session-manager-tc7-1.9.3.jar

配置tomcat

编辑conf/context.xml(两个tomcat配置相同):

<Manager

className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:127.0.0.1:11211"

sticky="false"

sessionBackupAsync="false"

lockingMode="uriPattern:/path1|/path2"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

写一个测试的jsp:

Server Info:
SessionID:<%=session.getId()%>
ServerIP:<%=request.getServerName()%>
ServerPort:<%=request.getServerPort()%>

启动memcached,启动2个tomcat

 

三 所需jar包下载

msm-jar

转载请注明:左手代码右手诗 » Tomat集群,使用memcached-session-manager实现session共享

喜欢 (0)or分享 (0)
发表我的评论
取消评论

 

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址