zoukankan      html  css  js  c++  java
  • Nginx+ 多个Memcached+ 多个Tomcat集群配置来实现 sticky Session

    假如有 大于2 台的Tomcat servers,如何实现sticky session特点的高可靠web 服务?

    方案设计:

                   前端使用nginx(最好是淘宝的 tengine)作为we 流量分发器,向后端的两台tomcat分发web 流量。同时为了实现sticky session功能和高可靠的web 服务,

                    则需要在每台tomcat运行的物理服务器上同时安装一个memcache软件服务器来保存session。 这样,就总共需要安装两个memcache, 每台tomcat server在配置时

                   候,均做如下的设置。注意failoverNodes这里指向运行在另外一个节点上的memcache地址,这样万一一台上的tomcat+memcache down了,系统照样可以用,http 

                     session可以继续进行。

                 下面给出一个黏性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

                            其中tomcat1 会向Memcache2写入session,而tomcat2会向Memcache1写入session,除非被写入的那个memcache不能提供服务了。

     而前端的Nginx则把http 流量分发到M1和M2上就可以了。 

                

                    tomcat session的配置大致如下:

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

                     memcachedNodes="m1:host1.yourdomain.com:11211,m2:host2.yourdomain.com:11211" 

      sticky="true" 

                    failoverNodes="m1"  (for t1 Tomcat1) 

                     failoverNodes="m2"  (for t2 Tomcat2)       

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

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

                      />
                  </Context>

                    session 的序列化方案官方推荐的有 4 种:

                             1. Java serialization 

                             2. msm-kryo-serializer

                             3. msm-javolution-serializer

                             4. msm-xstream-serializer  

                     non-sticky sessions),memcached-session-manager (msm) 对这两种操作模式都支持。

    下面演示一个非黏性session管理的配置示例,对于非黏性的session管理,我们不需要配置failoverNodes属性,因为所有sessions在tomcat集群中是循环可见的,并不会绑定到某一个单独的tomcat,Context>  

    •   ...  
    •   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
    •     memcachedNodes="m1:host1.yourdomain.com:11211,m2:host2.yourdomain.com:11211"  
    •     sessionBackupAsync="false"  
    •     lockingMode="uriPattern:/path1|/path2"  
    •     requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"  
    •     transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
    •     />  
    • </Context>  

         

    下面是memcache的一些选项的参数:

         

    Overview over memcached-session-manager configuration attributes

    className (required)

    类名:de.javakaffee.web.msm.MemcachedBackupSessionManager

     memcachedNodes (required)

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

     failoverNodes (optional, must not be used for non-sticky sessions)

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

    username (since 1.6.0, optional)

    从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证。

    password (since 1.6.0, optional)

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

    memcachedProtocol (since 1.3, optional, default text)

    定义memcached协议,默认使用text文本

     (since 1.4.0, optional, default true)

    定义session方式为黏性或非黏性,默认为true

    lockingMode (since 1.4.0, optional, for non-none)

    只有非黏性session才使用,默认值为none

    • none: 从不对session进行锁定
    • all: session将一直被锁定,知道请求结束
    • auto: 对于只读请求,session将不会被锁定,如果是非只读请求,则session会被锁定
    • uriPattern:<regexp>: 通过正则表达式的方式来对请求uri以及查询字符串进行匹配,只有匹配上的才会被锁定。

    requestUriIgnorePattern (optional)

    sessionBackupAsync (optional, default true)

    backupThreadCount (since 1.3, optional, default number-of-cpu-cores)

    sessionBackupTimeout (optional, default 100)

    operationTimeout (since 1.6.0, optional, default 1000)

    sessionAttributeFilter (since 1.5.0, optional)

    transcoderFactoryClass (since 1.1, optional, default de.javakaffee.web.msm.JavaSerializationTranscoderFactory)

    序列化接口实现:

    • Java serialization: de.javakaffee.web.msm.JavaSerializationTranscoderFactory
    • Kryo based serialization: de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory
    • Javolution based serialization: de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory
    • XStream based serialization: de.javakaffee.web.msm.serializer.xstream.XStreamTranscoderFactory

    copyCollectionsForSerialization (since 1.1, optional, default false)

    customConverter (since 1.2, optional)

    enableStatistics (since 1.2, optional, default true)

    enabled (since 1.4.0, optional, default true)



    参考文档:

    Memcache配置说明,见下面链接

    http://dean-liu.iteye.com/blog/1897013

    http://blog.csdn.net/big1980/article/details/8454333


    参考文档:

    Memcache配置说明,见下面链接

    http://dean-liu.iteye.com/blog/1897013

    http://blog.csdn.net/big1980/article/details/8454333

  • 相关阅读:
    调试PHP如何让浏览器提示错误
    接口的理解
    linux中的curl
    linux后台执行命令:&和nohup
    php定界符<<<EOF讲解
    有关字符集问题
    设置disabled属性
    PHP魔术常量
    phpstorm-有关设置
    php常用函数
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6231831.html
Copyright © 2011-2022 走看看