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

[[email protected] ~]# cd /usr/local
[[email protected]-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
[[email protected]-node1 local]# tar -xf memcached-1.4.34.tar.gz
[[email protected]-node1 local]# cd memcached-1.4.34
[[email protected]-node1 memcached-1.4.34]# ./configure --prefix=/usr/local/memcached
[[email protected]-node1 memcached-1.4.34]# make && make install

启动memcached,端口11211可以根据自己需要修改不同端口
[[email protected]-node1 ~]# /usr/local/memcached/bin/memcached -d -m 100 -u root -p 11211 -c 256 -P /tmp/memcached.11211pid

ps -ef|grep memcachedroot 2001 785 0 11:18 pts/0 00:00:00 grep memcachedroot 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.pidroot 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文件:
[[email protected]-node1 ~]# cd /usr/local/tomcat/conf/
[[email protected]-node1 conf]# cp context.xml context.xml.bak

a)No-Stick模式
记住:多个tomcat实例时 需要选择Non-Sticky模式,即sticky="false"
[[email protected]-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)。
[[email protected]-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服务

原文地址:https://www.cnblogs.com/FireLL/p/11670525.html

时间: 2024-11-10 01:05:35

Memcached做Tomcat的session共享的相关文章

高级运维(五):构建memcached服务、LNMP+memcached、使用Tomcat设置Session、Tomcat实现session共享

一.构建memcached服务 目标: 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的添.删.改.查操作: 1> 安装memcached软件,并启动服务d 2> 使用telnet测试memcached服务 3> 对memcached进行增.删.改.查等操作 方案: 使用1台RHEL7虚拟机作为memcached服务器(192.168.4.5). 在RHEL7系统光盘中包含有memcached,因此需要提前配置yum源,即可直接使用yum安装,客户端测

构建memcached服务,Tomcat实现session共享

构建memcached服务 1.1 问题 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的添.删.改.查操作: 安装memcached软件,并启动服务 使用telnet测试memcached服务 对memcached进行增.删.改.查等操作 1.2 方案 使用1台RHEL7虚拟机作为memcached服务器(192.168.4.5). 在RHEL7系统光盘中包含有memcached,因此需要提前配置yum源,即可直接使用yum安装,客户端测试时需要提前安装te

生产-tomcat的session共享方案

生产-tomcat的session共享方案 在部署nginx+tomcat集群后,nginx采用负载均衡轮训模式,会出现访问时每个tomcat应用都会互相覆盖sessionID,导致sessionID不断变化,从而导致java一些功能实现不正常.作者查阅了不少文档,并且在测试环境和预生产环境进行各类测试,有两种方法可行. 应为目的只是实现session共享,杜绝session不断变化,所以解决方案越简单越好,本文属于实践文档,不会过多涉及原理和技术方面的东东,谷歌有详细相关技术介绍. 1    

Nginx+LAT(apache+tomcat)的实现和使用memcached保存tomcat的session会话

Nginx+LAT(Apache+tomcat)的实现和Apache反向代理和负载均衡tomcat的不同方式以及使用memcached保存tomcat的session会话 一.Nginx+LAT(Apache+tomcat)的环境结构; 1.Nginx +Apache实现负载均衡用户请求至tomcat,其中Nginx是负载均衡调度器,Apache和tomcat在同一台机器上,Apache将关于JSP的请求发送至tomcat. 2.实验结构图: 3.环境介绍,在两台CentOS7上都安装Tomca

N个tomcat实现Session共享

集群之后比如我们有N个Tomcat,用户在访问我们的网站时有可能第一次请求分发到tomcat1下,而第二次请求又分发到了tomcat2下,有过web开发经验的朋友都知道这时session不一致会导致怎样的后果,所以我们需要解决一下多个tomcat之间session共享的问题. 修改index.jsp SessionID:<%=session.getId()%> SessionIP:<%=request.getServerName()%> SessionPort:<%=requ

CentOS7 下 Nginx + Tomcat 实现 Session 共享

在之情的文章中搭建的 centos7 + tomcat + nginx 的环境的基础上, 使用 redis 实现 tomcat 的 session 共享的问题. 一 : 安装 Redis 安装 gcc: yum install -y gcc-c++ 使用 FTP 服务器上传安装包,解压上传的 redis 的包 tar -zxvf redis-3.0.0.tar.gz 进入解压目录 redis-3.0.0 执行 make PREFIX=/usr/local/redis install 把 redi

【电商】nginx+redis+tomcat实现session共享集群

本文记录nginx+redis+tomcat实现session共享的过程 tomcat-redis-session-manager组件:https://github.com/jcoleman/tomcat-redis-session-manager tomcat-redis-sessoin-manager对tomcat的支持: (1) tomcat6:支持,要求jdk为1.6, 需要引入tomcat-redis-session-manager-1.2-tomcat-6.jar,不过现在已经处理不

Nginx+tomcat实现session共享

防伪码:人生没有对错,成功永远属于奋斗者 一.如何保持session会话 目前,为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无论用户的请求被转发到哪个服务器上都能保证用户的正常使用,即需要实现session的共享机制. 在集群系统下实现session统一的有如下几种方案: 1.请求精确定位:sessionsticky,例如基于访问ip的hash策略,

apache+tomcat实现session共享

tomcat1(worker2)配置 注释: 在之前搭建好的apache+tomcat负载均衡的基础上来配置session共享,之前是在root目录下,用rz命令上传一个7版本的tomcat,然后解压生成一个文件夹,改名为worker2,再拷贝一个为worker3 1. 进入这个页面,点击红框中的链接 弹出页面,在页面中找到如下的内容: 上图中红框里的内容要修改为虚机IP:192.168.2.199,其他默认保持不变 2. 然后在worker2里面开启<Cluster>集群设置,在worker