Tomcat8+Redis集群解决会话共享
瞎 扯
磕磕碰碰一天,百度了好几篇,终于搞定了Session共享的问题。以前只是听说将Session存入第三方来解决Session共享问题,可一直没有亲自动手实现过,还记得以前面试时被一道怎么用Redis解决Session共享问题给怼得老惨,现在再问到,虽然可能还是会被怼,但多多少少能说上几句了。此文纯粹是记录我这一天解决这问题的过程,要想面试打败面试官,多去找找其他博文。
问题起源:服务器端Tomcat集群,负载策略采用的Ip-Hash方式,不存在Session共享问题,后因Jmeter压测,在无权更改测试机为多IP模拟IP欺骗的情况下,将负载策略更改为轮询方式,然后,就有活干了。
参 考 致 谢
负载策略可参考:https://blog.csdn.net/qq_35119422/article/details/81505732
需要用到Redis Session Manager for Apache Tomcat项目,https://github.com/jcoleman/tomcat-redis-session-manager ,但是官方说的了,暂时不支持tomcat8,上Github上逛了一圈,无私奉献的大神挺多的,因为我项目用到的是tomcat8.5,找了好几个才找到个简单可用的(没有试是否支持其他版本)。
源码我用的这哥们的:https://github.com/cc-chen/tomcat8.5-redis-session-manager.git,万分感谢!
下 载 配 置
省事的朋友们,可跳过源码,所需jar包我打好了,需要的自行下载:
下载地址:https://pan.baidu.com/s/1DuY-S9GHCgvWmTn1DvvvOg
提取码:cg6g
解压后为这三个jar包,
jedis-2.5.2.jar,
commons-pool2-2.2.jar
tomcat8.5-redis-session-manager.jar
将这三个包放在tomcat的lib目录下,然后修改config目录下context.xml文件,新增如下配置(大多数博主通用配置):
<Valve className="com.s.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.s.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
password="123456"
maxInactiveInterval="60" />
参数说明:
通用配置
className:tomcat8.5-redis-session-manager.jar中类全路径,有木有发现,与网上其他大多数博客写的名称不一样,是因为该jar包有修改原官网项目包名。
host:redis master Ip地址
port:redis master 端口
password:redis密码
database:数据库下标(redis默认从0到15 16个分区)
maxInactiveInterval:session超时时间,单位min(测试无效,该怎么设置和失效原因后续会说明)
测试方法:
默认Redis主从集群已经配置好,测试结果如下,(由于是本地,所以Tomcat,Redis均为伪集群,也就是IP一样端口不一样)
在各个tomcat/webapp/ROOT 目录下的jsp页面合适位置加上IP:Port-Session Id : <%= request.getSession().getId() %>(我选择的第51行),启动tomcat8086,8087,tomcat启动前保证Redis主从集群运行正常,否则tomcat启动会报错,启动成功后,访问tomcat主页,在同一浏览器输入:127.0.0.1:8086,127.0.0.1:8087,查看页面的sessionId以及reids中sessionId,如果如图所示,恭喜你,成功一半了:
如果redis中存上了sessionId,且两个tocat服务sessionId一样,重复刷新,sessionId不变,验证成功。
然后删除Redis中的sessionId,再次刷新。
此时sessionId变了,但是两个服务的sessionId仍然一样,验证成功。
大多数博客到这就完了,但真的成功了么?NO!
哨兵集群配置
上面配置是大多数博客都写到的配置,不知道大家发现个问题没,上面host配置只有一个地址,既主节点地址。当redis为单机时,或者集群模式为主从模式时,这样配置才好使,因为我们只需配置主节点连接信息就可以了,但主节点宕了,不就崩了么?现在大多数用到redis的服务,为保证其高可用,几乎都会选择哨兵模式或者Redis-Cluster模式吧。那么问题来了,当主节点宕了后,当其他从节点升级为主节点后,节点连接信息变了,那上面的配置是不是得改了?
不用惊讶,因为当初找到的几篇博客都大同小异,没有提到这种场景,官网看了下,奈何全是英文,就自个研究了下源码,这就是传说中的自己坑自己吧!后来也有看到别的博文介绍哨兵集群时tomcat conf.xml的配置,去官网上也看到了相关的配置说明。不过我弄的时候没看到啊,晕!塞翁失马焉知非福,虽然也不知道研究了下源码得到了啥收获。。。。
要了解多个的配置,首先看看源码中怎么读取单个host,port等配置参数的,找找看:
719行,新建JedislPool用到了咱们配置文件里的参数,看看else另一个条件,那个sentinel单词不就是哨兵么,看看里面相关的sentinelMaster,sentinelSet的get、set方法,
sentinelMaster需要传个master,sentinelSet需要传个sentinels,顾名思义,master是主节点名称,sentinels是各个节点的连接信息,抱着试一试的态度,在context.xml配置文件中又加上俩参数。
同样:这里默认Redis集群模式已经更改为哨兵模式且正常运行(Redis哨兵集群这里就不赘述了)。
sentinelMaster="mymaster"
sentinels="127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381"
新增参数说明:
sentinelMaster:master名称
sentinels:哨兵集群时地址配置,IP:port,用英文逗号隔开
然后重启tomcat集群,接下来继续验证:验证方式和上面一样,当上面两个步骤验证完后,将当前主节点手动关掉,然后再次刷新浏览器验证,发现sessionId依然有效,至此,已经成功百分之九十了。
过期时间
剩下的百分之十,就是session过期的问题了。在启动tomcat时,会有个警告
说明那个maxInactiveInterval参数配置有点问题。出问题了,那就源码里看看啥情况,找到源码中设置session超时时间的地方,在RedisSessionManager类中,377和545行还有632行,这个时间值都用到的getMaxInactiveInterval()方法,如下
再看看getMaxInactiveInterval()方法
看到这儿似乎明白了,本项目中并不是根据我们的配置文件中参数赋值,这个时间设置的值取的是Tomcat容器的session-timeout 节点(单位min),更改tomcat conf/web.xml配置,约595行
<session-config>
<session-timeout>10</session-timeout>
</session-config>
去掉配置文件中的maxInactiveInterval参数,更改web.xml 中session-timeout时间为2分钟,重启Tomcat测试session失效场景,验证成功,至此Tomcat8.5集成Redis 解决Session会话共享问题算是大功告成!
谨记,官方文档很重要!很重要!很重要!仔细看看会少走很多弯路!
以上内容均为个人对别人成果的学习和总结,有理解不到位的地方,还请各路大神指点!
原创不易,看了觉得有帮助的朋友们,记得点个赞哟,谢谢!
Tomcat8+Redis集群解决会话共享相关推荐
- linux redis-trib.rb,linux 关于redis-trib.rb构建redis集群
之前搭建集群漏下的坑, 今次再搭一次. 环境 ruby环境 yum install ruby rubygems -y redis的gem环境 gem install redis-3.2.2.gem 部 ...
- Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享
转载自 Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 一.Session共享使用tomcat-cluster-redis-session-mana ...
- 集群空间服务器接收不到消息,解决Redis集群条件下键空间通知服务器接收不到消息的问题...
解决Redis集群条件下键空间通知服务器接收不到消息的问题 键空间通知介绍 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件. 可以通过对redis的 ...
- Redis集群配置和常见异常解决
Redis集群配置和常见异常解决 参考文章: (1)Redis集群配置和常见异常解决 (2)https://www.cnblogs.com/hzb462606/p/11121281.html 备忘一下 ...
- redis集群报Jedis does not support password protected Redis Cluster configurations异常解决办法...
解决spring-data-redis操作redis集群报"Jedis does not support password protected Redis Cluster configura ...
- php 集群 session共享,Session共享:php和redis集群如何实现Session共享
本篇文章给大家带来的内容是关于Session共享:php和redis集群如何实现Session共享,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.redis 数据库集群安装软件版 ...
- redis集群如何解决重启不了的问题
redis集群如何解决重启不了的问题 参考文章: (1)redis集群如何解决重启不了的问题 (2)https://www.cnblogs.com/zt007/p/8119511.html (3)ht ...
- Redis集群Hash槽分配异常 CLUSTERDOWN Hash slot not served的解决方式
在搭建Redis5.x版本的集群环境出现各节点无法互相发现与Hash槽分配异常 CLUSTERDOWN Hash slot not served的情况 在Linux同一台服务器下搭建伪集群-- 127 ...
- 代码操作redis集群报错:(error) MOVED 解决方法
记录一下今天搭建完本地redis集群以后,使用C++代码测试redis集群搭建是否成功. 在初始化.链接等一系列成功后,我开开心心进行写操作: 这时候报错: Run 382 Redis Set Err ...
- redis集群报错:(error) MOVED 解决方法
在使用 redis-cli 连接 redis 集群,进行数据操作时,有报错 ./redis-cli -h 192.24.54.1 -p 6379 -a '123456' 192.24.54.1:637 ...
最新文章
- 关于Aptana studio工具
- Photometric Stereo 初體驗
- Metasploit设置HttpTrace参数技巧
- boost::basic_thread_pool相关的测试程序
- [学习笔记]多项式指数函数
- python 解压zip文件_Python 解压缩文件详解
- MyBatis 为什么需要通用 Mapper ? 1
- 山师计算机学硕分数线,2020山东师范大学考研复试分数线已公布
- kingcms的标签
- Linux中查看bz2压缩文件大小,Linux bz2文件解压与压缩之bzip2命令
- python 调用bat失败_死机、卡顿、蓝屏,Python部门的老江湖告诉我的一些超级变态代码...
- bulk interface驱动_USB驱动程序(较详细)一
- 菜鸟教程笔记:TypeScript
- 笔记本电脑频繁自动重启_电脑老是自动重启,电脑总是自动重启 - 电脑经常自动重启的解决办法 - 安全专题...
- C 语言基础-什么是常量、变量?
- 2021年边缘计算融资汇总
- html5卡片平行视差效果,HTML5/jQuery很棒的交互式平行视差皓月当空场景动画
- 如何安装旧的nvidia显卡驱动程序
- html语言中vlink,html中link text指的是什么?
- java的初始化和赋值的区别_Java的赋值与初始化
热门文章
- 定制合成:热激发延迟荧光材料PPZ-3TPT、PPZ-4TPT、PPZ-DPS或PXZ-DPS、DMAC-DPS
- CSP小白起步-20131201
- 2020身高体重标准表儿童_2020最新宝宝身高体重标准表(中国标准版)
- android apk 微信登入_图文详解Android集成微信登录的步骤
- 法大大连续两年中国电子签名市场份额第一
- 某乎x-zse-96、x-zst-81最新通杀方案
- 公关,从讲好一个故事开始
- 有限元方法之三角形元任意阶的Lagrange型形状函数
- 属于计算机与网络技术在医学中应用的是,计算机网络技术在医学论文写作与投稿中的应用...
- 什么是Microsoft 365?