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服务