可扩容分布式session方案
分布式session有以下几种方案:
1. 基于nfs(net filesystem)的session共享
将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器io限制,不能满足高并发。
2. 基于关系数据库的session共享
这种方案普遍使用。使用关系数据库存储session数据,对于mysql数据库,建议使用heap引擎。 这种方案性能取决于数据库的性能,在高并发下容易造成表锁(虽然可以采用行锁的存储引擎,性能会下降),并且需要自己实现session过期淘汰机制。
3. 基于cookie的session共享
这种方案也在大型互联网中普遍使用,将用户的session加密序列化后以cookie的方式保存在网站根域名下(比如taobao.com),当 用户访问所有二级域名站点式,浏览器会传递所有匹配的根域名的cookie信息,这样实现了用户cookie化session的多服务共享。 此方案能够节省大量服务器资源,缺点是存储的信息长度受到http协议限制;cookie的信息还需要做加密解密; 请求任何资源时都会将cookie附加到http头上传到服务器,占用了一定带宽。
4. 基于resin/tomcat/iis等web容器的session机制
利用容器机制,通过配置即可实现。
5. 基于zookeeper的分布session存储
详见http://my.oschina.net/u/699015/blog/159654
6. 基于redis/memcached的session共享存储
这些key/value非关系存储有较高的性能,轻松达到2000左右的qps,内置的过期机制正好满足session的自动实效特性。
以上方案各有优缺点,本文主要介绍第六种基于redis存储session时,如何实现动态扩容。 redis目前并没有内置高可用集群,很多客户端代理基于一致性hash算法能够实现分布式存储,但是扩容并不方便(需要成倍扩容),目前我们采用了淘宝 fourinone中session方案的思想:
a. 用于存储session的redis集群有多个redis节点
b. proxy记录了每个节点加入到集群的时间,并按照时间顺序对节点进行了编号(0—n)
c. session key的生成算法方面,需要在session key中包含生成时的当前日期(可考虑细化到小时还是分秒),在session key生成后,再进行取模运算 hash(sesionKey)%redisHost_count, 根据取模结果决定当前session值存储到落到哪个节点上存储。
d. 再通过sessionkey获取session信息时,根据当前sessionKey取出时间部分,再根据取出的时间与redis集群中所有的节点的添加 时间进行比较,筛选出所有addtime<sessionkey_time的节点,再进行c中的取模计算,由于即使这期间进行了扩容,由于进行了时 间匹配,redisHost_count也不会发生变化,所以取模结果和存储此session时一样,还会落到当时存储这个session的节点上,在那 个节点能够得到此session的值。

但是对于这种部署结果如何能够保障高可用性,如何应对单点故障,后续会在redis高可用方案中介绍。
可扩容分布式session方案的更多相关文章
- [Node.js] Node + Redis 实现分布式Session方案
原文地址: http://www.moye.me/?p=565 Session是什么? Session 是面向连接的状态信息,是对 Http 无状态协议的补充. Session 怎么工作? Sessi ...
- Node + Redis 实现分布式Session方案(转载)
Session是什么? Session 是面向连接的状态信息,是对 Http 无状态协议的补充. Session 怎么工作? Session 数据保留在服务端,而为了标识具体 Session 信息指向 ...
- 高并发秒杀系统方案(分布式session)
编程要有一个习惯:做参数校验 所谓的分布式session:就是用redis统一管理session. 我们这里的思路是:把token写入cookie中,客户端在随后的访问中携带cookie,服务端就能根 ...
- 搞懂分布式技术11:分布式session解决方案与一致性hash
搞懂分布式技术11:分布式session解决方案与一致性hash session一致性架构设计实践 原创: 58沈剑 架构师之路 2017-05-18 一.缘起 什么是session? 服务器为每个用 ...
- 分布式session的实现
一.分布式Session的几种实现方式 1.基于数据库的Session共享 2.基于NFS共享文件系统3.基于memcached 的session,如何保证 memcached 本身的高可用性?4. ...
- 微服务架构下分布式Session管理
转载本文需注明出处:EAII企业架构创新研究院(微信号:eaworld),违者必究.如需加入微信群参与微课堂.架构设计与讨论直播请直接回复此公众号:“加群 姓名 公司 职位 微信号”. 一.应用架构变 ...
- ASP.NET性能优化之分布式Session
如果我们正在使用Session,那么构建高性能可扩展的ASP.NET网站,就必须解决分布式Session的架构,因为单服务器的SESSION处理能力会很快出现性能瓶颈,这类问题也被称之为Session ...
- 分布式Session共享(二):tomcat+memcached实现session共享
一.前言 本文主要测试memcached实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port To ...
- springboot集成redis(mybatis、分布式session)
安装Redis请参考:<CentOS快速安装Redis> 一.springboot集成redis并实现DB与缓存同步 1.添加redis及数据库相关依赖(pom.xml) <depe ...
随机推荐
- nodejs持续学习--必须关注4网站
1.官网:https://nodejs.org/en/ 2.模块社区:www.npmjs.com(FQ) 3.github.com 4.全球技术问题讨论社区 http://stackoverflow. ...
- persistence.xml文件的妙处
在上家公司,经常要做的一个很麻烦的事就是写sql脚本, 修改了表结构,比如增加一个新字段的时候,都必须要写sql并放入指定目录中, 目的就是为了便于当我们把代码迁移到其他数据库中的时候,再来执行这些s ...
- 20个高级Java面试题汇总
程序员面试指南:https://www.youtube.com/watch?v=0xcgzUdTO5MJava面试问题集合指南:https://www.youtube.com/watch?v=GnR4 ...
- encodeURIComponent()中文乱码
可能是Tomcat的编码格式问题 应该在8080端口下设置 <Connector port="8080" protocol="HTTP/1.1" co ...
- 2016 ACM/ICPC Asia Regional Dalian Online 1008 Function 二分+RMQ
Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...
- xsl-mode属性用法
本文出自 “熔 岩” 博客,出处http://lavasoft.blog.51cto.com/62575/60517 对某一个元素做多次处理,那么选择<xsl:apply-template元素处 ...
- JDBC
<java连接数据库> Class.forName("com.mysql.jdbc.Driver")--1:加载驱动 Connection conn=DriverMan ...
- PHP 分页函数
如果如下:
- css 简析folat
1.float?? 不知道大家是否还记得之前我们讲过页面是文档流,具体什么是文档流,我就不说了?于是我们页面布局如果用div的话,那么块状的元素是怎么排列的,什么叫块状自己去看? 如果我们呢用div布 ...
- smack 4.1创建群聊
smack 4.1.1版本对群聊修改了很多,MultUserChat的构造函数修改成了私有,以前通过new MultUserChat创建聊天室,现在通过MultUserChatMananger先通过r ...