生产-tomcat的session共享方案

生产-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集群,所以做了修改,各位读者也可以根据自己的生产架构,适当的调整。

时间: 2024-10-12 15:23:29

生产-tomcat的session共享方案的相关文章

Tomcat集群环境下session共享方案梳理(1)-通过memcached(MSM)方法实现

对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式: 一种是把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据: 另一种就是在集群中的所有节点间进行Session数据的同步拷贝,任何一个节点均保存了所有的Session数据. Tomcat集群session同步方案有以下几种方式: 1)使用tomcat自带的

Tomcat自带的Session共享方案实施记录

一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上,从而就找不到session以至于最终导致请求失败.要实现tomcat session共享有多种方案,今天介绍下使用tomcat自带的cluster方式,在多个tomcat节点间自动实时复制session信息,配置起来很简单.tomcat自带的这种session共享方案,对于规模较小的tomcat集群来说够用了,但这个方案的效率比较低,在大并发下表现并

高级运维(五):构建memcached服务、LNMP+memcached、使用Tomcat设置Session、Tomcat实现session共享

一.构建memcached服务 目标: 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的添.删.改.查操作: 1> 安装memcached软件,并启动服务d 2> 使用telnet测试memcached服务 3> 对memcached进行增.删.改.查等操作 方案: 使用1台RHEL7虚拟机作为memcached服务器(192.168.4.5). 在RHEL7系统光盘中包含有memcached,因此需要提前配置yum源,即可直接使用yum安装,客户端测

构建memcached服务,Tomcat实现session共享

构建memcached服务 1.1 问题 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的添.删.改.查操作: 安装memcached软件,并启动服务 使用telnet测试memcached服务 对memcached进行增.删.改.查等操作 1.2 方案 使用1台RHEL7虚拟机作为memcached服务器(192.168.4.5). 在RHEL7系统光盘中包含有memcached,因此需要提前配置yum源,即可直接使用yum安装,客户端测试时需要提前安装te

CentOS7 下 Nginx + Tomcat 实现 Session 共享

在之情的文章中搭建的 centos7 + tomcat + nginx 的环境的基础上, 使用 redis 实现 tomcat 的 session 共享的问题. 一 : 安装 Redis 安装 gcc: yum install -y gcc-c++ 使用 FTP 服务器上传安装包,解压上传的 redis 的包 tar -zxvf redis-3.0.0.tar.gz 进入解压目录 redis-3.0.0 执行 make PREFIX=/usr/local/redis install 把 redi

Nginx + tomcat + Memcached(session共享)

Nginx + tomcat + Memcached(session共享) 实验拓扑 nginx   实现负载 tomcat   实现web功能 memcached 实现会话共享 安装Nginx [[email protected] ~]# yum -y install pcre pcre-devel [[email protected] ~]# tar -zxvf nginx-1.0.5.tar.gz [[email protected] ~]# cd nginx-1.0.5 [[email 

N个tomcat实现Session共享

集群之后比如我们有N个Tomcat,用户在访问我们的网站时有可能第一次请求分发到tomcat1下,而第二次请求又分发到了tomcat2下,有过web开发经验的朋友都知道这时session不一致会导致怎样的后果,所以我们需要解决一下多个tomcat之间session共享的问题. 修改index.jsp SessionID:<%=session.getId()%> SessionIP:<%=request.getServerName()%> SessionPort:<%=requ

二级域名session 共享方案

二级域名session 共享方案 1.利用COOKIE存放session_id(); 实例: 域名一文件php代码: <?php session_start(); setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".session.com"); $_SESSION['user_name'] = '梁山良民'; echo $_SESSION['user_name'];

【电商】nginx+redis+tomcat实现session共享集群

本文记录nginx+redis+tomcat实现session共享的过程 tomcat-redis-session-manager组件:https://github.com/jcoleman/tomcat-redis-session-manager tomcat-redis-sessoin-manager对tomcat的支持: (1) tomcat6:支持,要求jdk为1.6, 需要引入tomcat-redis-session-manager-1.2-tomcat-6.jar,不过现在已经处理不