Tomcat7基于Redis的Session共享

简介:

目前,为了使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块中添加):

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
                   host="localhost" <!-- 可选,默认是"localhost" -->
                   port="6379" <!-- 可选,默认是 "6379" -->
                   database="0" <!-- 可选,默认是 "0" -->
                   maxInactiveInterval="60" <!-- 可选,默认是 "60" (单位:秒)--> />
3、重启Tomcat7,到redis 中查看session_id,如下:

127.0.0.1:6379> keys WJ*
1) "WJSESSIONID:6D5B0E0FD89E3A170B8BC5B8C112D3FD"
2) "WJSESSIONID:9546B26D78C99E8F0BF785535E319271"
3) "WJSESSIONID:839A35CFE17E900A81F50D629C104D2F"
4) "WJSESSIONID:1C287C797CF00C82BBBF37A617A3B55C"
5) "WJSESSIONID:FA2822C5021139641760754242F73393"
6) "WJSESSIONID:E904369E5B24D39B4E25515D50650EA6"
127.0.0.1:6379>


这里进行一下特殊说明:

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

1) "6D5B0E0FD89E3A170B8BC5B8C112D3FD"
2) "9546B26D78C99E8F0BF785535E319271"
3) "839A35CFE17E900A81F50D629C104D2F"
4) "1C287C797CF00C82BBBF37A617A3B55C"
5) "FA2822C5021139641760754242F73393"
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 配置即可:

<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 可以直接使用。



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

(完)



目录
相关文章
|
3月前
|
存储 NoSQL 前端开发
Redis专题-实战篇一-基于Session和Redis实现登录业务
本项目基于SpringBoot实现黑马点评系统,涵盖Session与Redis两种登录方案。通过验证码登录、用户信息存储、拦截器校验等流程,解决集群环境下Session不共享问题,采用Redis替代Session实现数据共享与自动续期,提升系统可扩展性与安全性。
268 3
Redis专题-实战篇一-基于Session和Redis实现登录业务
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
778 26
|
11月前
|
关系型数据库 MySQL 应用服务中间件
《docker基础篇:8.Docker常规安装简介》包括:docker常规安装总体步骤、安装tomcat、安装mysql、安装redis
《docker基础篇:8.Docker常规安装简介》包括:docker常规安装总体步骤、安装tomcat、安装mysql、安装redis
392 7
|
NoSQL 关系型数据库 MySQL
Tomcat、MySQL、Redis最大支持说明
综上所述,Tomcat、MySQL、Redis的并发处理能力均非固定值,而是通过合理的配置与优化策略,结合系统硬件资源,共同决定了它们在实际应用中的表现。开发者应根据应用的具体需求和资源条件,对这些组件进行细致的调优,以达到最佳性能表现。
200 1
|
NoSQL Redis API
限流+共享session redis实现
【10月更文挑战第7天】
160 0
|
缓存 负载均衡 NoSQL
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
197 1
|
存储 NoSQL Java
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
342 0
|
Java 应用服务中间件 Apache
nginx+tomcat+redis完成session共享
本文记录nginx+redis+tomcat实现session共享的过程 nginx安装:http://blog.csdn.net/grhlove123/article/details/47834673 redis安装:http://blog.
1619 0
|
NoSQL Java 应用服务中间件
|
NoSQL 应用服务中间件 Apache
Nginx安装,Nginx静态缓存,Nginx Gzip压缩,Nginx负载均衡,Nginx方向代理,Nginx+Tomcat+Redis做session共享
Nginx安装 nginx-1.10.1.tar.gz安装,参考http://blog.csdn.net/tototuzuoquan/article/details/47381907。 修改nginx.conf的配置文件 #user  nobody; worker_processes  8;   error_log  logs/error.log; error_log  logs
6301 0