Tomcat7集群共享Session 基于redis进行统一管理

标签: tomcat7 集群 共享 | 发表时间:2015-10-15 09:34 | 作者:jaychang
出处:http://www.iteye.com

背景:

      很多时候,生产环境,需要多个tomcat协作,那么session的统一管理是一个首先需要解决的问题。session的统一管理有很多解决方案,比如存储至数据库、memcache、redis。那么我想给大家介绍的是将session存储至redis这个方案。

       先要感谢开源项目 tomcat-redis-session-manager,感谢作者

 

实验环境:

操作系统:windows 7 64位

Redis版本:Redis 2.8.2101(Redis安装方法这里不介绍了,请自行Google、Baidu)

Tomcat版本:tomcat7.0.64(2个tomcat实例,注意同一台机器上试的话,启动另一个tomcat实例的时候需要修改端口号,如果是不同机器上的tomcat,那就不用修改了)

JDK版本:jdk1.7.0_80(生产环境请使用servre版本)

 

  请求监听端口 Shutdown监听端口 AJP监听端口
tomcat_1 8080 8005 8009
tomcat_2 8090 8015 8019

 

 

 

准备:

tomcat_1端口按照默认配置(不改server.xml)

 

tomcat_2端口改为下面的配置(修改server.xml)

 

<Server port="8015" shutdown="SHUTDOWN">
  <Service name="Catalina">   
    <Connector port="8090" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
....
    <Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />
....
    </Service>
</Server>

 

 tomcat_1,tomcat_2都要修改contenxt.xml

 

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

 

  

 

 

 

下载所需jar包(为了方便大家,我在附件里上传了所有的jar包)

1)redis的java客户端

    https://github.com/xetorthio/jedis

 

2) tomcat-redis-session-manager的jar包,我用的是自己编译的(作者只给了gradle,⊙﹏⊙b汗没有maven的,我把它改成了maven工程的),见附件,源码也给到大家。

 

3) apache-commons-pool2

http://commons.apache.org/proper/commons-pool/download_pool.cgi

 

 

将下载好的jar包,放到tomcat_1\lib及tomcat_2\lib目录下,



 

 

开始实验:

首先开启redis服务 redis-server.exe redis.windows.conf



 

 

开启redis命令行客户端以便监视redis的状态变化,redis-cli -p 6379  monitor(如果有密码则 redis-cli -p 6379 -a mypass monitor)

 

 

 分别通过catalina.bat run 开启tomcat_1,tomcat_2

 

   在命令行终端,看到了如下信息,表明redis的session manager初始化成功

...
十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal
信息: Attached to RedisSessionHandlerValve
十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager initializeSerializer
信息: Attempting to use serializer :com.radiadesign.catalina.session.JavaSerializer
十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal
信息: Will expire sessions after 1800 seconds
十月 15, 2015 4:52:39 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deployment of web application directory E:\WorkFolder\Temp\Redis-Session\apache-tomcat1-8080\webapps\manag
十月 15, 2015 4:52:39 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory E:\WorkFolder\Temp\Redis-Session\apache-tomcat1-8080\webapps\ROOT
十月 15, 2015 4:52:39 下午 org.apache.catalina.startup.TldConfig execute
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a co
十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal
信息: Attached to RedisSessionHandlerValve
十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager initializeSerializer
信息: Attempting to use serializer :com.radiadesign.catalina.session.JavaSerializer
十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal
信息: Will expire sessions after 1800 seconds
...

 

 然后我们分别在tomcat_1/webapp/ROOT,tomcat_2/webapp/ROOT下放setsession.jsp,getsession.jsp

 

setsession.jsp内容:

<%
  session.setAttribute("name","jaychang");
  session.setAttribute("id","1001");
%>

 

getsession.jsp内容:

<%=session.getAttribute("id")%>
ID:<%=session.getAttribute("name")%>
NAME:<%=session.getAttribute("id")%>

 

  好了,至此,你应该也明白了,现在要干嘛了,那么重点来了,见证奇迹的时刻到了!

 

打开浏览器,输入 http://127.0.0.1:8080/setsession.jsp回车




 
D741CDC41F66331883AAB70DC6252046就是SESSIONID

值为

\xac\xed\x00\x05w\b\x00\x00\x01Pj\xc8\xf5\xb2sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01Pj\xc8\xf5\xb2sq\x00~\x00\x00\x00\x00\x01Pj\xc8\xf5\xb2sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexq\x00~\x00\x01\x00\x00\a\bsr\x00\x11java.lang.Boolean\xcd r\x80\xd5\x9c\xfa\xee\x02\x00\x01Z\x00\x05valuexp\x01q\x00~\x00\asq\x00~\x00\x00\x00\x00\x01Pj\xc8\xf5\xb4t\x00 D741CDC41F66331883AAB70DC6252046sq\x00~\x00\x04\x00\x00\x00\x02t\x00\x04namet\x00\bjaychangt\x00\x02idt\x00\x041001

 最后我们看到了...jaychang ...1001

 

好了,那我们再看看getsession.jsp,先看tomcat_1的getsession.jsp




 

看下redis变化,get "D741CDC41F66331883AAB70DC6252046" 


 
 

 再看看tomcat_2的getsession.jsp,页面上获取到了




 
 
再看看redis的变化,又一次get "D741CDC41F66331883AAB70DC6252046"

 

 


 

 

获取的sessionId是同一个,说明成功了

参考:

https://github.com/jcoleman/tomcat-redis-session-manager

 

https://support.pivotal.io/hc/en-us/articles/206085337-How-to-setup-Redis-Session-Manager-on-tcServer-Tomcat

 

http://www.cnblogs.com/lengfo/p/4260363.html

 





已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [tomcat7 集群 共享] 推荐:

Tomcat7集群共享Session 基于redis进行统一管理

- - 行业应用 - ITeye博客
      很多时候,生产环境,需要多个tomcat协作,那么session的统一管理是一个首先需要解决的问题. session的统一管理有很多解决方案,比如存储至数据库、memcache、redis. 那么我想给大家介绍的是将session存储至redis这个方案.        先要感谢开源项目 tomcat-redis-session-manager,感谢作者.

tomcat7之websocket

- - ITeye博客
从tomcat7.0.26之后开始支持websocket,建议大家使用tomcat7.0.30,期间版本的接口有一些改动. chrome默认支持websocket. 其他浏览器可能由于安全原因,默认是关闭的. // 与7.0.27不同的,Tomcat改变了createWebSocketInbound方法的定义,增加了一个HttpServletRequest参数.

tomcat集群(共享session)

- - 研发管理 - ITeye博客
其实就是上述这样的一个架构,下面是原理. 1)  Apache装有一个模块,这个模块叫mod_jk. 2)  Apache通过80端口负责解析任何静态web内容. 3)  任何不能解析的内容,用表达式告诉mod_jk,让mod_jk派发给相关的app server去解释. 通过上述的文字描述我们可以得知:.

集群session共享机制

- - 企业架构 - ITeye博客
        现在集群中使用的Session共享机制有两种,分别是session复制和session粘性.        该种方式下,负载均衡器会根据各个node的状态,把每个request进行分发,使用这样的测试,必须在多个node之间复制用户的session,实时保持整个集群中用户的状态同步.

Tomcat7配置双向SSL

- - CSDN博客推荐文章
//ca-cert.pem即为CA根证书,可将其下发到客户端,导入作为根证书.  如果按请求生成CA证书,由证书申请者生成请求文件certreq.txt. CA端执行签名,生成证书文件1.cer. 4.将证书导出成浏览器支持的.p12格式,密码changeit. 4.将证书导出成浏览器支持的.p12格式 :.

tomcat7特性 serlvet async特性

- - 编程语言 - ITeye博客
每个请求来到Web容器,Web容器会为其分配一个线程来专门负责该请求,直到完成处理前,该执行线程都不会被释放回容器. 执行线程会耗用系统资源,若有些请求需要长时间处理(例如长时间运算、等待某个资源),就会长时间占用执行线程. 若这类的请求很多,许多执行线程都被长时间占用,而在web容器内,可以使用的线程都是有限的,这对于系统就会是个负担,甚至造成应用程式的性能瓶颈.

Nginx+Tomcat+Memcached共享session集群配置

- ENOCH - ITeye论坛最新讨论
2、memcached共享session. 3、tomcat集群配置(3台CentOS 6). (172.18.188.64): 操作系统CentOS 6; 安装nginx、memcached和tomcat 6. (172.18.188.76): 操作系统CentOS 6; 安装tomcat 6. (172.18.188.78): 操作系统CentOS 6; 安装tomcat 6.

(原)CentOS_linux5.5、JDK1.6、tomcat7、nginx、mysql5.1、mongodb安…

- - Linux - 操作系统 - ITeye博客
转: http://blog.sina.com.cn/s/blog_438308750100xsb5.html. # 关闭不需要的服务按上面的安装关闭 ip6tables、jexec、kudzu、lvm2-monitor、mcstrans、netfs、rawdevices、restorecond. 2.禁止Ctrl+Alt+Delete重新启动机器命令.

Tomcat7调优及JVM性能优化for Linux环境

- - 互联网 - ITeye博客
该优化针对Linux X86_X64环境. Tomcat优化其实就是对server.xml优化(开户线程池,调整http connector参数). 搜索【<Executor name="tomcatThreadPool"】,开启并调整为. 搜索【port="8080"】,调整为.

共享成本

- wooden - 不许联想
如果再谈论什么音乐版权,主张听唱片不要听MP3,就会显得有些傻逼了. 之前我只要在博客上说,就会有一帮共享主义的捍卫者跳出来跟我理论. 甚至,IT界的人认为版权的概念该改改了——你直接说不该有版权不就完了,改个毛啊. 怎么改它都是一种权利,除非你消灭这种权利. 但我现在在思考这样一个问题,它是一个哲学问题,不是版权问题.