`

Tomcat7基于Redis的Session共享

 
阅读更多

原文链接:http://blog.csdn.net/catoop/article/details/48603891

 

目前,为了使web能适应大规模的访问,需要实现应用的集群部署。集群最有效的方案就是负载均衡,而实现负载均衡用户没一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无论用户的请求被转发到哪个服务器上都能保证用户的正常使用,即需要实现session的共享机制。

在集群系统下实现session统一的有如下几种方案:

(1) 应用服务器间的session复制共享(如tomcat自带session共享)

(2) 基于cache DB缓存的session共享

 

应用服务器间的session复制共享(Tomcat自带的功能)

session复制共享,主要是指集群环境下,多台应用服务器之间同步session,使session保持一致,对外透明。 如果其中一台服务器发生故障,根据负载均衡的原理,web服务器(apache/nginx)会遍历寻找可用节点,分发请求,由于session已同步,故能保证用户的session信息不会丢失。

 

 

此方案的不足之处:

  • 技术复杂,必须在同一种中间件之间完成(如:tomcat-tomcat之间).
  • session复制带来的性能损失会快速增加.特别是当session中保存了较大的对象,而且对象变化较快时, 性能下降更加显著. 这种特性使得web应用的水平扩展受到了限制。
  • Session内容序列化(serialize),会消耗系统性能。
  • Session内容通过广播同步给成员,会造成网络流量瓶颈,即便是内网瓶颈。

基于 Memcached 缓存的 session 共享

即使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cache DB中,当应用服务器发生故障时,web服务器(apache/nginx)会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存时,则去cache DB中查找,如果找到则复制到本机,这样实现session共享和高可用。

目前有开源的msm用于解决tomcat之间的session共享:Memcached_Session_Manager(MSM)

http://code.google.com/p/memcached-session-manager/
一个高可用的Tomcat session共享解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,同时可使用memcached存取Session,以实现高可用。

特性

  • 支持Tomcat6、Tomcat7支持黏性、非黏性Session
  • 无单一故障点
  • 可处理tomcat故障转移
  • 可处理memcached故障转移
  • 插件式session序列化
  • 允许异步保存session,以提升响应速度
  • 只有当session有修改时,才会将session写回memcached
  • JMX管理&监控

该方案的不足之处:

  • memcache支持的数据结构比较单一
  • memcache的内存必须足够大,否则会出现用户session从Cache中被清除
  • 需要定期的刷新缓存
  • 服务器故障时,存在于内存的memcache数据将会丢失

 为了解决基于memcache中存在的不足,故提出了下面的一种解决方案:

 

基于Redis缓存的session共享

结合上面的分析后,由 redis 负责 session 数据的存储,而我们自己实现的 session manager 将负责 session 生命周期的管理。利用 redis 自身的key过期时间机智,我们不再需要定期刷新和做其他额外的处理。

截止到2015-09-20 前是不支持Tomcat8的,开源Git 地址:https://github.com/jcoleman/tomcat-redis-session-manager

因为我们使用redis 来存储Session,所以前提是redis已经安装和配置完成。(本文不进行redis 的安装配置说明)

使用步骤:

1、将 tomcat-redis-session-manager-1.2.jar 、jedis-2.6.1.jar、commons-pool2-2.2.jar 三个jar包拷贝到tomcat7/lib中。

2、在Tomcat 的conf/context.xml 文件里增加如下内容(或者在server.xml的context块中添加):

 

[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />  
  2. <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"  
  3.                    host="localhost" <!-- 可选,默认是"localhost" -->  
  4.                    port="6379" <!-- 可选,默认是 "6379" -->  
  5.                    database="0" <!-- 可选,默认是 "0" -->  
  6.                    maxInactiveInterval="60" <!-- 可选,默认是 "60" (单位:秒)--> />  

3、重启Tomcat7,到redis 中查看session_id,如下:

 

 

[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. 127.0.0.1:6379> keys WJ*  
  2. 1) "WJSESSIONID:6D5B0E0FD89E3A170B8BC5B8C112D3FD"  
  3. 2) "WJSESSIONID:9546B26D78C99E8F0BF785535E319271"  
  4. 3) "WJSESSIONID:839A35CFE17E900A81F50D629C104D2F"  
  5. 4) "WJSESSIONID:1C287C797CF00C82BBBF37A617A3B55C"  
  6. 5) "WJSESSIONID:FA2822C5021139641760754242F73393"  
  7. 6) "WJSESSIONID:E904369E5B24D39B4E25515D50650EA6"  
  8. 127.0.0.1:6379>  

 

 

这里进行一下特殊说明:

git 开源项目是直接将SESSIONID作为key存储到redis中的,如下所示:

 

[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. 1) "6D5B0E0FD89E3A170B8BC5B8C112D3FD"  
  2. 2) "9546B26D78C99E8F0BF785535E319271"  
  3. 3) "839A35CFE17E900A81F50D629C104D2F"  
  4. 4) "1C287C797CF00C82BBBF37A617A3B55C"  
  5. 5) "FA2822C5021139641760754242F73393"  
  6. 6) "E904369E5B24D39B4E25515D50650EA6"  

 

我对该项目做了一点修改。

修改原因包括几点:

1、项目也有使用redis 做其他数据存储,直接使用这样的key存储到redis中,直观上无法区分哪些key是用来做session共享用的。

2、项目包括好几个服务(web、wap、cms),每个服务都需要做负载均衡session共享,这样以来无法区分哪些session是属于哪个服务的。

3、很难统计每个服务的在线用户数。

 

我在集群部署中我的每个服务都有不同的sessionCookieName(web = WJSESSIONID、wap = MJSESSIONID、cms = CMSJSESSIONID)

不知道怎么配置的,这里简单说一下,直接在tomcat7/conf/server.xml 的最下面的Context中增加 sessionCookieName 配置即可:

 

[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. <Context docBase="F:\workspace\web" path="" reloadable="false" sessionCookieName="WJSESSIONID" />  

 

 

我修改后的项目已经共享到:http://download.csdn.net/detail/catoop/9122857  (项目是一个maven项目

其中 tomcat-redis-session-manager\target\tomcat-redis-session-manager-1.2.jar 可以直接使用。

 

 

-----------------------------

(完)

分享到:
评论

相关推荐

    Tomcat7+Redis+Session 负载之后session 共享 tomcat jar包

    通过以上步骤,我们成功地实现了基于Tomcat7和Redis的Session共享,确保了在Nginx负载均衡下的应用能够无缝处理用户的会话状态。这种方式不仅可以解决Session丢失的问题,还具有高可用性,因为Redis可以提供持久化...

    tomcat7+redis集群 session共享jar

    通过这种方式,"tomcat7+redis集群 session共享jar"可以帮助开发者解决在Tomcat7集群中Session共享的问题,提升系统的可扩展性和可用性。在大型网站和分布式应用中,这样的解决方案能够保证用户在不同服务器之间切换...

    tomcat8 redis session共享

    tomcat8 redis session共享,提供commons-pool2-2.3.jar,jedis-2.7.2.jar和修改后的tomcat-redis-session-manager-master-2.0.0.jar及部署文档

    适配与Tomcat7、8、9的redis session共享jar包

    "适配与Tomcat7、8、9的redis session共享jar包"指的是一个专为Apache Tomcat服务器设计的解决方案,用于在多台Tomcat服务器之间共享用户会话数据。这个解决方案主要依赖于Redis,一个高性能的键值存储系统,来存储...

    tomcat7+redis单点 session共享jar

    本资源"tomcat7+redis单点 session共享jar"提供了针对Tomcat7服务器和Redis数据存储的一个解决方案,以实现跨服务器的session共享。 **Tomcat7** 是一个广泛使用的开源Java Servlet容器,它实现了Java EE的Web应用...

    tomcat7tomcat8做redis session共享jar包

    标题中的“tomcat7tomcat8做redis session共享jar包”指的是在Tomcat 7和Tomcat 8这两种不同的Web服务器环境中,通过集成Redis来实现Session的共享功能。Redis是一种高性能的键值存储系统,常被用作分布式环境下的...

    Tomcat8(Tomcat9)+redis实现Session共享(支持Redis集群)

    本教程将详细介绍如何利用Tomcat 8或9以及Redis实现Session共享,支持Redis集群,以提高系统的可伸缩性和数据一致性。 首先,我们需要理解Session的概念。Session是服务器端用于存储用户状态的一种机制,通常在用户...

    tomcat8-redis-session共享

    标题 "tomcat8-redis-session共享" 涉及到的是在Tomcat 8中使用Redis作为Session共享存储的解决方案。这是一个常见的需求,特别是在分布式系统中,为了保持用户会话的一致性,需要将Session数据在多台服务器之间共享...

    ngnix tomcat7 redis session manager jar包

    标题 "ngnix tomcat7 redis session manager jar包" 提供了我们正在处理的是一个用于在Tomcat7服务器上利用Redis实现session共享的解决方案。这个解决方案通常涉及到将Web应用程序的会话数据存储在Redis这样的分布式...

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    《深入理解Tomcat-Redis-Session-Manager:在Tomcat7和Tomcat8中的应用》 在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高...

    nginx+tomcat+redis完成session共享

    这个小例子"nginx+tomcat+redis完成session共享"旨在演示如何通过这三种技术实现跨服务器的用户会话共享,以提升用户体验并简化系统管理。以下是这些技术及其在会话共享中的作用: 1. **Nginx**:Nginx是一款高性能...

    tomcat7+ redis session共享jar包

    标题中的“tomcat7+ redis session共享jar包”指的是在Tomcat 7这个流行的Java应用服务器上,通过集成Redis缓存系统实现Session共享的技术实践。Session共享是解决分布式环境中用户会话一致性问题的关键,尤其在多台...

    tomcat9+apr+redissession共享

    标题中的“tomcat9+apr+redissession共享”指的是在Tomcat 9服务器中,通过使用Apache Portable Runtime (APR)库以及Redis来实现Session的共享。这通常是为了在分布式环境中解决Session复制和管理的问题,提高应用的...

    nginx1.8-tomcat7-redis3.2-session配置和jar包

    tomcat-redis-session-manager-1.2-tomcat-7.jar 和tomcat的context.xml配置文件。 2.7.2版包含 commons-pool2-2.4.1.jar jedis-2.7.2.jar tomcat-redis-session.jar 和tomcat的context.xml配置文件

    tomcat7-redis session共享jar包

    标题 "tomcat7-redis session共享jar包" 暗示了这个压缩包包含的是一个用于在Tomcat 7服务器上实现Redis会话共享的Java库。Tomcat是Apache软件基金会开发的一个开源Web应用程序服务器,而Redis则是一个高速、开源的...

    tomcat集群基于redis共享session使用到的jar包

    apache-tomcat-7.0.56+nginx-1.8.0+redis-3.0.6集群部署所需JAR包,session共享 tomcat-redis-session-manager1.2.jar jedis-2.6.2.jar tomcat-juli.jar tomcat-juli-adapters.jar commons-pool-1.5.4.jar commons...

    Session共享 tomcat7+redis的session共享实现

    通过这种方式,我们成功地实现了基于Tomcat7和Redis的Session共享,解决了分布式环境下的用户会话一致性问题。这种方案具有高可用性和扩展性,同时也便于管理和监控。不过,需要注意的是,Session的序列化和反序列化...

    tomcat-redis-session-manager

    `tomcat-redis-session-manager`就是这样一款解决方案,它将Tomcat的session管理与Redis相结合,实现了跨服务器的session共享。 首先,让我们理解`tomcat-redis-session-manager`的核心概念。这是一个开源项目,它...

    Tomcat8下Redis Session共享解决方案 包含集群配置

    基于之前支持Tomcat7以下的redis-Session共享机制 进行相关适配的修改打包,里面包含所需Jar包以及相关的说明配置文档,包括:--单点授权Reids配置;- Sentinel 配置 ;- Redis Cluster 配置 ;适用于Tomcat8的容器环境...

Global site tag (gtag.js) - Google Analytics