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

-----------------------------
(完)

时间: 2025-01-02 19:39:03

Tomcat7基于Redis的Session共享的相关文章

简直奔溃,搭建centos+nginx+tomcat+redis做session共享,启动报错

问题描述 简直奔溃,搭建centos+nginx+tomcat+redis做session共享,启动报错 环境是 centos6.4+nginx1.8+tomcat7.0.65+redis3.0.5+jdk1.7.......... 配置应该没有问题,但是启动tomcat的时候报 caused by: org.apache.catalina.LifecycleException: Unable to attach to session handling valve; sessions canno

tomcat7用redis存储session报错

问题描述 tomcat7用redis存储session报错 com.orangefunction.tomcat.redissessions.RedisSessionManager sessionFromSerializedData SEVERE: Unable to deserialize into session java.lang.ClassNotFoundException: 解决方案 PS:截止到2015-05-12前是不支持Tomcat8的,详情见官网:https://github.c

nginx+tomcat+redis完成session共享

本文记录nginx+redis+tomcat实现session共享的过程 nginx安装:http://blog.csdn.net/grhlove123/article/details/47834673 redis安装:http://blog.csdn.net/grhlove123/article/details/47783471 准备两个tomcat,修改相应的端口   名称 IP 端口 tomcat版本 JDK tomcat1 10.10.49.23 8080 7.0.40 1.7.0_25

php基于redis处理session的方法_javascript技巧

一个基于redis的处理session的方法,如下. <?php class Session_custom { private $redis; // redis实例 private $prefix = 'sess_'; // session_id前缀 // 会话开始时,会执行该方法,连接redis服务器 public function open($path, $name) { $this->redis = new Redis(); return $this->redis->conn

分布式中使用Redis实现Session共享(转)

上一篇介绍了如何使用nginx+iis部署一个简单的分布式系统,文章结尾留下了几个问题,其中一个是"如何解决多站点下Session共享".这篇文章将会介绍如何使用Redis,下一篇在此基础上实现Session. 这里特别说明一下,其实没有必要使用Redis来解决Session共享.Asp.net提供了StateServer模式来共享Session,这里重复造轮子的目的1:熟悉Redis的基本知识和使用 2.学习和巩固Session的实现原理. 3.学习Redis应用场景 阅读目录 Re

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/error.log  notice; error_log  logs/error.log  info;   #pid

Nginx反向代理,负载均衡,redis session共享,keepalived高可用

相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此处可搭建服务器集群. redis服务器一台,用于session的分离共享. nginx主服务器:192.168.50.133 nginx备服务器:192.168.50.135 tomcat项目服务器1:192.168.50.137 tomcat项目服务器2:192.168.50.139 redis服

CentOS6.5下Tomcat7 Nginx Redis配置步骤教程详解_Linux

所有配置均在一台机器上完成,部署拓扑信息如下: 注意:由于Redis配置对jar包和tomcat版本比较严格,请务必使用tomcat7和本文中提供的jar包. 下载地址: http://pan.baidu.com/s/1bO67Ky tomcat: tomcat1 localhost:8080 tomcat2 localhost:9080 nginx: localhost:1210 redis: localhost:6379 1. tomcat的安装和配置 1. 在server.xml文件中,修

详解用Redis实现Session功能_Redis

0.什么是Redis Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API 1.与其他用户状态保存方案比较 一般开发中用户状态使用session或者cookie,两种方式各种利弊. Session:在InProc模式下容易丢失,并且引起并发问题.如果使用SQLServer或者SQLServer模式又消耗了性能 Cookie则容易将一些用户信息暴露,加解密同样也消耗了性能. Redis采用这样的方案解决了几个问题,