zoukankan      html  css  js  c++  java
  • Memcached做Tomcat的session共享

    基于cache DB缓存的session共享

    基于memcache/redis缓存的session共享.即使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cache DB中,当应用服务器发生故障时,调度器会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存时,则去cacheDB中查找,如果找到则复制到本机,这样实现session共享和高可用。

    Tomcat集群session同步方式:
    1)使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,在大并发下表现并不好。
    2)利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session(并不是共享session解决)的问题! 并且如果应用是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。
    3)利用nginx插件实现tomcat集群和session同步,nginx-upstream-jvm-route是一个Nginx的扩展模块,用来实现基于Cookie的Session Sticky的功能。但是遗憾的是,这个模块的补丁在nginx1.4版本之后就没有再更新了,所以nginx1.4之后版本跟该模块就不兼容了!!  
    4)利用memcached实现(MSM工具)。memcached存储session,并把多个tomcat的session集中管理,前端在利用nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时又能保证较高的性能。即通过MSM工具把Tomcat的Session序列化后保存到Memcached里面,从而实现Session共享.
    5)利用redis实现。使用redis不仅仅可以将缓存的session持久化,还因为它支持的单个对象比较大,而且数据类型丰富,不只是缓存 session,还可以做其他用途,可以一举几得。
    6)利用filter方法实现。这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于tomcat ,而且实现的原理比较简单容易控制。

    MSM工作原理:
    1、Sticky Session(黏性) 模式下的工作原理:
    Tomcat本地Session为主Session,Memcached 中的Session为备Session。Request请求到来时, 从memcached加载备 Session到 tomcat (仅当tomcat jvmroute发生变化时, 否则直接取Tomcat Session);Request请求结束时,将Tomcat Session更新至memcached,以达到主备同步之目的。 安装在Tomcat上的MSM使用本机内存保存Session,当一个请求执行完毕之后,如果对应的Session在本地不存在(即某用户的第一次请求),则将该Session复制一份至Memcached;当该Session的下一个请求到达时,会使用Tomcat的本地Session,请求处理结束之后,Session的变化会同步更新到 Memcached,保证数据一致。当集群中的一个Tomcat挂掉,下一次请求会被路由到其他Tomcat上。负责处理此此请求的Tomcat并不清楚Session信息,于是从Memcached查找该Session,更新该Session并将其保存至本机。此次请求结束,Session被修改,送回Memcached备份。

    2、Non-sticky Session (非黏性)模式下的工作原理(记住:多台tomcat集群或多个tomcat实例时需要选择Non-Sticky模式,即sticky="false")
    Tomcat本地Session为中转Session,Memcached1为主Session,Memcached2为备Session。Request请求到来时,从Memcached2加载备Session到tomcat,(当容器中还是没有Session 则从Memcached1加载主Session到tomcat,这种情况是只有一个memcached节点,或者有Memcached1 出错时),Request请求结束时,将Tomcat Session更新至主Memcached1和备memcached2,并且清除Tomcat Session 。以达到主备同步之目的。 多台tomcat集群时 需要选择Non-Sticky模式,即sticky="false"

    memcached安装

    下载MSM的类库文件到tomcat安装路径的lib/ 目录下

    链接:https://pan.baidu.com/s/179oyX_vInB0Ug9r3alCc7g
    提取码:6gef

    [root@mem-node1 ~]# cd /usr/local
    [root@mem-node1 local]# ll memcached-1.4.34.tar.gz                    
    -rw-r--r-- 1 root root 391131 Jun 27 07:41 memcached-1.4.34.tar.gz
    [root@mem-node1 local]# tar -xf memcached-1.4.34.tar.gz
    [root@mem-node1 local]# cd memcached-1.4.34                
    [root@mem-node1 memcached-1.4.34]# ./configure --prefix=/usr/local/memcached
    [root@mem-node1 memcached-1.4.34]# make && make install
       
    启动memcached,端口11211可以根据自己需要修改不同端口
    [root@mem-node1 ~]# /usr/local/memcached/bin/memcached -d -m 100 -u root -p 11211 -c 256 -P /tmp/memcached.11211pid

    ps -ef|grep memcached
    root 2001 785 0 11:18 pts/0 00:00:00 grep memcached
    root 4700 1 0 Oct11 ? 00:00:51 ./memcached -d -m 100 -u root -l 192.168.1.110 -p 11212 -c 256 -P /tmp/memcached11211.pid
    root 4745 1 0 Oct11 ? 00:00:51 ./memcached -d -m 100 -u root -l 192.168.1.111 -p 11211 -c 256 -P /tmp/memcached11212.pid

    参数: 

    - d:作为守护进程来运行
    - m:分配给Memcached的内存。这里是10M.
    - u:运行Memcached的用户。
    - l:Memcached监听的IP地址。
    - p:Memcached监听的端口。
    - c:最大的并发连接数 默认为1024.
    - P:保存进程Id到指定的文件,只有在d使用的时候才有意义。
    其它命令参数
    - U:监听UDP端口 0表示不监听(默认为11211)
    - s:监听unix套接字路径
    - a:UNIX套接字访问掩码,八进制数字(默认0700)
    - r:最大核心文件限制。
    - M:内存用光时报错(不会删除数据)
    - k:锁定所有内存页。 可以锁定内存的上限。

    在No-Stick模式和Stick模式下context.xml文件配置也有所不同(一般用的是No-Stick模式)
    只需要修改conf/context.xml文件:
    [root@Tomcat-node1 ~]# cd /usr/local/tomcat/conf/
    [root@Tomcat-node1 conf]# cp context.xml context.xml.bak
     
     
    a)No-Stick模式
    记住:多个tomcat实例时 需要选择Non-Sticky模式,即sticky="false"
    [root@Tomcat-node1 conf]# vim context.xml                       #在<Context>和</Context>之间添加下面内容.就在底部</Context>之前添加就行
    .......
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
             memcachedNodes="n1:192.168.1.110:11211,n2:192.168.1.111:11211"
    lockingMode="auto"
    sticky="false"
    sessionBackupAsync="false"
    requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)|f5.jsp$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

    />
     
    第一台tomcat节点的congtext.xml配置好之后,再将该文件拷贝到另一台tomcat节点的相同路径下
     
     
    b) Stick模式。
    故障转移配置节点(failoverNodes),不能使用在Non-Sticky模式,多个使用空格或逗号分开,配置某个节点为备份节点。
    当其他节点都不可用时才会存储到备份节点,适用于sticky模式(即一台tomcat,多台memcached)。
    [root@Tomcat-node1 conf]# vim context.xml              
    ......
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                 memcachedNodes="n1:192.168.1.110:11211,n2:192.168.1.111:11211"            #多个memcached之间用空格或逗号隔开都可以的
                 sticky="true"
                 failoverNodes="n2"
    requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)|f5.jsp$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" copyCollectionsForSerialization="true"
    />
    第一台tomcat节点的congtext.xml配置好之后,再将该文件拷贝到另一台tomcat节点的相同路径下,并将failoverNodes后面的参数改为n1 配置好之后,一定要记得重启两台机器的tomcat服务
  • 相关阅读:
    通过URL地址将图片保存到本地
    Sql批量提交方法
    MySql 批量提交方法
    【Sqlserver】查看所有数据库的大小 创建日期 名称 版本级别 状态
    【asp.net】滑块验证码(分享一个从github上下载的源码)
    【winform】 WeifenLuo.WinFormsUI.Docking.dll 组件学习
    【C#】初次使用webapi的体会
    【C#】 封装的异步HttpRequest
    Android实现双时间选择器
    Android的金额3位数加逗号分隔
  • 原文地址:https://www.cnblogs.com/FireLL/p/11670525.html
Copyright © 2011-2022 走看看