与分布式缓存在高并发和高可用下所要解决问题差不多。
一.图示:
(http://www.cnblogs.com/zhengyun_ustc/archive/2012/11/17/topic4.html)
二.高并发下分布式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 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 生命周期的管理。
九.微软系的解决方法
ASP.NET 有自己的分布式 Session 解决方案,Session State Server ,即 web.config 里指定 sessionState 的 mode 为“StateServer”即可。
郑昀既可以在 web.config 里指定一个 State Server :
也可以实现 System.Web.IPartitionResolver 的接口,自行决定如何构造 Session State Server 连接字符串,从而支持一组 State Servers。
郑昀也可以用 sessionState 的 partitionResolverType 属性设定即可:
微软的这个解决方案缺点是,Session State 中的序列化和反序列化对象将成为主要性能消耗之一,最好使用基本类型来存储所有的 Session State 数据。
分享到:
相关推荐
Tomcat-Redis-Session-Manager是一个开源项目,它允许Tomcat服务器将用户的session数据存储到Redis缓存系统中,而不是默认存储在本地内存或文件系统。这一设计显著提升了session管理的性能和可扩展性,尤其是在集群...
总的来说,`tomcat-redis-session-manager`是应对分布式系统中session管理挑战的有效工具。它将Redis的强大功能引入Tomcat,实现了跨服务器的session共享,提高了应用的可扩展性和可靠性。正确配置和使用这个组件,...
`memcached-session-manager`是Java的一个库,用于在基于Tomcat的Web应用中实现基于Memcached的session共享,这在分布式环境中尤为重要。 标题中的"session共享 memcached-session-manager 1.9.6 jar"指的正是这个...
【描述】中提到的"所需的tomcat-redis-session-manager所有的jar包下载"意味着我们需要了解如何配置和使用这个第三方库,以便在Tomcat8环境中存储和检索用户的session数据到Redis缓存系统。测试环境使用的是JDK1.8,...
"tomcat-redis-session-manager"是一个解决方案,它将用户的Session信息存储在Redis缓存服务器中,从而实现跨服务器的Session共享。本篇文章将深入探讨这个话题,包括它的原理、配置以及实际应用。 **一、Session...
标题中的"tomcat-redis-session-manager-1.2-tomcat-7-java-7"表明这是一个针对Tomcat服务器,用于管理session的组件,版本为1.2,适配Tomcat 7和Java 7环境。这个组件的主要作用是将Tomcat的会话管理功能与Redis...
【标题】"tomcat-redis-session-manager jar包"是一个用于集成Redis进行Session管理的Java库,特别设计用于Apache Tomcat服务器。这个库使得在多台Tomcat服务器之间共享和协调用户的Session数据成为可能,从而提高了...
这个组件实现了将Tomcat应用服务器中的用户session数据存储到Redis分布式缓存系统中,以提高系统的可伸缩性和性能。Redis是一个高性能的键值数据库,常被用来作为缓存服务,因其速度快、数据持久化等特点,非常适合...
`tomcat-redis-session-manager-2.0.0`就是为了解决这个问题而诞生的一个开源项目,它将Tomcat容器中的Session数据存储到Redis缓存系统中,实现了跨服务器的Session共享。 Redis是一种高性能的键值数据库,特别适合...
这个组件使得Web应用程序可以利用Redis分布式缓存系统来存储和管理用户的会话数据,从而实现高可用性和可扩展性。 描述中提到的 "commons-pool-1.6.jar" 是Apache Commons Pool库的1.6版本,这是一个对象池服务,...
描述中的“spring5+hibernate5+Spring-session-data-redis2+Spring-data-redis2整合”进一步扩展了集成环境,引入了Hibernate 5作为ORM(对象关系映射)工具,Spring-session-data-redis和Spring-data-redis2则是...
在“秒杀实战 redis nginx 分布式session-secKill”项目中,我们将探讨如何利用Redis、Nginx以及分布式Session技术来构建一个高效、稳定的秒杀系统。 首先,Redis是一个高性能的键值存储系统,它被广泛用于缓存应用...
2. **Java Servlet会话管理**:在Java Web开发中,Servlet规范定义了会话接口HttpSession,memcached-session-manager 是一个实现该接口的第三方库,允许开发者将默认的基于内存的会话存储替换为分布式存储。...
为了优化这个问题,我们可以使用`memcached-session-manager`,它是一个专门为Tomcat设计的插件,使得Tomcat能够将用户的session数据存储在Memcached服务器上,实现session的分布式管理。 本文将详细介绍如何在...
分布式缓存是现代Web应用程序中不可或缺的一部分,它能显著提高系统的响应速度和处理能力,减少对后端数据库的依赖。本文将深入探讨Ehcache作为JVM缓存和分布式缓存的角色,以及Redis作为分布式缓存的解决方案,包括...
2. 获取项目:从GitHub上下载`tomcat-redis-session-manager-master`,并根据需要选择对应Tomcat版本的子目录(如`tomcat-redis-session-manager-master-8.5`)。 3. 配置Tomcat:将解压后的`lib`目录下的jar文件...
标题 "tomcat-redis-session-manager.zip" 涉及到的是一个用于在多个Tomcat服务器之间实现Session共享的解决方案,利用了Redis作为分布式缓存系统。这个压缩包包含了一系列的JAR文件,这些文件主要用于支持Tomcat ...
标题中的“Memcached分布式缓存服务替换Session解决方案”是指一种使用Memcached作为分布式缓存来管理Web应用中的Session状态的方法,以替代传统的基于服务器端Session存储的策略。这种方案主要针对的是多服务器环境...
"工具"标签则表明`memcached-session-manager`是一个实用工具,用于在Java Web应用中处理session的持久化和分布式存储,可能是通过提供API或者配置选项来实现。 **文件名解析:** "tomcat7"可能是教程中涉及的一个...
Redis,作为一个高性能的键值数据存储系统,常被用作分布式缓存,以提升应用程序的性能和响应速度。本文将深入探讨Redis分布式缓存的原理、应用及其优势。 分布式缓存是解决大型互联网应用高并发访问和大数据量存储...