Tomcat集群实现Session共享
来源:互联网 发布:矩阵乘法怎么算 编辑:程序博客网 时间:2024/06/06 17:29
一、工作中因为要使用到Tomcat集群部署,此时就涉及到了Session共享问题,主要有三种解决方案:
1、使用数据库来存储Session
2、使用Cookie来存储Session
3、使用Redis来存储Sesssion
4、使用Tomcat的session复制
5、使用Memcached来存储Session
二、本文中主要讲一下第3种方案,也就是使用Redis来存储Session,Github中已经有该开源组件(Tomcat-redis-session-manager),下面讲一下配置的步骤:
1、环境准备
Tomcat7 下载地址:http://tomcat.apache.org/download-70.cgi
Tomcat-redis-session-manager 下载地址:http://pan.baidu.com/s/1bokMOVH
本文使用的Nginx来做的Tomcat集群。
Nginx安装参考:Linux Centos 6.5_x86安装Nginx
Redis安装参考:转:Centos6.5_x86安装Redis
2、配置tomcat配置文件context.xml
<!-- host="192.168.159.129" Redis地址 --> <!-- port="6379" Redis端口 --> <!-- password="123456" Redis密码 --> <!-- database="0" 存储Session的Redis库编号 --> <!-- maxInactiveInterval="60" Session失效的间隔(秒) --> <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="192.168.159.129" port="6379" password="123456" database="0" maxInactiveInterval="60" />
注:
1)Manager节点中的className属性为必选项,其它均为可选项
2)maxInactiveInterval设置不生效,暂时找不到原因,在部署中发现Session失效的间隔一直都是读取tomcat/conf/web.xml中的session-config节点中配置的session-timeout属性值,且都是以秒为单位,(这个地方maxInactiveInterval好像不起作用,和web.xml中配置的session-config优先级有关?)
3、添加Tomcat-redis-session-manager的jar包到tomcat/lib目录下,需要的jar包如下:
commons-pool2-2.2.jar
jedis-2.5.2.jar
tomcat-redis-session-manage-tomcat7.jar
3、在nginx中配置负载均衡,配置文件为nginx.conf
http { upstream myServer { server 192.168.1.2:8080; server 192.168.1.3:8080; } server { listen 80; server_name localhost; location / { proxy_pass http://myServer; } } }
配置完后,访问localhost的请求都将被转发到192.168.1.2:8080以及192.168.1.3:8080中去,可以在Jsp页面中打印一下Session Id验证一下:
Session Id : <%= request.getSession().getId() %>
如果在同一个浏览器页面上不断刷新访问,SessionId的值不变化的话,说明配置正确,此时获取的是同一个Session对象。
也可以通过redis客户端连接到Redis库中直接查看:查看会显示有 “56E2FAE376A47F1C0961D722326B8423” key的 session 数据,value为序列化数据。
注:
1)GitHub中该开源组件(Tomcat-redis-session-manager)的主页:https://github.com/jcoleman/tomcat-redis-session-manager
2)该组件目前不支持Tomcat8,我用的是Tomcat 7.0.68版本
3)在程序中将对象放到Redis里时,该对象必须实现java.io.Serializable接口,否则将报错,如果对象中有其它对象的引用,该引用对象也需实现java.io.Serializable接口,所以在使用request.getSession().setAttribute()方法时,一定要注意一下这一个细节。
4)因为要把Tomcat-redis-session-manager的jar包放到Tomcat/lib中,对Tomcat的部署造成了侵入,可以使用Spring Session来替代,spring-session使用拦截器重新包装了request从而替换session实现
5)因为所有集群的Tomcat中配置的Redis地址是一个,如果Redis崩溃了,那么Session就不可用了,所以需要部署Redis集群,实现故障自动切换,高可用的目标。
keepalived+redis 高可用redis主从解决方案
文章参考自:
1.https://my.oschina.net/kolbe/blog/618167
2.http://www.cnblogs.com/lengfo/p/4260363.html
- [Session共享]Tomcat集群实现Session共享
- Tomcat集群实现Session共享
- Memcache 实现tomcat集群session共享
- tomcat集群添加msm实现session共享
- 基于Nginx+Tomcat集群实现Session共享
- memcached实现集群tomcat的session共享
- memcached实现tomcat集群的session共享
- Memcached_Session_Manager(msm)实现tomcat集群session共享
- tomcat集群中实现Session共享
- 使用Memcached实现Tomcat集群Session共享
- tomcat集群多节点实现session共享
- redis实现tomcat集群session共享
- redis集群 实现 tomcat session 共享
- tomcat集群session共享
- tomcat集群session共享
- tomcat集群session共享
- tomcat集群session共享
- tomcat集群 session共享
- 88. Merge Sorted Array 合并有序数组
- 2017传智播客python基础班+就业班
- ubuntu 下出现E: Sub-process /usr/bin/dpkg returned an error code
- 【Scikit-Learn 中文文档】内核近似
- 使用Python和xlwt向Excel文件中写入中文
- Tomcat集群实现Session共享
- 'parent.relativePath' of POM spring.boot.core:
- 机器人控制算法
- Ethereum JSON-RPC
- java json
- 记一次java程序CPU占用过高问题排查
- 【Scikit-Learn 中文文档】成对的矩阵, 类别和核函数
- Android性能优化-过度绘制解决方案
- 良心推荐:Android Studio和IDEA中一个很有用的内存调试插件