生产-tomcatsession共享方案

    在部署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

取消下面代码注释即可:

完整的集群配置,可以看以下的文章:

http://zyycaesar.iteye.com/blog/296606

http://my.oschina.net/fenno/blog/111188

2.   优缺点总结

a)配置简单,可以满足session的共享
b)       局限于网络环境,如果tomcat服务器不在同一网段,很可能失效,需要完整的配置tomcat集群,而且会涉及到tcp的网络传输,导致系统复杂性增加,从而增加排错复杂度。

3      基于memcached存储session共享

   因为基于tomcatsession共享,在测试环境同网段很轻松实现,但是生产环境跨网段导致简单的配置无法实现,完成配置却不利于以后运维排错,而基于memcached存储session共享则是很好的替代方案。

1.   配置步骤

a)下载下图中所需的jar包,这个在反复测试中,确认的需要完整版的jar包,下载地址:http://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration
有大牛翻译成中文:http://chenzhou123520.iteye.com/blog/1650212

生产-tomcat的session共享方案_第1张图片

    需要注意的是,建议大家先仔细阅读上面的连接中的文档,特别注意tomcat7tomcat8,所下载的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

      标签内增加下列语句:


    上面方案是基于sticky sessions + kryo黏性session管理,由于生产没有采用memcached集群,所以做了修改,各位读者也可以根据自己的生产架构,适当的调整。

    补充(2015-9-14)基于阿里云ocs设置session共享配置:

    
经过验证,阿里云给的方案貌似用不了