架构文摘:分布式系统Session一致性问题解析

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 一、问题的提出1. 什么是Session?用户使用网站的服务,需要使用浏览器与Web服务器进行多次交互。HTTP协议本身是无状态的,需要基于HTTP协议支持会话状态(Session State)的机制。

一、问题的提出

1. 什么是Session?

用户使用网站的服务,需要使用浏览器与Web服务器进行多次交互。HTTP协议本身是无状态的,需要基于HTTP协议支持会话状态(Session State)的机制。具体的实现方式是:在会话开始时,分配一个
唯一的会话标识(SessionID),并通过Cookie将这个标识告诉浏览器,以后每次请求的时候,浏览器都会带上这个会话标识SessionID来告诉Web服务器这个请求是属于哪个会话的。在Web服务器上,各个会话都有独立的存储,保存不同会话的信息。如果遇到禁用Cookie的情况,一般的做法就是把这个会话标识放到URL的参数中。

2. 什么是Session一致性问题?

当Web服务器从一台变为多台时,就会出现Session一致性问题。

如上图所示,当一个带有会话标识的HTTP请求到了Web服务器后,需要在HTTP请求的处理过程中找到对应的会话数据(Session)。但是,现在存在的问题就是:如果我第一次访问网站时请求落到了左边的服务器,那么我的Session就创建在左边的服务器上了,如果我们不做处理,就不能保证接下来的请求每次都落在同一边的服务器上了。这就是Session一致性问题。

二、Session一致性解决方案

1. Session Stiky

在单机的情况下,会话保存在单机上,请求也是由这个机器处理,因此不会有问题。当Web服务器变为多台以后,如果保证同一个会话的请求都在同一个Web服务器上处理,则对该会话来说,与之前单机的情况是一样的。

如果要做到这样,就需要负载均衡器能够根据每次请求的会话标识SessionID来进行请求转发,如下图所示。这种方式称之为Session Stiky方式。

该方案本身非常简单,对于Web服务器来说,该方案和单机的情况是一样的,只是我们在负载均衡器上做了手脚。这个方案可以让同样Session的请求每次都发送到同一个Web服务器来处理,非常利于针对Session进行服务端本地的缓存。

其所存在的问题包括:

  • 如果有一台Web服务器宕机或者重启,则该机器上的会话数据就会丢失。如果会话中有登录状态数据,则用户需要重新登陆。
  • 会话标识是应用层的信息,则负载均衡器要将同一个会话的请求都保存到同一个Web服务器上的话,就需要进行应用层(七层)的解析,这个开销比第四层的交换要大。
  • 负载均衡器变为了一个有状态的节点,要将会话保存到具体Web服务器的映射,因此内存消耗会更大,容灾会更麻烦。

打个比方来说,对于Session Stiky,如果说Web服务器是我们每次吃饭的饭店,会话数据就是我们吃饭用的碗筷。要保证每次吃饭都用自己的碗筷,我就把餐具存在某一家,并且每次都去这家店吃,这是个不错的主意。

2. Session Replication

如果我们继续以去饭店吃饭类比,那么除了前面的方式之外,如果我在每个店都存放一套自己的餐具,就可以更加自由地选择饭店。Session Replication就是这样一种方式,如下图所示。

可以看到,在Session Replication方案中,不再要求负载均衡器来保证同一个会话地多次请求必须到同一个Web服务器上了。而我们的Web服务器之间则增加了会话数据的同步。通过同步就保证了不同Web服务器之间的Session数据的一致。

但是,Session Replication方案也存在一些问题,包括:

  • 同步Session数据造成了网络带宽的开销。只要Session数据有变化,就需要将数据同步到其他所有机器上,机器数越多,同步带来的网络带宽开销就越大。

  • 每台Web服务器都要保存所有的Session数据,如果整个集群的Session数很多的话,每台机器用于保存Session数据的内容占用会很严重。

这就是Session Replication方案。这个方案是靠应用容器来完成Session的复制从而使得应用解决Session问题的,应用本身并不关心这个事情。不过,这个方案并不适合集群机器数多的场景。如果只有几台机器,用该方案是可以的。

3. Session数据集中存储

同样是希望同一个会话的请求可以发到不同的Web服务器上,前面的Session Replication是一种方案,还有一种方案就是把Session数据集中存储起来,然后不同Web服务器从同样的地方来获取Session。其大概的结构如下图所示:

可以看到,与Session Replication方案一样的部分是,会话请求经过负载均衡器后,不会被固定在同样的Web服务器上。不同的地方是,Web服务器之间没有Session数据复制,并且Session数据也不是保存在本机了,而是放在了另一个集中存储的地方。这样,无论是哪台Web服务器,也无论修改的是哪个Session的数据,最终的修改都发生在这个集中存储的地方,而Web服务器使用Session数据时,也是从这个集中存储Session数据的地方来读取。对于Session数据存储的具体方式,可以使用数据库,也可以使用其他分布式存储系统。这个方案解决了Session Replication方案中内存的问题,而对于网络带宽,该方案也比Session Replication要好。

不过,该方案仍存在一些问题,包括:

  • 读写Session数据引入了网络操作,这相对于本机的数据读取来说,问题就在于存在时延和不稳定性,不过由于通信基本发生在内网,问题不大。
  • 如果集中存储Session的机器或者集群存在问题,这就会影响我们的应用。

相对于Session Replication,当Web服务器数量比较大时、Session数比较多的时候,集中存储方案的优势是非常明显的。

对于Cookie Based方案,它对同一个会话的不同请求也是不限制具体处理机器的。与Session Replication和Session数据集中管理的方案不同,这个方案是通过Cookie来传递Session数据的。具体如下图所示。

可以看出,我们的Session数据存放在Cookie中,然后在Web服务器上从Cookie中生成对应的Session数据。这就好比我每次都把自己的碗筷带在身上,这样我去哪家饭店吃饭就可以随意选择了。相对于前面的集中存储,这个方案不会依赖外部的一个存储系统,也就不存在从外部系统获取、写入Session数据的网络时延和不稳定性了。

不过,该方案依然存在不足,包括:

  • Cookie长度限制。由于Cookie是有长度限制的,这也会限制Session数据的长度。
  • 安全性。Session数据本来都是服务器端数据,而这个方案是让这些服务端数据到了外部外部网络及客户端,因此存在安全性的问题。
  • 带宽消耗。这里指的不是内部Web服务器之间的带宽的消耗,而是我们数据中心的整体外部贷款的消耗。
  • 性能消耗。每次HTTP请求和响应都带有Session数据,对Web服务器来说,在同样的处理情况下,响应的结果输出越少,支持的并发请求就会越多。

三、总结

综合而言,上述所有方案都是解决session问题的方案,对于大型网站来说,Session Sticky和Session集中管理是比较好的方案。

目录
相关文章
|
8天前
|
存储 Prometheus Cloud Native
分布式系统架构6:链路追踪
本文深入探讨了分布式系统中的链路追踪理论,涵盖追踪与跨度的概念、追踪系统的模块划分及数据收集的三种方式。链路追踪旨在解决复杂分布式系统中请求流转路径不清晰的问题,帮助快速定位故障和性能瓶颈。文中介绍了基于日志、服务探针和边车代理的数据收集方法,并简述了OpenTracing、OpenCensus和OpenTelemetry等链路追踪协议的发展历程及其特点。通过理解这些概念,可以更好地掌握开源链路追踪框架的使用。
61 41
|
1月前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
214 36
微服务架构解析:跨越传统架构的技术革命
|
18天前
|
设计模式 存储 算法
分布式系统架构5:限流设计模式
本文是小卷关于分布式系统架构学习的第5篇,重点介绍限流器及4种常见的限流设计模式:流量计数器、滑动窗口、漏桶和令牌桶。限流旨在保护系统免受超额流量冲击,确保资源合理分配。流量计数器简单但存在边界问题;滑动窗口更精细地控制流量;漏桶平滑流量但配置复杂;令牌桶允许突发流量。此外,还简要介绍了分布式限流的概念及实现方式,强调了限流的代价与收益权衡。
60 11
|
20天前
|
设计模式 监控 Java
分布式系统架构4:容错设计模式
这是小卷对分布式系统架构学习的第4篇文章,重点介绍了三种常见的容错设计模式:断路器模式、舱壁隔离模式和重试模式。断路器模式防止服务故障蔓延,舱壁隔离模式通过资源隔离避免全局影响,重试模式提升短期故障下的调用成功率。文章还对比了这些模式的优缺点及适用场景,并解释了服务熔断与服务降级的区别。尽管技术文章阅读量不高,但小卷坚持每日更新以促进个人成长。
45 11
|
22天前
|
消息中间件 存储 安全
分布式系统架构3:服务容错
分布式系统因其复杂性,故障几乎是必然的。那么如何让系统在不可避免的故障中依然保持稳定?本文详细介绍了分布式架构中7种核心的服务容错策略,包括故障转移、快速失败、安全失败等,以及它们在实际业务场景中的应用。无论是支付场景的快速失败,还是日志采集的安全失败,每种策略都有自己的适用领域和优缺点。此外,文章还为技术面试提供了解题思路,助你在关键时刻脱颖而出。掌握这些策略,不仅能提升系统健壮性,还能让你的技术栈更上一层楼!快来深入学习,走向架构师之路吧!
55 11
|
1月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
1月前
|
存储 算法 安全
分布式系统架构1:共识算法Paxos
本文介绍了分布式系统中实现数据一致性的重要算法——Paxos及其改进版Multi Paxos。Paxos算法由Leslie Lamport提出,旨在解决分布式环境下的共识问题,通过提案节点、决策节点和记录节点的协作,确保数据在多台机器间的一致性和可用性。Multi Paxos通过引入主节点选举机制,优化了基本Paxos的效率,减少了网络通信次数,提高了系统的性能和可靠性。文中还简要讨论了数据复制的安全性和一致性保障措施。
43 1
|
2月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
76 8
|
1月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
2月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
53 3

热门文章

最新文章

推荐镜像

更多
下一篇
开通oss服务