笔者所在公司由于业务性质(不允许单机故障发生),所有应用都需要集群分布式部署。那么对于Tomcat集群如何保持并同步各Tomcat服务器的Session状态,下面提供四种解决方案:
1、使用tomcat自带的cluster集群方式,多个tomcat间自动实时复制session信息,配置起来很简单。但这个方案的效率、性能比较低,在大并发下表现并不好,不建议。
2、利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。但如果应用是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。
3、用nginx插件实现tomcat集群和session同步,nginx-upstream-jvm-route-0.1.tar.gz,是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能,可通过http://code.google.com/p/nginx-upstream-jvm-route/downloads/list获取。
4、利用memcached把多个tomcat的session集中管理,前端在利用nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时又能保证较高的性能。笔者所在公司采用的就是这种方案。
上面第四种解决方案的集群环境是:
1、nginx版本为:nginx-1.6.3
2、tomcat版本为:apache-tomcat-7.0.50
3、memcached版本为:memcached-1.4.3.tar.gz
4、 session复制同步使用jar包memcache-session-manager版本:memcached-session-manager-1.6.3.jar
5、操作系统环境为:centos6.5
具体操作有以下几点要注意:
1、session复制同步需要用到的jar包(需要放到tomcat的lib文件夹下),在笔者的GitHub地址:
https://github.com/meiyang1990/jar-tomcat-nginx-memcached.git
2、修改tomcat的conf目录下的context.xml文件,添加上以下一段内容:
<?xml version='1.0' encoding='utf-8'?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:11211"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
sessionBackupTimeout="1000"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
</Context>
好了!