设为首页 收藏本站
查看: 1039|回复: 0

[经验分享] Tomcat7集群共享Session 基于redis进行统一管理

[复制链接]

尚未签到

发表于 2016-12-20 10:54:33 | 显示全部楼层 |阅读模式
背景:

      很多时候,生产环境,需要多个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版本)
 
DSC0000.jpg

 请求监听端口Shutdown监听端口AJP监听端口
tomcat_1808080058009
tomcat_2809080158019

 
 
 

准备:
  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目录下,  
DSC0001.jpg
 

 

开始实验:
  首先开启redis服务 redis-server.exe redis.windows.conf
  
DSC0002.jpg
 

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

 
DSC0003.jpg
 


 分别通过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回车
  

DSC0004.jpg
 
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
  

DSC0005.jpg
 


  看下redis变化,get "D741CDC41F66331883AAB70DC6252046" 
   DSC0006.jpg
 
 

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

DSC0007.jpg
 
 
再看看redis的变化,又一次get "D741CDC41F66331883AAB70DC6252046"
   
 
DSC0008.jpg
 

 

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

待解决的问题:

java.lang.IllegalStateException: Race condition encountered: attempted to load session[32405E7F668A227E154AC6FF5E4A4F6A] which has been created but not yet serialized.
at com.radiadesign.catalina.session.RedisSessionManager.loadSessionFromRedis(RedisSessionManager.java:389)
at com.radiadesign.catalina.session.RedisSessionManager.findSession(RedisSessionManager.java:315)
at org.apache.catalina.connector.Request.isRequestedSessionIdValid(Request.java:2460)
at org.apache.catalina.connector.CoyoteAdapter.parseSessionCookiesId(CoyoteAdapter.java:1067)
at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:754)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:418)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
  见:https://github.com/janrain/tomcat-redis-session-manager/blob/master/README.markdown  Possible Issues

参考:

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
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-316905-1-1.html 上篇帖子: redis介绍:安装配置,客户端指令,客户端API 下篇帖子: 美团在Redis上踩过的一些坑-目录(本人非美团)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表