• 使用Memcached Session Manager扩展Session管理


    1.Tomcat的session管理

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

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

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

    2.session replication和session sticky

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

    3.使用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管理不需要大量的数据复制,其性能表现更好,具有更好的伸缩性。

    4.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目录下(严格来说应该是$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包,具体如下:
    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:

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

  • 相关阅读:
    消费券
    .net Core 用户登入身份验证简单的demo
    微信阅读. 电脑版. 标记上一页阅读到的位置. 油猴(Tampermonkey)插件
    Docker.控制台程序.发布
    Docker.容器管理
    Docker.镜像管理
    RestSharp 加号变空格 + HTTP 请求
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
    数据库.Sqlserver.重建索引
    数据库.索引Vs树
  • 原文地址:https://www.cnblogs.com/binyue/p/5106045.html
Copyright © 2020-2023  润新知