将tomcat的session信息保存在memcached中

一、简介

MSM(memcached-session-manager)支持tomcat6和tomcat7 ,利用Value(Tomcat 阀对Request进行跟踪。Request请求到来时,从memcached加载session,Request请求结束时,将tomcat session更新至memcached,以达到session共享之目的,支持sticky和 non-sticky 模式。

Sticky 模式:tomcat session为主session, memcached为备session。Request请求到来时, 从memcached加载备session到tomcat (仅当tomcat jvmroute发生变化时,否则直接取tomcat session);Request请求结束时,将tomcat session更新至memcached,以达到主备同步之目的。

Non-Sticky模式:tomcat session为中转session, memcached1为主session,memcached 2为备session。Request请求到来时,从memcached2加载备session到tomcat,当容器中还是没有session 则从memcached1加载主session到tomcat,这种情况是只有一个memcached节点,或者有memcached1出错时,Request请求结束时,将tomcat session更新至主memcached1和备memcached2,并且清除tomcat session 。以达到主备同步之目的。

二、实现方案

1.ip规划

192.168.1.201 apache

192.168.1.202 192.168.1.203 tomcat

192.168.1.204 memcached

2.memcached的安装

关于memcached的安装,本处将不再累赘,详细安装步骤请参照本人的相关博文http://wangfeng7399.blog.51cto.com/3518031/1403792

3.apache+tomcat的实现

关于tomcat+apache的实现,本处不在累赘,详细实现步骤请参照本人的相关博文http://wangfeng7399.blog.51cto.com/3518031/1409341

测试结果

   4.将session存储到memcached中

配置第一台tomcat

[[email protected] local]# vi tomcat/conf/context.xml
<Context>
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:192.168.1.204:11211"
    failoverNodes="n1"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

配置第二台tomcat

[[email protected] local]# vi tomcat/conf/context.xml
<Context>
 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:192.168.1.204:11211"
    failoverNodes="n1"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

下载专用的jar包,并将这些jar包放置在$CATALINA_HOME/lib/

[[email protected] lib]# wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/1.8.1/memcached-session-manager-1.8.1.jar
[[email protected] lib]# wget http://repo1.maven.org/maven2/net/spy/spymemcached/2.10.2/spymemcached-2.10.2.jar
[[email protected] lib]# wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/1.8.1/memcached-session-manager-tc7-1.8.1.jar

三、memcached支持的序列化参数

   1.javolution序列化tomcat配置
   conf/context.xml添加
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311"  
   lockingMode="auto"
   sticky="false"
   requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"    
   sessionBackupAsync= "false"  
   sessionBackupTimeout= "100"  
   copyCollectionsForSerialization="true"  
   transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"    
       />
   lib增加jar包
   msm-javolution-serializer-cglib-1.3.0.jar
   msm-javolution-serializer-jodatime-1.3.0.jar
   spymemcached-2.10.3.jar
   javolution-5.4.3.1.jar
   msm-javolution-serializer-1.7.0.jar
   memcached-session-manager-1.7.0.jar
   memcached-session-manager-tc7-1.7.0.jar

2、xstream序列化tomcat配置
   conf/context.xml添加
   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311"  
   lockingMode="auto"
   sticky="false"
   requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"    
   sessionBackupAsync= "false"  
   sessionBackupTimeout= "100"
   transcoderFactoryClass="de.javakaffee.web.msm.serializer.xstream.XStreamTranscoderFactory"    
       />
   lib增加jar包
   xmlpull-1.1.3.1.jar
   xpp3_min-1.1.4c.jar
   xstream-1.4.6.jar
   msm-xstream-serializer-1.7.0.jar
   spymemcached-2.10.3.jar
   memcached-session-manager-1.7.0.jar
   memcached-session-manager-tc7-1.7.0.jar

3、flexjson序列化tomcat配置
   conf/context.xml添加
   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311"    
   lockingMode="auto"
   sticky="false"
   requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"    
   sessionBackupAsync= "false"  
   sessionBackupTimeout= "100"      
   transcoderFactoryClass="de.javakaffee.web.msm.serializer.json.JSONTranscoderFactory"    
       />
   lib增加jar包
   flexjson-3.1.jar
   msm-flexjson-serializer-1.7.0.jar
   spymemcached-2.10.3.jar
   memcached-session-manager-1.7.0.jar
   memcached-session-manager-tc7-1.7.0.jar

4、kryo序列化tomcat配置
   conf/context.xml添加
   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
      memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311"  
   lockingMode="auto"
   sticky="false"
   requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"    
   sessionBackupAsync= "false"  
   sessionBackupTimeout= "100"    
   copyCollectionsForSerialization="true"  
   transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"    
       />
   lib增加jar包
   kryo-1.04.jar
   minlog-1.2.jar
   asm-3.2.jar
   reflectasm-1.01.jar
   kryo-serializers-0.11.jar
   msm-kryo-serializer-1.7.0.jar
   spymemcached-2.10.3.jar
   memcached-session-manager-1.7.0.jar
   memcached-session-manager-tc7-1.7.0.jar

各种情况配置如上,据说kryo序列化效率比较快,未做测试。
   选其一中方式,部署2个tomcat端口分别是8080和8181
   启动后,访问刷新SessionID是否一致。
http://127.0.0.1:8080/t.jsp
   SessionID:37B7F153AB3567295B2FBF1831475F5F-n1
   SessionIP:127.0.0.1
   SessionPort:8080

http://127.0.0.1:8181/t.jsp
   SessionID:37B7F153AB3567295B2FBF1831475F5F-n1
   SessionIP:127.0.0.1
   SessionPort:8181  
   测试结果SessionID一致。

session存储到memchached实现方案时。他主要功能是修改tomcat的session存储机制,使之能够把session序列化存放到memcached中。
Manager标签属性说明
1.className  必须
类名:de.javakaffee.web.msm.MemcachedBackupSessionManager

2.memcachedNodes  必须
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协议,传输数据通过二进制流方式。

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

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

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

6.memcachedProtocol    可选项
定义memcached协议,默认使用text文本,出属性指明memcached使用的存储协议。只支持text或者binary。

7.sticky    可选项
定义session方式为黏性或非黏性,默认为true,多个tomcat时需使用非黏性

8.lockingMode    可选项
只有非黏性session才使用,默认值为none
none: 从不对session进行锁定
all: session将一直被锁定,知道请求结束
auto: 对于只读请求,session将不会被锁定,如果是非只读请求,则session会被锁定
uriPattern:<regexp>: 通过正则表达式的方式来对请求uri以及查询字符串进行匹配,只有匹配上的才会被锁定。
9.requestUriIgnorePattern   可选项

此属性是那些不能改备份Session的请求的正则表达式。如果像css,javascript,图片等静态文件被同一个Tomcat和同一个应用上下文来提供,这些请求也会通过memcached-session-manager。但是这些请求在一个http会话中几乎没什么改变,所以他们没必要触发Session备份。所以那些静态文件没必要触发Session备份,你就可以使用此属性定义。此属性必须符合java regex正则规范。
   如:".*\.(png|gif|jpg|css|js)$"

10.sessionBackupAsync   可选项
指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout设置的过期时间起作用。

11.backupThreadCount    可选项
用来异步保存Session的线程数,(如果sessionBackupAsync="true")。默认值为cup的内核数。

12.sessionBackupTimeout    可选项
设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync="false"是起作用。默认100毫秒

13.operationTimeout    可选项
从1.6.0版开始使用, 默认值为1000

14.sessionAttributeFilter    可选项
此属性是用来控制Session中的那个属性值保存到Memcached中的正则表达式。郑则表达式被用来匹配Session中属性名称。如sessionAttributeFilter="^(userName|sessionHistory)$" 指定了只有"userName"和"sessionHistory"属性保存到Memcached中。依赖于选择的序列化策略。

15.transcoderFactoryClass    可选项
此属性值是创建序列化和反序列化保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。例如其他的有效的实现在其他packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm-javolution-serializer.
默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory

16.copyCollectionsForSerialization    可选项
默认值为false。

17.customConverter    可选项
自己定义特殊的类注册到kryo自定义转换器中,实现序列化
18.enableStatistics    可选项
用来指定是否进行统计。 默认值为true。

19.enabled   可选项
指定Session保存到Memcached中是否可用和是否可以通过JMX进行改变。只用于粘性Session。 默认值为true。

将tomcat的session信息保存在memcached中

时间: 2024-10-17 05:27:32

将tomcat的session信息保存在memcached中的相关文章

(apache+tomcat集群+memcached番外篇)单台tomcat的session信息的2种持久化方式

为什么要实现搭建tomcat集群环境呢?主要因为单个tomcat无论从吞吐量和并发数上,会达到一定的极限.如果访问量超过单个tomcat的承受能力的话,tomcat一般要么拒绝提供服务,要么直接宕掉.所以,必须要依靠tomcat集群技术.举个最简单的例子,拿"送快件"比喻,如果一个人,5分钟送一件,一小时之内,送10个,一个人完全能胜任这项工作.假设现在到了双十一,要求1小时,送100个, 那怎么办?只能安排更多的人加入"送快件"这项工作中来.这其实和集群一个道理.

Memcached的安装配置及将PHP的session保存在Memcached中

Memcached是一款开源.高性能.分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序.它是一个基于内存的"键值对"存储,用于存储数据库调用.API调用或页面引用结果的直接数据,如字符串.对象等. Memcached现已成为mixi.hatena.Facebook.Vox.LiveJournal等众多服务中提高Web应用扩展性的重要因素. Memcached有以特点 1. 简单key/value存储:服务器不关心数据本身

将OB86的故障信息保存在DB86中去

出现DP站故障的时候,CPU会自动调用OB86 ,OB86 的20B 局部变量里面有丰富的故障信息,生成数据块DB86 在DB86 中生成5个双字元素的数组ARAY 在OB86中调用 "BLKMOV"将20B 的局部变量 保存在数组ARAY 中 录制成视频 最后的8个字节 指明了 故障 发生的时间 2020年2月18日 16点 42 分 45 秒 811 毫秒 星期二 星期 是 DB_VAR[20] 低字节 3减1 等于2 星期二 时间的表示 是 BCD码 百度晚盘 以及程序 视频 原

Memcached做Tomcat的session共享

基于cache DB缓存的session共享 基于memcache/redis缓存的session共享.即使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cache DB中,当应用服务器发生故障时,调度器会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存时,则去cacheDB中查找,如果找到则复制到本机,这样实现session共享和高可用. Tomcat集群session同步方式:1)使用tomcat自带的cluster方式,多个to

Nginx+tomcat实现session共享

防伪码:人生没有对错,成功永远属于奋斗者 一.如何保持session会话 目前,为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无论用户的请求被转发到哪个服务器上都能保证用户的正常使用,即需要实现session的共享机制. 在集群系统下实现session统一的有如下几种方案: 1.请求精确定位:sessionsticky,例如基于访问ip的hash策略,

Session如何保存在sql数据库中

aspnet中,session默认以inproc模式存储,也就是保存在iis进程中,这样有个优点就是效率高,但不利于为本负载均衡扩展.可以把session信息保存在SQL Server中,据说,该种方式比起inproc性能损失为10%-20%.如何实现呢,主要分两步介绍: 1.初始化SQL Server中的状态数据库 ASP.NET SQL Server 提供注册工具Aspnet_regsql.exe,用于创建供 ASP.NET 中的 SQL Server 提供程序使用的 Microsoft S

与子域名共用session信息

参考自 http://www.jb51.net/article/19664.htm 下面的步骤只使用于两个域名在同一个服务起得情况下,如果不在一个服务器上,就需要考虑通过数据库来存储session信息,达到同步的目的. session的运行原理 在客户端(如浏览器)登录网站时,被访问的 PHP 页面可以使用 session_start() 打开 SESSION,这样就会产生客户端的唯一标识 SESSION ID(此 ID 可通过函数 session_id() 获取/设置).SESSION ID

Python获取个人网站的所有课程下载链接和密码,并保存到Mongodb中

1.获取网站课程的分类地址: ''' 爬取屌丝首页,获取每个分类名称和链接 ''' import requests from lxml import etree headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36', } def get_class_data(): list_dat

tomcat实现session集群及tomcat+memcached共享session存储(四)

接博客nginx或httpd实现负载均衡tomcat(三) tomcat实现会话管理原理及实现: tomcat管理会话使用的专用的会话管理组件,tomcat的会话管理器有4种: 1.标准会话管理器(StanderdManager) 2.持久会话管理器(PersistentManager可以基于文件存储(FileStore)或JDBC存储(JDBCStore)) 基于JDBC的话就可以实现高可用tomcat的session集群. 1.DeltaManager会话管理器 2.BackupManage