电商课题VI:分布式Session

标签: 电商 vi 分布 | 发表时间:2012-11-17 22:30 | 作者:旁观者
出处:http://www.cnblogs.com/zhengyun_ustc/
@郑昀汇总
与分布式缓存在高并发和高可用下所要解决问题差不多。
一.图示:
 
二.高并发下分布式Session需解决的问题:
  • 透明处理存储介质的故障转移
  • 动态增删节点,减小“缓存颠簸”问题
  • 保证数据在各个节点的分布均衡
  • Session  序列化和反序列化
 
三.保证“基本可用 Basically Available”的分布式Session方案:
Eric A. Brewer 在 1988 年提出的 BASE 策略,即 Basically Available、Soft state、和Eventually consistent。
互联网大多数应用更强调可用性,即牺牲高一致性,获得可用性或可靠性。
 
基本可用 Basically Available 的定义:
在分布式系统部分损坏的时候,允许部分内容不可用,但是其他部分仍旧可用。因此称这种系统为“基本可用”。比如,一个数据存储系统由 五个节点构成。其中一个发生了损坏,这时只有20%的数据不能访问,其他80%数据仍然可用。那么就可以称这种系统为基本可用的。
 
基于 memcache 的  Hash取模算法(hash() mod n,hash() 取用户ID,n为节点数) 实现的分布式 Session 方案,就属于基本可用:
第一,如果节点发生故障,该节点上的所有用户 Session 丢失,系统无法自恢复。
第二,如果系统压力突然增大,需要临时增加机器节点。按照 Hash取模的算法,在增加机器节点的这一时刻,大量缓存无法命中(其实还都存在之前的节点上),导致大范围的缓存穿透,压力会直接打到数据库上。
第三,根据 LRU 缓存失效算法,memcache 里存储的 key/value 有可能被踢出,用户 Session 容易丢失。
 
针对 Hash取模 的 改进办法是:
四.基于一致性哈希算法的 memcache 解决方案
1)一致性哈希帮我们解决的是,当机器节点减少时,缓存数据能进行最少重建。
2)还能解决 Session 数据的分布均衡问题。
3)当机器节点宕机,这部分数据必然丢失。由于节点数目变化,有可能对部分没有丢失的数据也要重建。
 
但上面的方案都解决不了“一个节点失败后,它所存储的 Session 如何由其他节点获取以便接替失效节点,实现集群的容错(Failover)”。
郑昀先介绍下面几个概念:
五.Sticky Session、Non-sticky Session和Replicated Sessions
  • Sticky Sessions:粘性会话。即同一个会话中的请求必须被转发到同一个节点上,除非该节点宕机才转发到故障转移节点。一个节点宕机,所存储的 Sessions 完全丢失。通俗的话就是,将用户“粘”在某一个服务器节点上。
  • Non-Sticky Sessions:非粘性会话。每一次请求都可能转发到不同节点。
  • Replicated Sessions:把一个节点上的 Sessions 复制到集群的其他节点上,防止数据丢失,允许失效无缝转移。如node 0复制到node 5,node 1复制到node 6,以此类推。多数应用服务器(如 Tomcat )都支持会话复制机制。
 
当用户数量和集群数量达到一定规模后,Session 复制就可能成为性能瓶颈。于是人们提出了  从第三方缓存恢复失效节点数据 的方案,开源产品  Memcached-Session-Manager(下面简称MSM)就是基于这个思想。
六.MSM的工作原理
MSM 支持 Tomcat 6 和 7,即它主要解决的是 Tomcat 的高可用性。
它的特性为:
  • 支持 sticky sessions 和 non-ticky sessions 模式。
  • 没有单点故障。
  • 能处理 tomcat 故障转移
  • 能处理 memcache 故障转移
  • pluggable session serialization
  • 允许异步存储 session,提高响应速度
  • sessions 只有真正被修改时,才会发给 memcache
 
6.1.Sticky Session 模式下的工作原理
即, Tomcat 的本地 session  为主 session,memcache 中的 session 为备 session
第一步,所有 Tomcat 节点都需要安装 MSM;每一个 Tomcat 会有自己的本地 session。
第二步,当一个请求执行完毕之后,如果对应的 session 在本地不存在(即这是某一个用户的第一次请求),则将该 session 复制一份至 memcache 。
第三步,当该 session 的下一个请求到达时,会使用 Tomcat 的本地 session。请求处理结束之后,session 的变化会同步更新到 memcache,保证数据一致。
第四步,如果当前 Tomcat 节点失效,下一个请求会被路由给其他 Tomcat。这个 Tomcat 发现请求所对应的 session 并不存在,于是它将查询 memcache,如果查询到了,则恢复到本地 session。
这样就完成了容错处理。
 
6.2.Non-sticky Session 模式下的工作原理
即, Tomcat 的本地 session  为中转 session,memcache 1 为主 session,memcache 2为备 session
第一步,收到请求,加载备 session 到本地容器;
备 session 加载失败,则从主 session 加载;
第二步,请求处理结束之后,session 的变化会同步更新到 memcache 1和 memcache 2,并清除Tomcat 的本地 session 。
 
session data 要想存入 memcache,必须能序列化和反序列化。
七.基于 kryo 的序列化方案
所有序列化策略都必须提供下面的特性:
  • 序列化:能处理循环引用。
  • 序列化/反序列化:支持对一个共享对象(Shared Object)的引用。
  • 反序列化:支持 private classes 。
  • 反序列化:支持没有默认构造函数的类。
下面是 MSM  Wiki 所列出的表格
Serialization Strategy 

Value for  transcoderFactoryClass attribute
Requires 

java.io.Serializable
Cyclic

Dependencies
Shared

objects
Private classes Classes without

default constructor
Different class versions Copy Collections 

before

serialization
Custom 

Converter
Comment
java serialization(default, bundled with msm) 

de.javakaffee.web.msm.JavaSerializationTranscoderFactory
Yes Yes Yes Yes Yes No (Though, 
if the serialVersionUID is set to 1L, 
classes can be deserialized 
even if the new class version has new fields)
No No  
msm-kryo-serializer 

de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory
No Yes Yes Yes (for Sun JVMs) Yes (for Sun JVMs) No (not yet) Yes Yes (Converter must extend  KryoCustomizationSerializerFactory or  UnregisteredClassHandler) Reflection based,  Kryo is used for binary serialization/deserialization
msm-javolution-serializer 

de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory
No Yes Yes Yes (for Sun JVMs) Yes (for Sun JVMs) Yes (During deserialization, fields that are not existing in a class are ignored) Yes Yes (Converter must extend [apidocs/javolution/xml/CustomXMLFormat.html CustomXMLFormat]) Reflection based,  Javolutionis used for actual xml encoding/decoding, it also does the object reference handling
MSM 作者的观点是:
  1. Java serialization 是一个鲁棒性非常好、也被广泛证明了的技术,但 IMHO(恕我直言),它最大问题就是无法处理类的版本:向下兼容时新版本如何反序列化老版本序列化的数据流,如还要向上兼容的话老版本如何反序列化新版本序列化的数据流。为了确认兼容性,测试量将是版本数的平方。
  2. Kryo 是一个非常快的二进制序列化库。在  thrift 与 protobuf 的性能 benchmark 中,kryo 也是最快的序列化工具库之一。他推荐使用  Kryo ,就是因为 超凡的性能
 
八.基于 ZooKeeper 集群的分布式 Session 方案
要解决基于 memcache 方案的数据丢失问题,可以引入持久化存储介质  ZooKeeper(下面简称 ZK)。
依托于 ZK 的一致性复制(在多个副本间保证数据的强一致性)和容错能力,结合上面的 MSM 思想,
由 ZK 负责 session 数据的存储,而我们自己实现的 session manager 将负责 session 生命周期的管理。
 
九.微软系的解决方法
ASP.NET 有自己的分布式 Session 解决方案,Session State Server ,即 web.config 里指定 sessionState 的 mode 为“StateServer”即可。
郑昀既可以在 web.config 里指定一个 State Server :
http://images.cnblogs.com/cnblogs_com/zhengyun_ustc/255879/o_clipboard37.png
也可以实现 System.Web.IPartitionResolver 的接口,自行决定如何构造 Session State Server 连接字符串,从而支持一组 State Servers。
郑昀也可以用 sessionState 的 partitionResolverType 属性设定即可:
http://images.cnblogs.com/cnblogs_com/zhengyun_ustc/255879/o_clipboard38.png
微软的这个解决方案缺点是,Session State 中的序列化和反序列化对象将成为主要性能消耗之一,最好使用基本类型来存储所有的 Session State 数据。

本文链接

相关 [电商 vi 分布] 推荐:

电商课题VI:分布式Session

- - 博客园_旁观者
与分布式缓存在高并发和高可用下所要解决问题差不多. 二.高并发下分布式Session需解决的问题:. 透明处理存储介质的故障转移. 动态增删节点,减小“缓存颠簸”问题. 保证数据在各个节点的分布均衡. 三.保证“基本可用 Basically Available”的分布式Session方案:. Brewer 在 1988 年提出的 BASE 策略,即 Basically Available、Soft state、和Eventually consistent.

《vi查询卡片》首发!

- Tomy - linux大棚-roclinux.cn
“Unix对话录”博客的博主,通过“linux大棚”平台,. 这是一个翻译作品,对于vi新手非常有用;. 建议大家下载打印,贴在工作台旁边,常看常学. 下载地址(PDF版本,请右键另存为):vi 查询卡片. ©2011 感谢您来到linux大棚. 如转载请注明:“ linux大棚”. gnu screen快捷键速查表.

linux下vi命令大全

- - CSDN博客互联网推荐文章
linux下vi命令大全,能掌握80%也即基本够用了. vi filename :打开或新建文件,并将光标置于第一行首. vi +n filename :打开文件,并将光标置于第n行首. vi + filename :打开文件,并将光标置于最后一行首. vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处.

定制 vi 和 Vim 编辑器

- wangjl - IBM developerWorks 中国 : 文档库
vi(可视化)文本编辑器是最古老的面向屏幕的编辑器,仍然在所有 UNIX、Linux 和其他 UNIX 类的系统上默认提供. 由于其陈旧性加上其基础编辑模型,vi 总是得不到应有的尊崇,但是它是一个无比快速且可靠的工具,每一位 UNIX 和 Linux 管理员都应当知道如何使用它. Vim(vi 改进版)是常用的 vi 的现代版本,在诸多方面扩展了 vi 的功能,同时保留向后兼容性.

Linux上vi(vim)编辑器使用教程

- 法师 - VPS侦探
vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim). vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率. vi是“visual interface”的缩写,vim是vi IMproved(增强版的vi). 在一般的系统管理维护中vi就够用,如果想使用代码加亮的话可以使用vim.

vi 技巧和诀窍:令人刮目相看的 10 个超酷命令

- 赵星云 - IBM developerWorks 中国 : Linux : Articles,Tutorials
通过 vi 技巧和诀窍提高文件编辑效率,让您的朋友刮目相看. 本文介绍 10 个不太为人所知的 vi 命令,所有真正的 vi 用户都应该掌握它们.

ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法

- - CSDN博客推荐文章
今晚上课,老师给我们每人分配了一台ubuntu虚拟机,说要做实验用. 我当然是没关系,我最喜欢的就是ubuntu了,但是对于一些对linux不熟悉的同学来说,也许是个很艰难的实验过程了. 老师要我们在ubuntu下编辑一些文件,这就涉及到了vi这个编辑器了. 在ubuntu下,初始使用vi的时候有点问题,就是在编辑模式下使用方向键的时候,并不会使光标移动,而是在命令行中出现[A [B [C [D之类的字母,而且编辑错误的话,就连平时关于的退格键(Backspace键)都使用不了,只能用Delete来删除.

再谈电商 618 大促备战:分布式 Redis、压测、限流、降级、review

- - IT瘾-dev
在促销开始后,比如618一般是从6月1日就开始进行促销了,开始促销后最好的方式是线上服务尽量不要上线了. 但还是有些情况比如618当天活动信息,必须要大促时进行上线的,主要需要确保两方面一是功能一是性能. 保证功能正确,完全保证功能正确还是很难的,但还是有很多经验可循,首先新的服务尽量去新建而不要和原有其他服务勾连一起避免其他服务不可用,再有就是其他服务使用的与接口相关的尽量不要去修改,无论是修改名称还是对类增减字段都是会影响原有服务调用的,在dubbo微服务架构下,这是需要注意的点.

电商之城

- 可可 - 《商业价值》杂志
原产地效应正在点亮越来越多的电商之城,这代表着电子商务正在逐步回归“商务”的本质. 从机场拿一份免费的手绘地图,和着有点潮湿的空气,足够开启对厦门这座海滨城市的造访. 从市中心到达位于厦门东北方向的软件园二期,只用了不到20分钟. 对于一个习惯了北京的拥堵和密集的人来说,一座被出租车师傅将半小时车程定义为“还挺远”的城市,从一开始就带给人惊喜.

谈电商平台

- - 人月神话的BLOG
一个完整的电商平台模块本身应该如何划分,可以从两个维度来进行思考,一个维度是本身电商的端到端业务和流程角度出发,可以分为哪些大的阶段,每个大阶段可对应为模块;另外一个维度则是从电商业务中的核心主数据和业务单据出发,围绕数据来考虑模块的划分. 电商平台核心模块从基础数据层面包括了产品管理,客户管理,供应商,经销商管理,在产品和供应商管理中可能又会拆分单独的价格库模块,维护产品价格和价格策略信息.