使用Memcached Session Manager扩展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/)以及我们应用的WEB−INF/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,如果你使用的是tomcat6,则还需要下载memcached−session−manager−tc6−version.jar,如果你使用的是tomcat6,则还需要下载memcached−session−manager−tc6−{version}.jar ,如果使用的是tomcat7则下载 memcached-session-manager-tc7-version.jar。同时还需要下载spymemcached−2.7.3.jar.下载这完这些jar包后把jar包放到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:


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"

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中。

 

时间: 2024-11-08 19:06:52

使用Memcached Session Manager扩展Session管理的相关文章

Ubuntu gedit Failed to connect to the session manager

(gedit:6556): EggSMClient-WARNING **: Failed to connect to the session manager: None of the authentication protocols specified are supported ** GLib-GIO:ERROR:/build/buildd/glib2.0-2.26.0/gio/gdbusconnection.c:2270:initable_init: assertion failed: (c

教你使用TSAM扩展来管理J2EE应用程序

Tivoli Service Automation Manager 7.2.2 引入了扩展 的概念,该扩展是一组 TSAM 软件组件,可以向 TSAM 平台添 加更多功能.一个扩展通常(但不限于)可以实现以下功能: 可以实现一个新的 IT 服务自动化解决方案,该解决方案在 TSAM 中称为服务定义:例如,一个存储即服务解决方案可 以为一所大学的学生提供主目录. 可以向现有服务定义添加功能:例如,将开箱即用 TSAM 扩展为一个服务解决方案,使它能够将除启动磁盘以外的更多 磁盘连接到虚拟机中. 这

nginx中session ticket重用Session提高https性能分析

原创文章:来自nginx中session ticket重用Session提高https性能分析 https会话建立初次使用session ticket的SSL握手流程如下: Client Server ClientHello (empty SessionTicket extension)--------> ServerHello (empty SessionTicket extension) Certificate* ServerKeyExchange* CertificateRequest*

php使用memcache存储session时,session的生命周期

问题描述 php使用memcache存储session时,session的生命周期 默认 session.save_handle=files session.gc_probability = 1 session.gc_divisor = 100 session.gc_maxlifetime = 1440 此时,session的生命周期为1440,超过这个时间session有1/100的几率被回收. 如果使用memcache存储session,memcache中的session的生命周期也是144

PHP session并发及session读写锁分析

PHP这门程序设计语言简单得令人发指,那是因为PHP的作者们太神通.今天我来谈谈所有的phper都熟悉的session(会话). 需要说明的是: 1.示例代码中分别以files,redis储存会话数据 2./session/setUserFile和/session/setUserRedis设置user_name,user_id两个key,并sleep了3s 3./session/setLoginFile和/session/setLoginRedis设置last_time一个key 4./sess

理解PHP中的Session及对Session有效期的控制_php技巧

0.什么是session?       Session的中文译名叫做"会话",其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session.目前社会上对session的理解非常混乱:有时候我们可以看到这样的话"在一个浏览器会话期间,...",这里的会话是指从一个浏览器窗口打开到关闭这个期间:也可以看到"用户(客户端)在一次会话期间"这样一句话,它可能指用户的一系列动作(一般情况下是

ActiveMQ session.close与session.commit的区别

如果session是以非事务的方式创建必须session.close()就可以将消息提交到服务器队列 session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); // 创建Session session.close(); 如果session是以开启事务的方式创建必须session.commit()才能提交消息到服务器队列,session.close()服务器将收不到消息 session=connection

Tomcat的SessionID引起的Session Fixation和Session Hijacking问题

  上一篇说到<Spring MVC防御CSRF.XSS和SQL注入攻击>,今天说说SessionID带来的漏洞攻击问题.首先,什么是Session Fixation攻击和Session Hijacking攻击问题? 说来话长,非常具体的解释查看我这个pdf文件:<Session Fixation Vulnerability in Web-based Applications>.为什么会注意到这个问题?其实原来也知道session劫持的问题,但没有注意,这几天用IBM Ration

asp.net(C#)清除全部Session与单个Session的方法_C#教程

实例如下: Session.Abandon();//清除全部Session //清除某个Session Session["UserName"] = null; Session.Remove("UserName"); 以上这篇asp.net(C#)清除全部Session与单个Session的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持. 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用