负载均衡时 session 的处理策略

来源:互联网 发布:mac合上盖子播放音乐 编辑:程序博客网 时间:2024/05/17 21:58

固定用户到某个服务实例上 (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 0