您的位置:首页 > 数据库 > Memcache

Memcached-Session-Manager多tomcat实现session跨域共享配置

2017-10-17 09:31 656 查看

Memcached-Session-Manager多tomcat实现session跨域共享配置

所需jar包(包含五种序列化配置):http://download.csdn.net/detail/sanshipianyezi/9681078

· 当高并发出现的时候,我们通常想到的是使用nginx配置负载均衡来实现对多个服务器(tomcat部署应用)的iphash来处理,这样的场景下 同一个应用服务部署在多个tomcat集群下,高并发访问的时候通过nginx分发实现负载均衡在实际应用中非常好的解决当个应用难于超负荷承载高并发访问的缺陷,但是多tomcat服务器之间只有实现session跨域共享才能实现用户无论跳转到哪个tomcat应用,session都不会丢失失效,所以我们采用memcached缓存服务器来存储tomcat容器产生的session信息,当访问另一个服务容器的时候,会自动从memcached看是否已存在session并实现跨域共享。

· 一、实现原理 
通过配置MemcachedSessionManager管理插件,来实现接替tomcat本身对于session的管理机制,从而实现共享session。 
我们先看下msm的流程 

MSM(memcached-session-manager)支持tomcat6和tomcat7及tomcat8,利用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为主sessionmemcached 2为备session。Request请求到来时,从memcached 2加载备session到tomcat,(当 容器 中还是没有session 则从memcached1加载主session到tomcat,这种情况是只有一个memcached节点,或者有memcached1出错时),Request请求结束时,将tomcat
session更新至主memcached1和备memcached2,并且清除tomcat session,以达到主备同步之目的。 

memcached使用LRU算法来处理缓存。但是毛病在于它不是全局的,而是基于slab。
这样你会发现在运行一段时间后,最早访问的那些用户的SESSION会莫名其妙的丢失,即使他们上一秒还有过操作。 
请看memcached的内存分配算法 
http://wenku.baidu.com/view/90a6b19851e79b89680226d4.html 
要解决基于 memcache 方案的数据丢失问题,可能解决的方案是: 
1、使用memcachedb

2、引入持久化存储介质ZooKeeper

二、配置方法

· 所需jar包(包含五种序列化配置):http://download.csdn.net/detail/sanshipianyezi/9681078

· 序列化方式对应的jar包,注意jar包版本: 
-java 
 
context.xml配置:

<!--配置java序列化方式 只要在Tomcat的配置文件conf.xml的Context节点下加入以下Manager节点配置即可 -->

    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

        memcachedNodes="n1:127.0.0.1:11211"     

        lockingMode="auto"

        sticky="false" 

        requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"
   

        sessionBackupAsync= "false"   

        sessionBackupTimeout= "100"      

        transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory"    

        />

-javolution 
 
context.xml

    <!--配置javolution序列化方式 只要在Tomcat的配置文件conf.xml的Context节点下加入以下Manager节点配置即可 -->

    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

       memcachedNodes="n1:127.0.0.1:11211"   

        lockingMode="auto"

        sticky="false" 

        requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"
   

        sessionBackupAsync= "false"   

        sessionBackupTimeout= "100"  

        copyCollectionsForSerialization="false"   

        transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"    

        />

-kryo

 
context.xml

<!--配置kryo序列化方式 只要在Tomcat的配置文件conf.xml的Context节点下加入以下Manager节点配置即可 -->

    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

            memcachedNodes="n1:127.0.0.1:11211"   

            lockingMode="auto"

            sticky="false" 

            requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"
   

            sessionBackupAsync= "false"   

            sessionBackupTimeout= "100"    

            copyCollectionsForSerialization="false"   

            transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"    

        />

-flexjson 

context.xml

<!--配置json序列化方式 只要在Tomcat的配置文件conf.xml的Context节点下加入以下Manager节点配置即可 -->

    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

        memcachedNodes="n1:127.0.0.1:11211"     

        lockingMode="auto"

        sticky="false" 

        requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"
   

        sessionBackupAsync= "false"   

        sessionBackupTimeout= "100"

        copyCollectionsForSerialization="false"

        transcoderFactoryClass="de.javakaffee.web.msm.serializer.json.JSONTranscoderFactory"    

        />

-xstream 

<!--配置xStream序列化方式 只要在Tomcat的配置文件conf.xml的Context节点下加入以下Manager节点配置即可 -->

    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

            memcachedNodes="n1:127.0.0.1:11211"   

            lockingMode="auto"

            sticky="false" 

            requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"
   

            sessionBackupAsync= "false"   

            sessionBackupTimeout= "100"    

            copyCollectionsForSerialization="false"   

            transcoderFactoryClass="de.javakaffee.web.msm.serializer.xstream.XStreamTranscoderFactory"    

        />

· 无论选择哪一种序列化方式,都可以,目的是将容器产生的session序列化后存放在memcached缓存当中,存储的形式就是通过key-value,以sessionId为key 存储session对象,所以在我们使用msm共享session的时候,若项目也使用同一个memcached缓存服务器,则注意避免使用sessionId作为key,可以添加项目标示最为域区分。

通常选择前三类比较多,一般来说koyo序列化最有效,选择一中序列化对应的全部jar包放在tomcat的conf目录下的context.xml的Context节点下即可。

说明:

1、 session存储到memchached实现方案时。他主要功能是修改tomcat的session存储机制,使之能够把session序列化存放到memcached中。 
2、Manager标签属性说明: 
className 
此属性是必须的。 
memcachedNodes 
此属性是必须的。这个属性必须包含你所有运行的memcached节点。每个节点的定义格式为::。 
多个之间用空格或半角逗号隔开(如:memcachedNodes=”n1:localhost:11211,n2:localhost:11212”)。 
如果你设置单个memcache节点是可选的,所以它允许设置为:(memcachedNodes=”localhost:11211”)。 
failoverNodes 
可选项,属性只能用在非粘连Session机制中。 
此属性必须包含memcached节点的Id,此节点是Tomcat作为备份使用。多个之间用空格或逗号隔开 
memcachedProtocol 
可选项,默认为text。出属性指明memcached使用的存储协议。只支持text或者binary。 
sticky 可选项,默认为true。 
指定使用粘性的还是非粘性的Session机制。 
lockingMode 可选项, 此属性只对非粘性Session有用,默认为none。 
指定非粘性Session的锁定策略。他的只有 
(1)、none:从来不加锁 
(2)、all: 当请求时对Session锁定,直到请求结束 
(3)、auto:对只读的request不加锁,对非只读的request加锁 
(4)、uriPattern:: 使用正则表达式来比较requestRUI + “?” + queryString来决定是否加锁, 
requestUriIgnorePattern 可选项 
此属性是那些不能改备份Session的请求的正则表达式。如果像css,JavaScript,图片等静态文件被同一个Tomcat和同一个应用上下文来提供,这些 
请求也会通过memcached-session-manager。但是这些请求在一个http会话中几乎没什么改变,所以他们没必要触发Session备份。所以那些静态文件 
没必要触发Session备份,你就可以使用此属性定义。此属性必须符合Java regex正则规范。 
sessionBackupAsync 可选项,默认true 
指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout 
设置的过期时间起作用。 
backupThreadCount 可选项,默认为CPU内核数。 
用来异步保存Session的线程数(如果sessionBackupAsync=”true”)。 
sessionBackupTimeout 可选项,默认100,单位毫秒 
设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync=”false”是起作用。默认100毫秒 
sessionAttributeFilter 可选项 从1.5.0版本有 
此属性是用来控制Session中的那个属性值保存到Memcached中的正则表达式。郑则表达式被用来匹配Session中属性名称。如 
sessionAttributeFilter=”^(userName|sessionHistory)$” 指定了只有”userName”和”sessionHistory”属性保存到Memcached中。 
依赖于选择的序列化策略。 
transcoderFactoryClass 可选,默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory 
此属性值是创建序列化和反序列化保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了de.javakaffee.web.msm.TranscoderFactory 
和提供一个无参的构造方法。例如其他的有效的实现在其他packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm-javolution-serializer. 
copyCollectionsForSerialization 可选项,默认false。 
customConverter 可选项

    enableStatistics 可选项,默认true

           用来指定是否进行统计。

    enabled 可选项,默认true

            指定Session保存到Memcached中是否可用和是否可以通过JMX进行改变。只用于粘性Session。

参考: 
基于MSM实现nginx负载均衡+tomcat集群+memcached(session共享): 
http://blog.csdn.net/u013322876/article/details/50618509

memcached-session-manager: 
http://blog.csdn.net/jinsong1213/article/details/44831475

nginx+tomcat+memcached (msm)实现 session同步复制: 
http://blog.csdn.net/shayanxiang/article/details/45665693

tomcat msm部署: 
http://blog.csdn.net/wh0426/article/details/44699449

Memcached-session-manager原理: 
http://blog.csdn.net/yczz/article/details/46797589

nginx+tomcat+memcached构建session共享集群: 
http://www.itnose.net/detail/6524220.html

本篇讲述tomcat msm,实现由memcached集中式管理会话模式。 
实验环境 
http://blog.csdn.net/wh0426/article/details/44699449

关于 tomcat 集群中 session 共享的三种方法: 
http://www.cnblogs.com/interdrp/p/4056525.html

所需jar包(包含五种序列化配置):http://download.csdn.net/detail/sanshipianyezi/9681078

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: