Memcached_Session_Manager介绍及使用



MSM--Memcached_Session_Manager介绍及使用

url: http://www.iteye.com/topic/1125301

http://gong1208.iteye.com/blog/1596120

发表时间:2012-07-17  


MSM--Memcached_Session_Manager介绍及使用

我们都知道对于一些大型的web2.0的网站,在正式部署时一般是部署在不同故障域的多台应用服务器上,以j2ee应用为例,一般我们都会部署在tomcat下,假如我们部署了10台tomcat服务器,那这10台tomcat可能是部署在不同的机器上,然后将应用程序copy到这10台tomcat下,然后启动所有tomcat,一般来说这样做的目的是为了达到负载均衡以及避免单点故障,另外也考虑到国内网络环境的原因,避免跨网络运营商访问而导致访问速度低下的问题,当然不要忘了坐镇这10台tomcat前端的还有我们的反向代理服务器,比如nginx,这个就是另一个话题了,我今天主要讲的是,对于这种分布式tomcat环境,我们如何保证session 的唯一性(我假定你知道session是什么)。这也是在日期公司的一个项目中负责解决的一个问题,当然实际上这并不是什么新的议题,之前就有很多解决方案,但是一般来说的大体的解决方案是自己通过编写一段代码或者通过配置tomcat的filter,将产生的session放到同一个内存数据库中,事实上这确实可行的,只不过我比较懒,我总是觉得这种问题应该有更省事更成熟的解决方案,那确实是有的,也就是我马上介绍的 Memcached_Session_Manager,简称msm,这就是一个用于解决分布式tomcat环境下session共享的问题的开源解决方案。

一 简介

(以下内容由个人根据msm官网大意翻译,原文地址:http://code.google.com/p/memcached-session-manager/)

 引言

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

对于非黏性Sessionmemcached直接存储session

memcached外,还可以其他缓存组件如memcachedb, membase等。

 特性

   支持Tomcat6Tomcat7

 支持黏性、非黏性Session

    无单一故障点

         可处理tomcat故障转移

         可处理memcached故障转移

         插件式session序列化

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

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

         JMX管理&监控

MSM解决的问题

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

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

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

MSM如何工作

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

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

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

 

 

.Memcached_Session_Manager介绍及使用_第1张图片

What else

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

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

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

SESSIONID的格式

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

 

二 安装

 

参考网站:http://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration

 

环境

 

1. Linux 环境

2. Tomcat7.X 3台),在同一台机器上启动三台Tomcat需要修改conf/server.xml中的三个端口:808080058009

3. MemBase 1台),也可采用memcached,使用方法一样,只是在java客户端连接时有不同。

4. nginx

 

准备的jar包

 

注意:不同的tomcat版本(tomcat6tomcat7)所需的包不一样,需要针对tomcat版本下载对应的包.

1.这是采用的最新稳定版1.6.1,序列化方式使用的是kryo,注意版本要求与msm版本基本一致,建议统一采用最新稳定版,如下。其中序列化方式是可选的。

Memcached_Session_Manager介绍及使用_第2张图片

2.这是采用的javolution的序列化方式所有需要的包

Memcached_Session_Manager介绍及使用_第3张图片

建议采用kryo序列化方式,效率更高。

 

配置

1. 将上面所提到的包全部拷贝到tomcatlib下(三台tomcat都需要)

        2. 修改每台tomcatconf目录下得context.xml文件或者server.xml文件,在其中加入如下任意一段代码(注意:当使用多台tomcat时,一定要使用non-sticky模式):

A:使用默认的sticky sessionkryo序列化方式,memcached缓存

 

Java代码 复制代码  收藏代码
  1. <Context>  
  2.   ...  
  3.   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
  4.     memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"  
  5.     failoverNodes="n1"  
  6.     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
  7.     transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
  8.     />  
  9. </Context>  

 

B:使用non-sticky session

Java代码 复制代码  收藏代码
  1. <Context>  
  2.   
  3.   ...  
  4.   
  5.   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
  6.  memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"  
  7.     sticky="false"  
  8.     sessionBackupAsync="false"  
  9.     lockingMode="uriPattern:/path1|/path2"  
  10.     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
  11.  transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
  12.     />  
  13.   
  14. </Context>  

C:使用membase

Java代码 复制代码  收藏代码
  1. <Context>  
  2.   
  3.   ...  
  4.   
  5.   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
  6.     memcachedNodes="http://host1.yourdomain.com:8091/pools"  
  7.     username="bucket1"  
  8.     password="topsecret"  
  9.     memcachedProtocol="binary"  
  10.     sticky="false"  
  11.     sessionBackupAsync="false"  
  12.     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
  13.  transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
  14.     />  
  15.   
  16. </Context>  

当使用javolution序列化方式时将:

Java代码 复制代码  收藏代码
  1. transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory”   

替换为: 

 

Java代码 复制代码  收藏代码
  1. transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"   

 

配置完成后,分别启动tomcat,正常启动说明msm配置成功。

3. 最后附上nginx配置:

修改配置文件nginx\conf\nginx.conf

1. 找到内容server {

在它的上面加入如下内容:

 

Java代码 复制代码  收藏代码
  1. upstream  10.6.53.120 {  
  2. ip_hash;  ----#ip_hash策略将同一IP的所有请求都转发到同一应用服务器  
  3. server   10.6.53.120:8080;---------我的tomcat端口号  
  4. server   10.6.53.120:7080;  
  5. server   10.6.53.120:6080;  
  6. }<span>(</span><span>这是负载切换使用的服务器网站</span><span>IP)</span>  

2. 找到

Java代码 复制代码  收藏代码
  1. location / {  
  2. root   html;  
  3. index  index.html index.htm;  
  4. }  

把内容更改如下:

Java代码 复制代码  收藏代码
  1. location / {  
  2. proxy_pass http://10.6.53.120  
  3. proxy_redirect default;  
  4. proxy_connect_timeout 10;  added by me(跟代理服务器连接的超时时间,必须留意这个time out时间不能超过10秒.当一台服务器当掉时,过10秒转发到另外一台服务器)  
  5. }   

3.  找到

Java代码 复制代码  收藏代码
  1. server {  
  2. listen       80;  
  3. server_name  localhost;  

把内容改成如下:

Java代码 复制代码  收藏代码
  1. server {  
  2. listen       80;  
  3. server_name  10.6.53.120;  

 (这是监听访问域名绑定那台服务器80端口的请求)

到这里所有的配置已经完成,现在准备一个简单的web工程,并分别部署到三台tomcat下。启动memcachedmembase),启动三台tomcat,启动nginx,然后在地址栏输入url地址,看能否成功访问。关闭其中一台tomcat,看是否仍然能够正常访问,能够则说明配置nginx配置成功。

 

三 原理

MSM(memcached-session-manager) 支持tomcat6 tomcat7 ,利用 ValueTomcat 阀)对Request进行跟踪。Request请求到来时,从memcached加载sessionRequest请求结束时,将tomcat session更新至memcached,以达到session共享之目的, 支持 sticky   non-sticky 模式。需要注意的是使用sticky模式时需要配置jvmroute参数,配置方式如下:

配置$CATALINA_HOME/conf/server.xml

Java代码 复制代码  收藏代码
  1. <Engine name="Catalina"defaultHost="localhost"jvmRoute="tomcat2">  

   注意每台tomcat的jvmroute参数都不能一样

 Sticky 模式tomcat session  session memcached 为备 sessionRequest请求到来时, memcached加载备 session  tomcat (仅当tomcat jvmroute发生变化时,否则直接取tomcat session)Request请求结束时,将tomcat session更新至memcached,以达到主备同步之目的。下面是sticky模式时响应的流程图(图片来源网络):

Memcached_Session_Manager介绍及使用_第4张图片

 

 Non-Sticky模式tomcat session  中转session memcached1 为主 sessionmemcached 2 为备sessionRequest请求到来时,从memcached 2加载备 session  tomcat,(当 容器 中还是没有session 则从memcached1加载主 session  tomcat 这种情况是只有一个memcached节点,或者有memcached1 出错时),Request请求结束时,将tomcat session更新至 memcached1和备memcached2,并且清除tomcat session 。以达到主备同步之目的,如下是non-sticky模式的响应流程图:(图片来源网络)。

 

Memcached_Session_Manager介绍及使用_第5张图片

 

 

 

结束



memcached-session-manager配置

http://chenzhou123520.iteye.com/blog/1650212

2012-08-21 21:08

声明:本篇文章是根据memcached-session-manager官方配置方法wiki页面翻译整理,关于memcached-session-manager的介绍,具体参见官网:http://code.google.com/p/memcached-session-manager/,也可以参考:http://gong1208.iteye.com/blog/1596120

 

Introduction

如果为了简单使用,你只需要安装一个tomcat(6或者7)和memcached,在生产环境中可能会有多台tomcat服务器以及多台可用的memcached节点,并安装在不同的机器上,我们可以使用黏性session(sticky sessions)或者非黏性session(non-sticky sessions),memcached-session-manager (msm) 对这两种操作模式都支持。

下面给出一个黏性session模式的设置示例,此实例中安装了2个tomcat以及2个memcached。

Tomcat-1(t1)的首要选择是把session存储在memcached-2 (m2)上(m2是t1的一个普通节点),而m2是运行在另外的一台机器上。只有当m2不可用(宕机或无法访问)时,t1才会把session存储到memcached-1(m1,m1是t1的故障转移节点)上。使用这种配置,即使机器1宕机了session也不会丢失。具体如下图所示:

Memcached_Session_Manager介绍及使用_第6张图片

我们如何设置才能实现呢?

 

Decide which serialization strategy to use

从1.1版开始,MSM就提供了多种可选的session序列化策略,默认的策略是使用java进行序列化,这种实现已经集成在memcached-session-manager.jar包中了,其它的策略则可以通过不同的jar包来提供实现。在下面的章节中,我们可以了解到每种策略所需要的jar包具体有哪些。

 

Configure tomcat

关于tomcat的配置主要包括两个方面,首先需要下载所需要的包,放到tomcat安装目录下的lib目录下(严格来说应该是$CATALINA_HOME/lib/)以及我们应用的WEB-INF/lib/ 目录下,同时还需要修改$CATALINA_HOME/conf/context.xml文件,并在<Context>元素中添加memcached session管理的配置信息。

 

Add memcached-session-manager jars to tomcat

不管你选择哪种序列化策略,你都需要 memcached-session-manager-${version}.jar ,如果你使用的是tomcat6,则还需要下载 memcached-session-manager-tc6-${version}.jar ,如果使用的是tomcat7则下载 memcached-session-manager-tc7-${version}.jar 。同时还需要下载 spymemcached-2.7.3.jar.下载这完这些jar包后把jar包放到 $CATALINA_HOME/lib/目录

 

Add custom serializers to your webapp (optional)

如果只是使用java序列化的话,那么需要的jar包就是以上所列出的那些了,但是如果想使用自定义的序列化策略(通常性能会更佳),我们还需要下载相应的jar包并放到我们webapp下的WEB-INF/lib/目录中。

如果你的应用使用了maven来进行jar包管理,那么你只需要在pom.xml中加入相应的序列化策略依赖定义就可以了,具体的maven依赖定义如下(任选一种就oK了):

kryo-serializer:

Xml代码 复制代码  收藏代码
  1. <dependency>  
  2.     <groupId>de.javakaffee.msm</groupId>  
  3.     <artifactId>msm-kryo-serializer</artifactId>  
  4.     <version>1.6.0</version>  
  5.     <scope>runtime</scope>  
  6. </dependency>  

javolution:

Xml代码 复制代码  收藏代码
  1. <dependency>  
  2.     <groupId>de.javakaffee.msm</groupId>  
  3.     <artifactId>msm-javolution-serializer</artifactId>  
  4.     <version>1.6.0</version>  
  5.     <scope>runtime</scope>  
  6. </dependency>  

xstream:

Xml代码 复制代码  收藏代码
  1. <dependency>  
  2.     <groupId>de.javakaffee.msm</groupId>  
  3.     <artifactId>msm-xstream-serializer</artifactId>  
  4.     <version>1.6.0</version>  
  5.     <scope>runtime</scope>  
  6. </dependency>  

flexjson:

Xml代码 复制代码  收藏代码
  1. <dependency>  
  2.     <groupId>de.javakaffee.msm</groupId>  
  3.     <artifactId>msm-flexjson-serializer</artifactId>  
  4.     <version>1.6.0</version>  
  5.     <scope>runtime</scope>  
  6. </dependency>  

 

如果我们不是使用maven仓库来对依赖进行管理的话 ,我们需要针对每种策略下载单独需要的jar包,具体如下:

  • kryo-serializer: msm-kryo-serializer, kryo-serializers, kryo, minlog, reflectasm, asm-3.2
  • javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1
  • xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min
  • flexjson-serializer: msm-flexjson-serializer, flexjson

 

Configure memcached-session-manager as <Context> Manager

处理完jar包之后,我们还需要修改 $CATALINA_HOME/conf/context.xml文件中Context节点下的内容,添加memcached-session-manager配置。

下面将会讲解关于tomcat配置的具体的示例,主要包括使用memcached来管理黏性session和非黏性session以及使用membase来管理非黏性session。示例基于的前提是假设我们有2个memcached实例,一个运行在host1主机,另一个运行在host2主机,示例使用的序列化方式为kryo。

下面我们给出tomcat1的配置,假设tomcat1和memcached节点n1都是运行在host1主机上,其中属性failoverNodes="n1"的作用是告诉msm最好是把session保存在memcached "n2"节点上,只有在n2节点不可用的情况下才把session保存在n1节点。这样即使host1主机宕机,仍然可以通过host2上的tomcat2访问存放在memcached "n2" 节点中的session。

tomcat1 configuration:

Xml代码 复制代码  收藏代码
  1. <Context>  
  2.   ...  
  3.   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
  4.     memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"  
  5.     failoverNodes="n1"  
  6.     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
  7.     transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
  8.     />  
  9. </Context>  

以上就是tomcat1的配置信息,对于tomcat2,我们只需要修改一下failoverNodes属性的值为"n2" ,这样tomcat2就会优先把session存放到memcached "n1"节点,其余配置信息都一样。

 

下面演示一个非黏性session管理的配置示例,对于非黏性的session管理,我们不需要配置failoverNodes属性,因为所有sessions在tomcat集群中是循环可见的,并不会绑定到某一个单独的tomcat,对于非黏性session管理,集群中的所有tomcat都是用同一个配置,具体信息如下:

Xml代码 复制代码  收藏代码
  1. <Context>  
  2.   ...  
  3.   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
  4.     memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"  
  5.     sticky="false"  
  6.     sessionBackupAsync="false"  
  7.     lockingMode="uriPattern:/path1|/path2"  
  8.     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
  9.     transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
  10.     />  
  11. </Context>  

如果是使用membase来对session进行管理,那么则某一个节点的配置如下:

Xml代码 复制代码  收藏代码
  1. <Context>  
  2.   ...  
  3.   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
  4.     memcachedNodes="http://host1.yourdomain.com:8091/pools"  
  5.     username="bucket1"  
  6.     password="topsecret"  
  7.     memcachedProtocol="binary"  
  8.     sticky="false"  
  9.     sessionBackupAsync="false"  
  10.     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
  11.     transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
  12.     />  
  13. </Context>  

在context.xml中配置完msm之后, 我们就可以启动我们的应用程序了,这样所有的session将会根据系统配置存储到指定的memcached节点或者membase中。

 

Overview over memcached-session-manager configuration attributes

className (required)

类名:de.javakaffee.web.msm.MemcachedBackupSessionManager

 

memcachedNodes (required)

memcached节点:此属性应该包含所有运行的memcached节点或者membase bucket的uri地址,每一个memcached节点的属性定义格式为<id>:<host>:<port>,多个节点定义直接使用空格或者逗号分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",如果只有单个的memcached节点,则<id>是可选项,只需配置<host>:<port>即可,形如:memcachedNodes="localhost:11211"。

如果我们配置的是membase,那么从1.6.0版本开始,我们可以配置指定一个或者多个membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/pools。Bucket 名称和密码通过属性username,password来定义。membase buckets连接需要遵循memcached协议,传输数据通过二进制流方式。

 

failoverNodes (optional, must not be used for non-sticky sessions)

故障转移节点:可选项,对非黏性session不可用,属性必须包含memcached节点集群的所有ids。节点id之间用空格或者逗号分隔。

 

username (since 1.6.0, optional)

从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证。

 

password (since 1.6.0, optional)

从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。

 

memcachedProtocol (since 1.3, optional, default text)

定义memcached协议,默认使用text文本

 

sticky (since 1.4.0, optional, default true)

定义session方式为黏性或非黏性,默认为true

 

lockingMode (since 1.4.0, optional, for non-sticky sessions only, default none)

只有非黏性session才使用,默认值为none

  • none: 从不对session进行锁定
  • all: session将一直被锁定,直到请求结束
  • auto: 对于只读请求,session将不会被锁定,如果是非只读请求,则session会被锁定
  • uriPattern:<regexp>: 通过正则表达式的方式来对请求uri以及查询字符串进行匹配,只有匹配上的才会被锁定。

requestUriIgnorePattern (optional)

 

sessionBackupAsync (optional, default true)

 

backupThreadCount (since 1.3, optional, default number-of-cpu-cores)

 

sessionBackupTimeout (optional, default 100)

 

operationTimeout (since 1.6.0, optional, default 1000)

 

sessionAttributeFilter (since 1.5.0, optional)

 

transcoderFactoryClass (since 1.1, optional, default de.javakaffee.web.msm.JavaSerializationTranscoderFactory)

序列化接口实现:

  • Java serialization: de.javakaffee.web.msm.JavaSerializationTranscoderFactory
  • Kryo based serialization: de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory
  • Javolution based serialization: de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory
  • XStream based serialization: de.javakaffee.web.msm.serializer.xstream.XStreamTranscoderFactory

 

copyCollectionsForSerialization (since 1.1, optional, default false)

 

customConverter (since 1.2, optional)

 

enableStatistics (since 1.2, optional, default true)

 

enabled (since 1.4.0, optional, default true)







你可能感兴趣的:(Memcached_Session_Manager介绍及使用)