通过memcached来实现对tomcat集群中Session的共享策略
近期在做一套集群的实现,实现的方案是在Linux下完成对Apache + Tomcat 负载均衡的功能。
上述功能已经实现,有需要了解的朋友可以看我另外一篇博文。
Linux下Apache与Tomcat的完全分布式集群配置(负载均衡)
但是实现了该集群后,发现登陆系统后,每次都会被拦截回登录页面,造成该现象的原因是Session共享的问题没有解决。
原理即当我通过apache进入tomcat子节点1后,会持有一个唯一的标识放入到session中,但是第二次会通过负载均衡的实现进入到tomcat子节点2中,这时之前的标示符已经不存在,且Session已经销毁,因此会被误认为用户Session超时,解决的办法就是通过Session共享来实现该功能。
之前在网上查了很多资料,说法很多,不知道apache自身可不可以完成Session复制功能,试过很多,但都没有解决,这里不发表结论,有兴趣的朋友可以自行研究。
回到正题,我来整理一下我所实现的方案,希望对其他朋友有所帮助。
本方案通过memcached的memcache session manager来实现对Session的共享问题。
即整体的一套配置是 Apache + Tomcat + memcached 实现负载均衡以及Session共享。
具体的机器安装软件路径等相关信息,请看上面给出的博文链接。
主节点 :192.168.1.150 Apache 2.2.25 Memcached 1.4.15
子节点 :192.168.1.151 Tomcat 6.0.37
子节点 :192.168.1.152 Tomcat 6.0.37
1. memcache的安装及启动
本人把memcache安装在了apache所在的机器上
1.下载包 1.1.到http://memcached.org/下载linux下的memcached的安装包. 1.2.到http://libevent.org/ 下载安装memcached前比需要的包libevent-2.0.15我安装的是这个版本. 2.安装libevent-2.0.15 # tar zxvflibevent-2.0.5-beta.tar.gz
# cd libevent-2.0.5
# ./configure –prefix=/usr
# make
# make install 如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。(网上照搬.中间我只是出现过没有GCC的情况) 3.安装memcached tar zxvfmemcached-1.4.2.tar.gz cd memcached-1.4.2 ./configure --with-libevent=/usr make make install 如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。
安装完成后会把memcached放到 /usr/local/bin/memcached , 4.测试是否成功安装memcached: # ls -al /usr/local/bin/mem* 成功的话,会输出一些相关信息。 5.启动memcached /usr/local/bin/memcached -d -m 10 -u root -l localhost -p 11211 -c 256 -P /tmp/memcached.pid
以上部分为从其他网站摘录的memcached安装以及启动的方式,我本人对该安装做了部分修改,仅给大家作为参考,如果安装不成功,请自行查询原因,该文章主要用于对集群的Session共享作为主题。
大家必须要确保两件事情已经完成:
第一:首先确认memcached是否已经启动,可以通过
netstat -lp | grep memcached
来查看是否有11211的进程存在。
注意:11211为memcached的默认端口。
第二:需要在tomcat所在的节点上分别执行telnet命令来确认是否已经可以连接,操作命令为:
telnet 192.168.1.150 11211
上面的操作必须要在每一个子节点上去做,否则在启动的时候会提示Connect refuse。(本人在该地方卡住很长时间)
在这里首先要确保telnet服务是否已经安装并启动。
上述操作都完成后,就可以对Tomcat的相关文件进行配置了。
2. Tomcat相关配置
这一步很简单,网上也有很多说法,五花八门,我来给大家统一整理下,各位可以相互借鉴。
1)首先需要在tomcat安装路径所在的lib里面加上memcached相关的jar包,由于相互之间的版本问题,建议最好使用统一的版本。
另外网上似乎有两种办法,一种是kryo的序列化方式,另一种是javolution的方式,博主本人使用的是后者。
需要引入的jar包见下图所示:(这里大家导入一定要和下面完全一样,否则可能会出现错误,并不是因为每一个jar包都会用到,最好还是谨慎些)
2)配置Tomcat的conf相关配置文件。
在Context.xml文件中引入下列代码:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.1.150:11211"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
transcoderFactoryClass="de.javakaffee.web.msm.serializer
.javolution.JavolutionTranscoderFactory"
copyCollectionsForSerialization="false" />
这里的memcachedNodes节点中的n1为节点的别名,可以随意起。后面的IP必须是memcached所在的主机的IP地址,端口必须是之前配置的11211端口。
该代码段在网上发现其他人说也可以放到Server.xml下面,这里本人没有尝试。
此时,所有的tomcat子节点中都要加上上面的这段代码,每个tomcat里面的内容都是相同的上述内容,无需做任何修改。
至此为止,有关memcache的Session共享已经完全配置完成,具体的启动顺序,首先要把memcached的服务启动,然后是apache服务,最后启动tomcat所在的每个子节点的服务。
然后观察tomcat的控制台打印如下:
该上述信息为博主从tomcat子节点1的控制台上截图下来的,大家可以自行观察,此时memcachedConnection已经连接成功,由于没有涉及到单点故障问题,因此failover nodes为null。
该部分为memcached进行session共享的所有配置,需要借鉴的朋友可以尝试配置一下,如果有问题可以给我留言。
由于csdn博客上无法上传附件,因此tomcat所需的lib包,大家如果有需要的话可以留言向我索要,谢谢。
通过memcached来实现对tomcat集群中Session的共享策略的更多相关文章
- 关于 tomcat 集群中 session 共享的三种方法
前两种均需要使用 memcached 或redis 存储 session ,最后一种使用 terracotta 服务器共享. 建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单 ...
- Redis存储Tomcat集群的Session
Redis存储Tomcat集群的Session 如何 做到把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机.对使用用户零影响. 设想 是使用集群来搞定,通过通知负载均衡Nginx,取下集群中 ...
- 集群中Session共享解决方案分析
一.为什么要Session共享 Session存储在服务器的内存中,比如Java中,Session存放在JVM的中,Session也可以持久化到file,MySQL,redis等,SessionID存 ...
- Nginx+tomcat集群中,session的共享
nginx,tomcat集群后多个session分配到同一个应用 单节点低负荷的情况下,我们通常把一个WEB应用打成WAR包放WEB应用服务器,如TOMCAT下运行就行了(如图1).但随着用户量的增加 ...
- 用Redis存储Tomcat集群的Session
作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 前段时间,我花了不少时间来寻求一种方法,把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机.对使用 ...
- 用Redis存储Tomcat集群的Session实现session共享
一.存储 前段时间,我花了不少时间来寻求一种方法,把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机.对使用用户零影响. 我的设想是使用集群来搞定,通过通知负载均衡Nginx,取下集群中的To ...
- tomcat集群及session共享
一般来说,java web app主要用作两个领域: 1.api.api一般是无状态的,所以无需考虑session共享的问题 2.传统web应用和网站,如crm,oa,erp,b2c,bbs等.尤其b ...
- Tomcat集群的session共享
配置Tomcat的session共享可以有三种解决方案: 第一种是以负载均衡服务器本身提供的session共享策略,每种服务器的配置是不一样的并且nginx本身是没有的. 第二种是利用web容器本身的 ...
- 基于tomcat集群做session共享
前端代理服务器nginx:192.168.223.136 tomcat服务器:采用的一台多实例192.168.223.146:8081,192.168.223.146:8082(如何构建多实例tomc ...
随机推荐
- hdu5338 ZZX and Permutations
hdu5338 ZZX and Permutations 非原创,来自多校题解 不是自己写的,惭愧ing…… 留着以后自己参考…… lower_bound {1,2,4,5} 询问 2,返回的是 2 ...
- PHP 的解压缩ZipArchive中的extractTo()方法 LINUX+nginx环境中解压zip时文件丢失的问题
在项目中要用ZipArchive解压ZIP文件,起初測试环境在WINDOWS平台中,測试通过,换到 LINUX+nginx 的环境中时 就出问题了(ZIP包中有文件和目录一共3百多个文件,大部分是带汉 ...
- openfire数据库中文乱码问题
1.首先数据库的编码设置为UTF-8 2.项目的编码也要设置为UTF-8 假设数据保存到数据库的时候还有乱码 就要改动openfire配置文件 在openfire主文件夹\conf\openfire ...
- Storm流计算之项目篇(Storm+Kafka+HBase+Highcharts+JQuery,含3个完整实际项目)
1.1.课程的背景 Storm是什么? 为什么学习Storm? Storm是Twitter开源的分布式实时大数据处理框架,被业界称为实时版Hadoop. 随着越来越多的场景对Hadoop的MapRed ...
- Kendo UI开发教程(24): 单页面应用(二) Router 类
Route类负责跟踪应用的当前状态和支持在应用的不同状态之间切换.Route通过Url的片段功能(#url)和流量器的浏览历史功能融合在一起.从而可以支持把应用的某个状态作为书签添加到浏览器中.Rou ...
- select的种种取值
今天别人问我一个问题 <body> <select id="tests" onchange="test()"> <option & ...
- Python中的列表解析和生成表达式
摘要:优雅.清晰和务实都是python的核心价值观,如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析( List comprehensions)和生成表达式,通过 ...
- OO的ALV隐藏工具栏的form
OO的ALV隐藏工具栏: ***展示数据 CALL METHOD gr_alvgrid->set_table_for_first_display EXPORTING is_variant = g ...
- MTU & MSS 详解记录(转)
先学习理解一下帧的封装格式: 需要注意的是,区别两种帧封装格式:802标准帧和以太网帧 1,在802标准定义的帧格式中,长度字段是指它后续数据的字节长度,但不包括C R C检验 ...
- input在苹果浏览器下变成圆角的解决方案
复制代码代码如下: .form-actions input{ ... -webkit-appearance: none; } 更新到iPhone一看,真爽,问题解决了.