生产-tomcat的session共享方案
在部署nginx+tomcat集群后,nginx采用负载均衡轮训模式,会出现访问时每个tomcat应用都会互相覆盖sessionID,导致sessionID不断变化,从而导致java一些功能实现不正常。作者查阅了不少文档,并且在测试环境和预生产环境进行各类测试,有两种方法可行。
应为目的只是实现session共享,杜绝session不断变化,所以解决方案越简单越好,本文属于实践文档,不会过多涉及原理和技术方面的东东,谷歌有详细相关技术介绍。
1 实验环境介绍
1. centos 6.5
2. JDK1.6_3.8
3. apache-tomcat-6.0.35
2 基于tomcat集群的session共享
tomcat集群各节点通过建立tcp链接来完成Session的拷贝,具体的详细解释大家可以谷歌SimpleTcpCluster。作者在实验是,成功的最简单配置为:
1. 配置步骤
在{TOMCST_HOME}/conf/server.xml
取消下面代码注释即可:
<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
完整的集群配置,可以看以下的文章:
http://zyycaesar.iteye.com/blog/296606
http://my.oschina.net/fenno/blog/111188
2. 优缺点总结
a)配置简单,可以满足session的共享
b) 局限于网络环境,如果tomcat服务器不在同一网段,很可能失效,需要完整的配置tomcat集群,而且会涉及到tcp的网络传输,导致系统复杂性增加,从而增加排错复杂度。
3 基于memcached存储session共享
因为基于tomcat的session共享,在测试环境同网段很轻松实现,但是生产环境跨网段导致简单的配置无法实现,完成配置却不利于以后运维排错,而基于memcached存储session共享则是很好的替代方案。
1. 配置步骤
a)下载下图中所需的jar包,这个在反复测试中,确认的需要完整版的jar包,下载地址:http://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration
有大牛翻译成中文:http://chenzhou123520.iteye.com/blog/1650212
需要注意的是,建议大家先仔细阅读上面的连接中的文档,特别注意tomcat7、tomcat8,所下载的jar包是不同的,作者在阅读官方文档前,先看的百度的相关文档,结果发现各个文档见所引用的jar都不同,完全实现不了,在tomcat启动时就会因为jar包原因,导致报错:
java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) Caused by: java.lang.AbstractMethodError atorg.apache.catalina.core.StandardContext.start(StandardContext.java:4714) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057) at org.apache.catalina.core.StandardHost.start(StandardHost.java:840) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) atorg.apache.catalina.core.StandardService.start(StandardService.java:525) atorg.apache.catalina.core.StandardServer.start(StandardServer.java:754) at org.apache.catalina.startup.Catalina.start(Catalina.java:595) ... 6 more
最终使用官方提供的jar包,才最终试验成功,搭建一定要注意jar包的版本。
b) 配置{TOMCST_HOMER}/conf/context.xml
在<Context>标签内增加下列语句:
<ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="you_memcache_addr:port" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
上面方案是基于sticky sessions + kryo,黏性session管理,由于生产没有采用memcached集群,所以做了修改,各位读者也可以根据自己的生产架构,适当的调整。