使用Memcached Session Manager扩展Session管理

简介: 在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中。然后再从request获取session的时候,如果存在sessionId那么就根据Id从session池中获取session, 如果sessionId不存在或者session失效,那么则新建session并且将session信息放入session池,供下次使用。

Tomcat的session管理

在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中。

然后再从request获取session的时候,如果存在sessionId那么就根据Id从session池中获取session,

如果sessionId不存在或者session失效,那么则新建session并且将session信息放入session池,供下次使用。

session replication和session sticky

session是存在服务器端的,多台服务器集群时,
session replication 策略是复制会话,即一个用户访问了一次就把session复制到所有的服务器或这一部分服务器。
session sticky策略则是不复制,一个用户访问了一次后,同一个session周期内,所有的请求都定向到这个服务器。


使用Memcached Session Manager管理session

所有的tomcat节点需要安装memcached-session-manager,每一个tomcat会有自己的本地session,当一个请求执行完毕之后,如果对应的session之前不存在(也就是说这是某个用户的第一次请求),则将该session拷贝一份副本至memcached缓存,当该session的下一个请求到达时,会使用tomcat的本地session,请求处理结束之后,session的变化会同步更新到memcached缓存中对应的session里,从而确保本地session和缓存中的session始终保持一致。如果当前结点失效,下一个请求会被路由给另外一个tomcat处理,这个tomcat发现请求所属的session并不存在,于是它将查询memcached缓存,并将查询到的session恢复到本地,这样就完成了容错处理。(以上是sticky session模式为背景的解释,memcached-session-manager也支持non-sticky session。)
由于以缓存为基础的session管理不需要大量的数据复制,其性能表现更好,具有更好的伸缩性。

memcached-session-manager配置

这是官方的文档,https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration
下面的内容转自memcached-session-manager配置

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目录下(严格来说应该是CATALINAHOME/lib/WEBINF/lib/CATALINAHOME/lib/)以及我们应用的WEB−INF/lib/目录下,同时还需要修改CATALINA_HOME/conf/context.xml文件,并在<Context>元素中添加memcached session管理的配置信息。

Add memcached-session-manager jars to tomcat

不管你选择哪种序列化策略,你都需要 memcached-session-manager-version.jar使tomcat6memcachedsessionmanagertc6version.jar,如果你使用的是tomcat6,则还需要下载memcached−session−manager−tc6−{version}.jar ,如果使用的是tomcat7则下载 memcached-session-manager-tc7-version.jarspymemcached2.7.3.jar.jarjarversion.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:

1
2
3
4
5
6
< dependency >
< groupId >de.javakaffee.msm</ groupId >
< artifactId >msm-kryo-serializer</ artifactId >
< version >1.6.0</ version >
< scope >runtime</ scope >
</ dependency >

javolution:

1
2
3
4
5
6
< dependency >
< groupId >de.javakaffee.msm</ groupId >
< artifactId >msm-javolution-serializer</ artifactId >
< version >1.6.0</ version >
< scope >runtime</ scope >
</ dependency >

xstream:

1
2
3
4
5
6
< dependency >
< groupId >de.javakaffee.msm</ groupId >
< artifactId >msm-xstream-serializer</ artifactId >
< version >1.6.0</ version >
< scope >runtime</ scope >
</ dependency >

flexjson:

1
2
3
4
5
6
< dependency >
< groupId >de.javakaffee.msm</ groupId >
< artifactId >msm-flexjson-serializer</ artifactId >
< version >1.6.0</ version >
< scope >runtime</ scope >
</ 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:

1
2
3
4
5
6
7
8
9
< 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都是用同一个配置,具体信息如下:

1
2
3
4
5
6
7
8
9
10
11
< 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进行管理,那么则某一个节点的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
< Context >
...
< Manager  className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
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中。

 


目录
相关文章
|
存储 负载均衡 NoSQL
PHP设置Redis储存Session,自定义session驱动
PHP也可以配置将session保存在redis或者memcache中,在几种用来存储会话数据的方式。显然是Redis在效率上要更快些,而与memcached相比,因为有持久化,也更安全一些。 所以也是常用的负载均衡环境处理session的策略。 但因为是将信息储存在内存中,可能会出现内存不足、利用率不高等问题。 优点:效率高 缺点:信息储存在内存中,会产生大小不一的内存块,内存无法完全利用,并且可能出现内存不足。
114 0
PHP设置Redis储存Session,自定义session驱动
|
NoSQL JavaScript 关系型数据库
pm2 管理nodejs集群,同时使用redis共享session
通过pm2来实现nodejs应用的集群,不过我之前没做session共享,导致.. 登录不上啊 啊啊啊,无奈,又重新对redis进行了集成。
pm2 管理nodejs集群,同时使用redis共享session
|
Web App开发 NoSQL Java
Session分布式共享 = Session + Redis + Nginx
一、Session 1、Session 介绍       我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下。       Session:在计算机中,尤其是在网络应用中,称为“会话控制”。
1065 0
|
关系型数据库 Oracle
|
.NET 开发框架 数据安全/隐私保护