近期在做一套集群的实现,实现的方案是在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所在的机器上
大家必须要确保两件事情已经完成:
第一:首先确认memcached是否已经启动,可以通过
注意:11211为memcached的默认端口。
第二:需要在tomcat所在的节点上分别执行telnet命令来确认是否已经可以连接,操作命令为:
在这里首先要确保telnet服务是否已经安装并启动。
上述操作都完成后,就可以对Tomcat的相关文件进行配置了。
2. Tomcat相关配置
这一步很简单,网上也有很多说法,五花八门,我来给大家统一整理下,各位可以相互借鉴。
1)首先需要在tomcat安装路径所在的lib里面加上memcached相关的jar包,由于相互之间的版本问题,建议最好使用统一的版本。
另外网上似乎有两种办法,一种是kryo的序列化方式,另一种是javolution的方式,博主本人使用的是后者。
需要引入的jar包见下图所示:(这里大家导入一定要和下面完全一样,否则可能会出现错误,并不是因为每一个jar包都会用到,最好还是谨慎些)
2)配置Tomcat的conf相关配置文件。
在Context.xml文件中引入下列代码:
该代码段在网上发现其他人说也可以放到Server.xml下面,这里本人没有尝试。
此时,所有的tomcat子节点中都要加上上面的这段代码,每个tomcat里面的内容都是相同的上述内容,无需做任何修改。
至此为止,有关memcache的Session共享已经完全配置完成,具体的启动顺序,首先要把memcached的服务启动,然后是apache服务,最后启动tomcat所在的每个子节点的服务。
然后观察tomcat的控制台打印如下:
该上述信息为博主从tomcat子节点1的控制台上截图下来的,大家可以自行观察,此时memcachedConnection已经连接成功,由于没有涉及到单点故障问题,因此failover nodes为null。
该部分为memcached进行session共享的所有配置,需要借鉴的朋友可以尝试配置一下,如果有问题可以给我留言。
由于csdn博客上无法上传附件,因此tomcat所需的lib包,大家如果有需要的话可以留言向我索要,谢谢。