分布式集群环境下Session共享的简单解决方案
来源:互联网 发布:马里亚纳网络性奴 编辑:程序博客网 时间:2024/06/05 16:20
关于Cookie和Session的功能与工作原理,在这里我就不再叙述了,大家想要了解可以看一下我的上一篇博客,讲的还是很细致的。
但是之前讲的Session是运行在一台服务器上的,所有的访问都会到达我们的唯一服务器上,这样我们可以根据客户端传来的sessionID,来获取session,或在对应Session不存在的情况下(session 生命周期到了/用户第一次登录),创建一个新的Session;但是,如果我们在集群环境下,假设我们有两台服务器A,B,用户的请求会由Nginx服务器进行转发(别的方案也是同理),用户登录时,Nginx将请求转发至服务器A上,A创建了新的session,并将SessionID返回给客户端,用户在浏览其他页面时,客户端验证登录状态,Nginx将请求转发至服务器B,由于B上并没有对应客户端发来sessionId的session,所以会重新创建一个新的session,并且再将这个新的sessionID返回给客户端,这样,我们可以想象一下,用户每一次操作都有1/2的概率进行再次的登录,这样不仅对用户体验特别差,还会让服务器上的session激增,加大服务器的运行压力。
为了解决集群环境下的seesion共享问题,共有4种解决方案:
1.粘性session
粘性session是指Ngnix每次都将同一用户的所有请求转发至同一台服务器上,即将用户与服务器绑定。
2.服务器session复制
即每次session发生变化时,创建或者修改,就广播给所有集群中的服务器,使所有的服务器上的session相同。
3.session共享
缓存session,使用redis, memcached。
4.session持久化
将session存储至数据库中,像操作数据一样才做session。
其实,最简单的两种方案,就是方案一和方案三,都不需要对session进行任何操作,只需要将Nginx和Tomcat上的配置文件修改一下即可。由于我们做集群,访问量一定是比较大的了,对于第一种方案,如果某台服务器发生故障,此服务器上的所有用户的session都会丢失,所以今天我们采用第三种解决方案。
感谢开源项目tomcat-redis-session-manager,感谢项目的发起者jcoleman。
此方案最简单之处就在于我们无需修改项目,只需要修改Tomcat的context.xml配置文件即可,并且,redis服务器同样可以做分布式。
接下来,我们来讲解一下如何配置tomcat,首先,讲解一下注意事项,因为项目的原因,并没能用maven来管理依赖的包,而在我配置的时候,很正常的发生了包版本间的冲突,从redis中取出的序列化后的session无法转换为HttpSession,所以,大家做的时候一定要注意版本间的兼容问题。
把我使用的版本给大家做个参考吧,tomcat-redis-session-manager-1.1.jar,jedis-2.1.0.jar,commons-pool-1.6.jar
这三个包需放入 tomcat的安装目录下的lib文件夹下,IDE自带的tomcat可以在配置中查看。
需注意的是,当redis的版本‘过高’时,需要依赖commons-pool2.jar,(具体版本不写)。
接下来,我们就讲一下最核心的配置,配置context.xml文件(文件路径workspace\.metadata\.me_tcat7\conf,此处仅是myeclipse编辑器的路径)
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /> <Manager className="com.radiadesign.catalina.session.RedisSessionManager" host="127.0.0.1" port="9313" database="0" maxInactiveInterval="60"/>这个里的class路径具体看tomcat-redis-session-manager里的路径。
可能你会遇到重启tomcat配置文件会被还原的问题,那么你还需要修改另一处的context.xml文件,workspace\Servers\MyEclipse Tomcat v7.0-config文件夹中的,修改内容同上。
接下来,给大家看一下配置完成后的结果:
图1为监听到的redis服务器的状态,可以看到我们将session序列化后以sessionID为key存入了redis中,图2可以看到是客户端header中的cookie信息(若有疑问可以查看我上一篇的博客),图三是我在redis客户端get key为sessionID的记录,可以验证成功,我们配置是成功了的,因为使用的自己的电脑,配置有限,并没有开几个tomcat来测试,不过上述还是很有说服力的(线上已经测试过了)。
希望对你有帮助!
- 分布式集群环境下Session共享的简单解决方案
- spring session,集群环境下的session共享解决方案
- 分布式集群系统下的高可用session解决方案—Session共享
- 集群下session共享问题的解决方案.
- Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享
- Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享
- Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享
- Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享
- mina —— 分布式集群下长连接session共享的解决方案
- 分布式集群Session共享 简单多tomcat8+redis的session共享实现
- 分布式集群Session共享 简单多tomcat8+redis的session共享实现
- 分布式集群Session共享 简单多tomcat8+redis的session共享实现
- 分布式集群Session共享 简单多tomcat8+redis的session共享实现
- 分布式集群Session共享 简单多tomcat8+redis的session共享实现
- 【转】分布式集群系统下的高可用session解决方案
- 分布式集群系统下的高可用session解决方案
- 分布式集群系统下的高可用session解决方案
- 分布式集群系统下的高可用session解决方案
- 尺取法
- java NIO之buffer
- 面试经验总结
- java 字符输入流,字符输出流,字符缓冲流
- 液晶知识 占空比(Duty)定义 偏压比(Bias)定义 及两者之间 kinglcm88|创建时间:2016年05月19日 11:53|浏览:525|评论:0 标签:液晶 占空比 Duty 偏压
- 分布式集群环境下Session共享的简单解决方案
- BackTrack5 学习笔记2 常用工具
- 学习shiro框架
- ubuntu16.04 安装mysql5.7
- HDU 5889 最短路 网络流
- 圆的反演变换(*)
- 网易题目:集合+
- 实验吧三道sql注入题目解题思路以及当中至少点整理(简单的SQL注入、简单的SQL注入2、简单的SQL注入)
- 区间查询+位运算