`
zhengyun_ustc
  • 浏览: 83087 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

电商课题VI:分布式Session

阅读更多
@郑昀汇总
与分布式缓存在高并发和高可用下所要解决问题差不多。
一.图示:
http://images.cnblogs.com/cnblogs_com/zhengyun_ustc/255879/o_clipboard35.png
 
二.高并发下分布式Session需解决的问题:
  • 透明处理存储介质的故障转移
  • 动态增删节点,减小“缓存颠簸”问题
  • 保证数据在各个节点的分布均衡
  • Session 序列化和反序列化
 
三.保证“基本可用 Basically Available”的分布式Session方案:
Eric A. Brewer 在 1988 年提出的 BASE 策略,即 Basically AvailableSoft 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 KryoCustomization, SerializerFactory 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 生命周期的管理。
http://images.cnblogs.com/cnblogs_com/zhengyun_ustc/255879/o_clipboard36.png
 
九.微软系的解决方法
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 数据。
分享到:
评论

相关推荐

    LABVIEW 资源,AES128加密子VI:Shift Rows

    LABVIEW 资源,AES128加密子VI:Shift Rows

    LABVIEW 资源,AES128加密子VI:Expand Key

    LABVIEW 资源,AES128加密子VI:Expand Key

    docker容器中 bash: vi: command not found,docker apt-get 异常 Temporary failure resolving

    bash: vi: command not found, 场景: 因为 docker里面没有这个命令,我们安装一下 apt-get update apt-get install vim 如果 这个时候 安装也还是会出现 异常 root@446d7cf1606c:/etc/mysql# apt-get update ...

    linux怎么退出vi.txt

    按ESC键 跳出vi的编辑命令,然后: :w 保存文件但不退出vi :w file 将修改另外保存到file中,不退出vi :w! 强制保存,不推出vi :wq 保存文件并退出vi :wq! 强制保存文件,并退出vi q: 不保存文件,退出vi :q! 不...

    如何在vi中实时读取子vi数据_vi_vi中实时读取子vi数据_

    2. 连接子VI:在主VI中,将子VI拖放到工作区,并通过连线将输入数据从主VI传递到子VI的输入端口。同样,从子VI的输出端口拉出连线,连接到主VI中需要这些数据的地方。 3. 实时读取:LabVIEW默认支持实时数据流,...

    LabView调用子Vi实例(含说明)

    1. 创建子VI: - 打开LabView,新建一个VI。 - 在前面板上添加所需的控件,如输入、输出、指示器等,这些将成为子VI的用户界面。 - 转到程序框图,编写实现特定功能的代码。 - 保存子VI:右键点击VI图标,选择...

    vi:RT-Thread的面向屏幕的文本编辑器

    六 | 英语 1.简介 vi是类Unix平台下的著名文本编辑器。 该软件包是vi-RT-Thread操作系统的端口,该端口派生自busybox中的vi编辑器,... [*] vi: A screen-oriented text editor 3.联系方式 维护:梅科男子 主页: :

    CH341-I2C-labview-应用说明+VI-所有版本都可以使用

    1. 初始化VI:用于配置CH341芯片的工作模式,设置I2C总线的速度和地址,确保与目标设备正确连接。 2. 发送数据VI:将计算机内存中的数据通过CH341发送到I2C总线,可以用于控制I2C设备的参数设置。 3. 接收数据VI:...

    labview的Pid工具包

    1. PID.vi:该 VI 可以搭建一个简单的 PID 控制器,用户可以输入 PID 的 3 个参数值(PID gains),系统反馈值(process variable),实际期望值(setpoint)以及微分时间(dt),便能得到需要的输出值(output)。...

    2ASK解调相干与非相干,抽样判决vi

    2ASK解调相干vi与非相干VI: 本VI提供了一个用于解调二进制相干和非相干2ASK(二进制振幅键控)信号的功能。它接收一个已调制的2ASK信号和相应的本地载波信号,然后通过相干或非相干解调技术提取原始二进制数据。 ...

    vi:Materijali posveceni kursu Vestacke inteligencije na Matematickom fakultetu

    vi:Materijali posveceni kursu Vestacke inteligencije na Matematickom fakultetu

    智能行为的发展 VI:J. McV。 打猎

    The development of intelligent behavior VI: J. McV. Hunt PERSONALITY PATTERNS OF READERS WITH PERCEPTUAL-MOTOR PROBLEMS 123 HARRIS, T. L., OTTO, W., & BARRETT, T. C. Summary and review of ...

    labview多态vi的实现

    1. 创建基础VI:首先,你需要创建一个基础VI,这个VI通常包含一个或多个输入端口,以及一个或多个子VI引用节点。这些子VI就是实现不同功能的具体版本。 2. 创建子VI:为每个不同的输入类型或行为创建一个子VI,每个...

    基于虚拟仪器平台的新型分布式光纤传感系统.pdf

    3. 虚拟仪器平台:虚拟仪器(Virtual Instrument,简称VI)是利用计算机技术实现的仪器平台,具有灵活性高、可自定义性强、成本低等优点。在本文件中,使用了LabVIEW软件平台进行数据的采集和处理,这是一套由美国...

    eselect-vi:https:anongit.gentoo.orggitprojeselect-vi.git的只读镜像

    `eselect-vi` 是 Gentoo Linux 发行版中一个用于管理 `vi` 或 `vim` 编辑器配置和版本的工具。它来源于 Gentoo 的 ebuild 系统,ebuild 是一种自动化脚本,用于构建、安装和管理软件包。`eselect-vi` 提供了一种方便...

    基于Labview的多功能信号发生器设计(VI程序)

    1. 主VI:这是整个项目的主界面,包含用户交互界面和背后的代码逻辑。 2. 串口通信子VI:用于设置和管理串口通信参数,读写数据。 3. 信号生成子VI:实现不同类型的信号生成功能。 4. 数据处理子VI:对采集到的信号...

    vI.rar_vi

    - 启动vi:在终端输入`vi`或`vim`(Vi IMproved,vi的增强版本)后跟文件名即可打开文件。 - 退出vi:在命令模式下输入`:q`尝试退出,但只有在没有未保存的更改时才能成功。如果需要保存并退出,使用`:wq`;强制...

    基于PCI-6221数据采集卡的虚拟仪器系统组建-张凯强.doc

    * DAQmx Wait Until Done.VI:该VI用于确保在任务结束前输入或输出数据的操作已完成,通常用于基于PCI-6221数据采集卡的虚拟仪器系统组建有限采样(Finita Samples)的输入或输出操作。 本实验报告展示了基于PCI-...

Global site tag (gtag.js) - Google Analytics