Tomcat 集群中 实现session 共享的三种方法

news/2024/11/8 13:55:45

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

test url: http://sms.reyo.cn/session.jsp

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节点,加入

<Context docBase="/var/www/html" path=""> 
	<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
	        memcachedNodes="n1:192.168.159.131:11444 n2:192.168.159.131:11333" 
	        requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$" 
	        sessionBackupAsync="false" sessionBackupTimeout="3000" 
	        transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" 
	        copyCollectionsForSerialization="false" />
</Context>

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

找到Context节点,加入

	<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
	        memcachedNodes="n1:192.168.159.131:11444" 
	        requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$" 
	        sessionBackupAsync="false" sessionBackupTimeout="3000" 
	        transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" 
	        copyCollectionsForSerialization="false" />

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

upstream  xxy.com  {
      server   192.168.159.128:8081 ;
      server   192.168.159.128:8082 ;
}

log_format  www_xy_com  '$remote_addr - $remote_user [$time_local] $request '
               '"$status" $body_bytes_sent "$http_referer"' 
               '"$http_user_agent" "$http_x_forwarded_for"';

server
{
      listen  80;
      server_name  xxy.com;

      location / {
               proxy_pass        http://xxy.com;
               proxy_set_header   Host             $host;
               proxy_set_header   X-Real-IP        $remote_addr;
               proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      }

      access_log  /data/base_files/logs/www.xy.log  www_xy_com;
}

最后,将你的应用放到两个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前面。)

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
         host="192.168.159.131"
         port="16300" 
         database="0" 
         maxInactiveInterval="60"/>

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

upstream  redis.xxy.com  {
      server   192.168.159.130:8081;
      server   192.168.159.130:8082;
}

log_format  www_xy_com  '$remote_addr - $remote_user [$time_local] $request '
               '"$status" $body_bytes_sent "$http_referer"' 
               '"$http_user_agent" "$http_x_forwarded_for"';

server
{
      listen  80;
      server_name redis.xxy.com; 

      location / {
               proxy_pass        http://redis.xxy.com;
               proxy_set_header   Host             $host;
               proxy_set_header   X-Real-IP        $remote_addr;
               proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      }

      access_log  /data/base_files/logs/redis.xxy.log  www_xy_com;
}

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

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

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


http://www.niftyadmin.cn/n/1998694.html

相关文章

Scrapy爬虫(5)爬取当当网图书畅销榜

本次将会使用Scrapy来爬取当当网的图书畅销榜&#xff0c;其网页截图如下&#xff1a; 我们的爬虫将会把每本书的排名&#xff0c;书名&#xff0c;作者&#xff0c;出版社&#xff0c;价格以及评论数爬取出来&#xff0c;并保存为csv格式的文件。项目的具体创建就不再多讲&…

一生要珍惜的十种人

1、遇到你真正爱的人时,要努力争取和他相伴一生的机会。因为当他离去时&#xff0c;一切都来不及了。 2、遇到可相信的朋友时,要好好和他相处下去。因为在人的一生中&#xff0c;可遇到知己真的不易。 3、遇到人生中的贵人时,要记得好好感激&#xff0c;因为他是你人生的转折点…

成功者的困境

一位很久不见的老朋友&#xff0c;最近来找我。他是一位非常成功的企业家&#xff0c;公司已经上市很长的时间&#xff0c;股价曾经超过百元&#xff0c;是投资大众追捧的目标。六年前&#xff0c;他意气风发之时&#xff0c;也是我最为困顿的时候。那时&#xff0c;我正被老板…

看看你古时候的社会地位![Z]

把自己的名字   例如&#xff1a;“王二小”“wex”“大理白痴诗人”   附&#xff1a;从姓氏开始找&#xff0c;再往下找名。若是只有两个字的&#xff0c;便从“姓氏”与“结字”中各找一个。 若是三个字的&#xff0c;便先从“姓氏”找起&#xff0c;再往下找两个名…

linux自带mariadb初始密码,Linux之MariaDB基础总结(一)

Linux之MariaDB基础总结(一)一、MariaDB简介MariaDB数据库管理系统是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;被视为开源数据库MySQL的替代品。MariaDB名称来自Michael Widenius的女儿Maria的名字。MariaDB 是一个采用 Maria 存储引擎的MySQL分支版本&…

爸爸的一句话:你能有多少东西沉淀下来

1987年&#xff0c;我大学毕业就进了出版社。开始的两三年&#xff0c;算是混日子&#xff0c;因为工作量太少了&#xff0c;完全缺乏刺激&#xff0c;所以就花了大量的时间去学习太极拳和八卦掌等&#xff0c;因为非常投入&#xff0c;也算小有功底。在练拳上&#xff0c;算是…

稳定的软件

软件的复杂度发展到今天的程度&#xff0c;每个参与软件生产的人对自己产品的质量可能多少都会有些担心。至今还没有理论能够系统的预估和保证软件产品的质量&#xff08;可能永远不会发展出这样的理论&#xff0c;因为软件作为人类思想的固定形式&#xff0c;对其质量的系统化…

Jmeter之乱码 (一)

Jmeter历史版本下载&#xff1a; http://archive.apache.org/dist/jmeter/binaries/ Jmeter3.0接口测试脚本POST请求主体中的中文无法正确显示&#xff0c;现象如下&#xff1a; 解决方案&#xff1a; 修改{JMETER_HOME}\bin\jmeter.properties文件中的默认显示字体&#xff0c…