关于 tomcat 集群中 session 共享的三种方法

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

前两种均需要使用 memcached 或 redis 存储 session ,最后一种使用 terracotta 服务器共享。 
建议使用 redis ,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单个对象比较大,而且数据类型丰富, 
不只是缓存 session ,还可以做其他用途,一举几得啊。 

1、使用 filter 方法存储 
这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于 tomcat ,而且实现的原理比较简单容易控制。 
可以使用 memcached-session-filter 
官方网址:http://code.google.com/p/memcached-session-filter/ 
官方介绍:解决集群环境下java web容器session共享,使用filter拦截器和memcached实现。在tomcat 6和websphere 8测试通过,现网并发2000,日PV量1100万。 
暂不支持session event包括create destory 和 attribute change 
东西很不错,体积很小,不过这个东东要和 spring 一起使用,而且要求存储到 memcached 的对象要实现 java 的序列化接口 
大家也知道,java 本身的序列化性能也很一般。 
我将其简单扩展了一下,不再依赖 spring ,并且利用 javolution 实现序列化,缓存的对象不再有限制。 
暂时没有发现 redis 的实现,后面将自己实现使用 redis 存储并且序列化使用 kyro ,详细情况有时间再单独写出来。 


2、使用 tomcat session manager 方法存储 
这种方法服务器只能使用 tomcat ,但网上有针对 memcached 和 redis 实现,直接配置就行了。 
memcached 实现: 
网址:http://code.google.com/p/memcached-session-manager/ 
修改 tomcat 的 conf 目录下的 context.xml 文件: 
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"    
  memcachedNodes="n1:localhost:11211 n2:localhost:11212"    
  failoverNodes="n2"    
  requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"    
  sessionBackupAsync="false"    
  sessionBackupTimeout="100"    
  transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"    
  copyCollectionsForSerialization="false"    /> 

以上是以 1.3 版为例子,需要用的 jar 包: 
memcached-session-manager-1.3.0.jar 
msm-javolution-serializer-1.3.0.jar 
javolution-5.4.3.1.jar 
memcached-2.4.2.jar 

redis 实现: 
网址:https://github.com/jcoleman/tomcat-redis-session-manager 
同样修改 tomcat 的 conf 目录下的 context.xml 文件: 
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /> 
<Manager className="com.radiadesign.catalina.session.RedisSessionManager" 
         host="localhost" 
         port="6379" 
         database="0" 
         maxInactiveInterval="60"/> 
以上是以 1.2 版为例子,需要用的 jar 包: 
tomcat-redis-session-manager-1.2-tomcat-6.jar 
jedis-2.1.0.jar 
commons-pool-1.6.jar 


3、使用 terracotta 服务器共享 
这种方式配置有点复杂,大家到网上搜索一下吧。 

以上配置成功后,前端使用 nginx 进行负载均衡就行了,同时使用 Gzip 压缩 和 静态文件缓存。

 

以下是实例:

一、nginx+tomcat+memcached  (依赖包下载)

1.memcached配置:(v1.4.13)

节点1(192.168.159.131:11444)

节点2(192.168.159.131:11333)

2.tomcat配置

tomcat1(192.168.159.128:8081)

tomcat2(192.168.159.128:8082)

3.nginx安装在192.168.159.131。

       首先,是配置tomcat,使其将session保存到memcached上。有两种方法:

方法一:在server.xml中配置。

找到host节点,加入

Html代码   收藏代码
  1. <Context docBase="/var/www/html" path="">   
  2.     <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"   
  3.             memcachedNodes="n1:192.168.159.131:11444 n2:192.168.159.131:11333"   
  4.             requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"   
  5.             sessionBackupAsync="false" sessionBackupTimeout="3000"   
  6.             transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"   
  7.             copyCollectionsForSerialization="false" />  
  8. </Context>  

方法二:在context.xml中配置。

找到Context节点,加入

Html代码   收藏代码
  1. <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"   
  2.         memcachedNodes="n1:192.168.159.131:11444"   
  3.         requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"   
  4.         sessionBackupAsync="false" sessionBackupTimeout="3000"   
  5.         transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"   
  6.         copyCollectionsForSerialization="false" />  

       其次,配置nginx,用于测试session保持共享。

Html代码   收藏代码
  1. upstream  xxy.com  {  
  2.       server   192.168.159.128:8081 ;  
  3.       server   192.168.159.128:8082 ;  
  4. }  
  5.   
  6. log_format  www_xy_com  '$remote_addr - $remote_user [$time_local] $request '  
  7.                '"$status" $body_bytes_sent "$http_referer"'   
  8.                '"$http_user_agent" "$http_x_forwarded_for"';  
  9.   
  10. server  
  11. {  
  12.       listen  80;  
  13.       server_name  xxy.com;  
  14.   
  15.       location / {  
  16.                proxy_pass        http://xxy.com;  
  17.                proxy_set_header   Host             $host;  
  18.                proxy_set_header   X-Real-IP        $remote_addr;  
  19.                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;  
  20.       }  
  21.   
  22.       access_log  /data/base_files/logs/www.xy.log  www_xy_com;  
  23. }  

最后,将你的应用放到两个tomcat中,并依次启动memcached、tomcat、nginx。访问你的nginx,可以发现两个tomcat中的session可以保持共享了。

二、nginx+tomcat+redis   (依赖包下载)

1.redis配置(192.168.159.131:16300)(v2.8.3)

2.tomcat配置

tomcat1(192.168.159.130:8081)

tomcat2(192.168.159.130:8082)

3.nginx安装在192.168.159.131。

       首先,是配置tomcat,使其将session保存到redis上。有两种方法,也是在server.xml或context.xml中配置,不同的是memcached只需要添加一个manager标签,而redis需要增加的内容如下:(注意:valve标签一定要在manager前面。)

Html代码   收藏代码
  1. <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />  
  2. <Manager className="com.radiadesign.catalina.session.RedisSessionManager"  
  3.          host="192.168.159.131"  
  4.          port="16300"   
  5.          database="0"   
  6.          maxInactiveInterval="60"/>  

其次,配置nginx,用于测试session保持共享。

Html代码   收藏代码
  1. upstream  redis.xxy.com  {  
  2.       server   192.168.159.130:8081;  
  3.       server   192.168.159.130:8082;  
  4. }  
  5.   
  6. log_format  www_xy_com  '$remote_addr - $remote_user [$time_local] $request '  
  7.                '"$status" $body_bytes_sent "$http_referer"'   
  8.                '"$http_user_agent" "$http_x_forwarded_for"';  
  9.   
  10. server  
  11. {  
  12.       listen  80;  
  13.       server_name redis.xxy.com;   
  14.   
  15.       location / {  
  16.                proxy_pass        http://redis.xxy.com;  
  17.                proxy_set_header   Host             $host;  
  18.                proxy_set_header   X-Real-IP        $remote_addr;  
  19.                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;  
  20.       }  
  21.   
  22.       access_log  /data/base_files/logs/redis.xxy.log  www_xy_com;  
  23. }  

最后,将你的应用放到两个tomcat中,并依次启动redis、tomcat、nginx。访问你的nginx,可以发现两个tomcat中的session可以保持共享了。

上面文章中,有一点需要说明的是:

如果tomcat配置中,将manager放在server.xml中,那么使用maven做热部署时,会发生失败。所以,推荐放在context.xml中。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
应用服务中间件 容器
Tomcat的Session过期处理策略
Tomcat的Session过期处理策略
55 0
|
5月前
|
应用服务中间件 容器
Tomcat设置session超时的几种方式
Tomcat设置session超时的几种方式
134 0
|
8月前
|
域名解析 运维 负载均衡
【运维知识进阶篇】Tomcat集群实战之部署zrlog博客(Tomcat服务安装+静态资源挂载NFS+Nginx负载均衡+HTTPS证书+Redis会话保持)
【运维知识进阶篇】Tomcat集群实战之部署zrlog博客(Tomcat服务安装+静态资源挂载NFS+Nginx负载均衡+HTTPS证书+Redis会话保持)
251 1
|
10月前
|
负载均衡 NoSQL Java
基于redis 的tomcat session 同步
这里我把Redis放在/XX/下,所以在该目录下执行下列命令: $ wget http://download.redis.io/releases/redis-3.2.1.tar.gz $ tar xzf redis-3.2.1.tar.gz $ cd redis-3.2.1 $ make
114 0
|
11月前
|
负载均衡 Java 应用服务中间件
tomcat集群下的session共享和负载均衡(memcache实现)
tomcat集群下的session共享和负载均衡(memcache实现)
|
11月前
|
负载均衡 NoSQL Java
tomcat集群下的session共享和负载均衡(redis实现)
tomcat集群下的session共享和负载均衡(redis实现)
210 0
|
11月前
|
NoSQL Java 应用服务中间件
tomcat集群使用redis实现session共享
tomcat集群使用redis实现session共享
231 0
|
1月前
|
XML 应用服务中间件 Apache
Tomcat AJP连接器配置secretRequired=“true“,但是属性secret确实空或者空字符串,这样的组合是无效的。
Tomcat AJP连接器配置secretRequired=“true“,但是属性secret确实空或者空字符串,这样的组合是无效的。
|
10天前
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置
|
4月前
|
Java 应用服务中间件 容器
SpringBoot配置外部Tomcat并打war包
SpringBoot配置外部Tomcat并打war包
68 0