memcached-session-manager配置

系统 1448 0

声明:本篇文章是根据 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 with sticky sessions

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

 

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:

      <dependency>
    <groupId>de.javakaffee.msm</groupId>
    <artifactId>msm-kryo-serializer</artifactId>
    <version>1.6.0</version>
    <scope>runtime</scope>
</dependency>
    

javolution:

      <dependency>
    <groupId>de.javakaffee.msm</groupId>
    <artifactId>msm-javolution-serializer</artifactId>
    <version>1.6.0</version>
    <scope>runtime</scope>
</dependency>
    

xstream:

      <dependency>
    <groupId>de.javakaffee.msm</groupId>
    <artifactId>msm-xstream-serializer</artifactId>
    <version>1.6.0</version>
    <scope>runtime</scope>
</dependency>
    

flexjson:

      <dependency>
    <groupId>de.javakaffee.msm</groupId>
    <artifactId>msm-flexjson-serializer</artifactId>
    <version>1.6.0</version>
    <scope>runtime</scope>
</dependency>
    

 

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

 

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:

      <Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
    failoverNodes="n1"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>
    

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

 

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

      <Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="uriPattern:/path1|/path2"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>
    

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

      <Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="http://host1.yourdomain.com:8091/pools"
    username="bucket1"
    password="topsecret"
    memcachedProtocol="binary"
    sticky="false"
    sessionBackupAsync="false"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</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配置


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论