负载均衡时 session 的处理策略

固定用户到某个服务实例上 (IP Hash策略)

session 复制

  • 设置 tomcat 开启 session 复制
    取消注释(大概在109行)<Cluster className="org.apache.catalina.gi.tcp.SimpleTcpCluster"/>
    由于每个 tomcat 实例都要开启接收器,会监听 4000 端口,单机多实例部署时会发生端口冲突
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
    <Channel className="org.apache.catalina.tribes.group.GroupChannel">   
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
            address="auto"
            port="4000"  />
    </Channel>
</Cluster>
  • 应用的 web.xml 中添加 <distributable/>

session共享 (基于 Memcached)

  • 黏性
    • 将用户请求固定在某个服务实例上
    • 一到多个 Memcached 实例,主从备份,所有 Memcached 的数据都是同步的;
    • 每个 tomcat 实例设置主要使用哪个 Memcached 来存储自己的 session,不同的 tomcat 最好指定不同的主存储器
    • tomcat 实例自身保存 session,并复制到自己的主备份存储器中
    • 取 session 时从自身取,修改时先改自身,并同步到备份存储器中
  • 非黏性
    • 将用户请求随机分配在某个服务实例上
    • 一到多个 Memcached 实例,主从备份,所有 Memcached 的数据都是同步的;
    • tomcat 实例自身不保存 session,每次从备份中取
实现步骤:
  1. 安装 Memcached

    1. 编译安装,先要有 gcc (apt-get -y install gcc)
    2. 安装 libevent: ./configure --prefix=/usr/local/libevent; make && make install
    3. 安装 memcached: ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/; make && make install
    4. 启动 memcached:
      memcached/bin/memcached -d -u root -m 128 -p 11211 -c 1024
      -d 后台进程
      -u 启动用户
      -m 使用内存大小
      -p 使用端口
      -c 最大连接数
  2. 复制 jar 包到 tomcat/lib 目录,jar 分三类

    1. spymemcached.jar memcached   --java客户端
    2. msm相关的包
        memcached-session-manager-{version}.jar    --核心包
        memcached-session-manager-tc{tomcat-version}-{version}.jar   --Tomcat版本相关的包
    3. 序列化工具包,有多种可选方案,不设置时使用jdk自带序列化,其它可选 kryo,javolution,xstream,flexjson 等    
        msm-{tools}-serializer-{version}.jar
        其它序列化工具相关包  一般第三方序列化工具不需要实现 serializable 接口
  1. 配置 Context,加入处理 session 的 Manager: MemcachedBackupSessionManager
    Context配置查找顺序:

    • conf/context.xml 全局配置,作用于所有应用
    • conf/[enginename]/[hostname]/context.xml.default 全局配置,作用于指定host下全部应用
    • conf/[enginename]/[hostname]/[contextpath].xml 只作用于contextpath指定的应用
    • 应用 META-INF/context.xml 只作用于本应用
    • conf/server.xml 标签下 作用于 Context docBase 指定的应用
      所以,只希望session管理作用于特定应用,最好用 3、4 方式设置,希望作用全体,可用 1、2、5 设置
  2. MemcachedBackupSessionManager 参数设置 context.xml 文件

<?xml version="1.0" encoding="UTF-8"?>

<Context>

    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- sticky session 最小配置-->
    <!-- className 管理器类名 -->
    <!-- memcachedNodes memcached服务器节点,以节点名:主机:端口形式表示,其中节点名随意命名,但不同tomcat间要一致 -->
    <!-- sticky隐含默认值为true,此时为sticky session模式 -->
    <!-- failoverNodes 仅适用于sticky模式, n1表示主要将session备份到n2,如果n2不可用,再用n1-->
    <!-- 另一台服务器配置正好相反,这样保证将session保存到其它机器,避免整个机器崩溃时tomcat与session一起崩溃-->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:192.168.1.62:11211,n2:192.168.1.63:11211"
        failoverNodes="n1"
    />

    <!-- 经常用到的生产环境sticky模式配置 -->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:192.168.1.62:11211,n2:192.168.1.63:11211"
        failoverNodes="n1"
        requestUriIgnorePattern=".*\.(jpg|png|css|js)$" 
        memcachedProtocol="binary"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />

    <!-- 经常用到的生产环境non-sticky模式配置 -->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:192.168.1.62:11211,n2:192.168.1.63:11211"
        sticky="false"
        sessionBackupAsync="false"
        lockingMode="auto"
        requestUriIgnorePattern=".*\.(jpg|png|css|js)$" 
        memcachedProtocol="binary"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />

    <!--
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:192.168.1.62:11211,n2:192.168.1.63:11211"

        #sticky模式,默认true
        sticky="false"

        #仅适用于sticky模式,n1表示主要将session备份到n2,如果n2不可用,再用n1
        failoverNodes="n1"

        #忽略的请求类型,这些类型请求不处理session
        requestUriIgnorePattern=".*\.(jpg|png|css|js)$" 

        #例如context中设置sessionPath=/时,一个host下多个应用可能有相同session_id,
        #此时向memcached写入时会造成混乱,可通过以下方式加前缀区分不同应用
        storageKeyPrefix="static:name|context|host|webappVersion|context.hash|host.hash|多项组合,以,间隔"

        #设置mecached协议数据传输方式,默认text,设为binary有助力性能提升
        memcachedProtocol="binary"

        #是否异步存储session变化,默认true,性能好,适用于sticky模式,
        #non-sticky时建议设置为false,避免延迟造成信息不一致
        sessionBackupAsync="false"

        #仅适用于non-sticky模式,为避免同步编辑冲突,在修改session时锁定
        #同步编辑一种可能发生的情况是在ajax请求时,同一页多个请求同时发起,可能会访问不同后端
        #auto 读模式不锁写模式锁
        #uriPattern模式,将URI+"?"+queryString与模式Regex匹配,如果匹配则锁定
        lockingMode="none|all|auto|uriPattern:Regex"

        #使用第三方序列化工具,提高序列化性能
        #常用的第三方工具kryo, javolution, xstream等
        #此时需要向tomcat/lib下添加相关jar包
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

    />
    -->

</Context>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值