分布式session一致性解决方案

2024-09-04 05:48

本文主要是介绍分布式session一致性解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分布式Session一致性问题

在早期的时候,很多网站由于用户规模较小,都是采取的单机部署的模式,只用一台服务器来承载用户的请求,这时候Session是存在同一台服务器上,所以能够很容易实现会话跟踪和保持。然而随着用户规模的扩大,单机部署模式已经无法承载所有用户的请求了,这时候人们自然而然想到用多台服务器来处理用户的请求,用户的请求会先到达负载均衡,然后再被转发到某个具体应用服务器上进行处理。这时候我们就会遇到一个问题,每次处理同个用户的请求的服务可能不同,那怎么让它们的Session数据保持一致呢?

一般来说有以下四种方案:

  • Cookie存储Session

  • Session粘滞

  • Session复制

  • Session集中管理

我们来一个一个了解它们的优劣和使用场景

分布式Session一致性解决方案

Cookie存储Session

我们知道Cookie总只有一份的,而且是存在用户端的,所以我们可以通过Cookie来存储Session信息,这样不管最后发送到哪台服务器处理,我们都能通过Cookie取到Session信息。使用这个方案有以下优缺点

优点

  • 简单易用,无需额外的配置

  • 无需额外的外部存储

缺点

  • 为了数据不被泄露,一般需要进行加密,加解密过程需要一定开销

  • Cookie长度和数量有限制,会限制数据的存储

  • 每次请求都多出来了Session的数据,需要消耗更多网络带宽和系统性能

  • 受限于Cookie的开闭,如果用户关闭Cookie,Session就失效了,用户也就无法正常访问了

适用场景:数据量小的情况。

Session粘滞

也就是粘性Session,当用户访问负载均衡时,通过某种方法算出该用户应该访问的后端服务器,例如通过hash算法。这样保证了每个会话都在同一台服务器上。使用这个方案有以下优缺点:

优点

  • 使用简单,只需要配置好转发规则即可。

  • 没有额外网络开销

缺点

  • 存在单点问题,一但某台机器重启或宕机,相对应的Session数据将会丢失

  • 会话标识是应用层的信息,则负载均衡器要将同一个会话的请求都保存到同一个Web服务器上的话,就需要进行应用层(七层)的解析,这个开销比第四层的交换要大。或许有同学会说,nginx 四层转发可以支持ip hash的方式,这样就能通过四层转发了。事实上最好的方案是通过会话id进行hash,因为在日常生活中还是很容易出现ip发生变化的情况,例如从家里出去的时候,我们手机连接的网络从wifi切换到无线流量会发生ip变化,这时候通过ip hash的方式就会丢失Session了。

  • 负载均衡器变为了一个有状态的节点,需要计算会话和具体Web服务器的映射,因此内存消耗会更大

适用场景:机器数适中、对稳定性要求不是非常苛刻的情况

Session复制

既然只有一台机器存Session容易出现单点问题,那么我们就所有机器都存Session,每台机器间进行Session同步,这样不管访问到哪台机器都能获得Session。这就是Session复制方式,我们给服务器之间增加了会话数据的同步,通过同步来保证不同服务器之间的Session数据的一致。使用这个方案有以下优缺点:

优点

  • 实现简单,只需要少量配置

  • 即使某台机器宕机或者重启也不影响用户访问

缺点

  • 需要依赖支持Session同步的Web服务器,如果Web服务器不支持就不能使用了

  • 存在延迟,因为要等待Session同步过来,特别是在数据量比较大的情况下更加明显

  • 在服务器集群达到数千台的时候,就会出现瓶颈,因为每台机器都会对外广播自己的Session,同时要接收其他几千台机器发出的Session,非常损耗性能。

  • 数据冗余非常严重,几千台服务器就有几千份冗余数据,浪费了相当多的资源

适用场景:服务器比较少且Session数据量少

Session集中管理

通过单独的服务器集群来存储和管理Session数据,例如redis,其他所有的应用服务器都从这个存储集群获取对应的Session,从而实现Session的共享。

优点

  • 可靠性较高,通过单独的集群进行统一管理

  • 减少应用服务器的资源开销

缺点

  • 实现较为复杂,配置较多

  • 需维护单独的存储集群

适用场景:应用服务器较多、可用性要求较高

每个方案都各有其适用的场景,大家在实际使用过程中需要根据实际情况进行选择

参考资料

http://blog.itpub.net/69951287/viewspace-2664889/

Enjoy it !

如果觉得文章对你有用,可以赞助我喝杯咖啡~

版权声明

转载请注明作者和文章出处
作者: X先生
https://blog.csdn.net/u013314679/article/details/105637192

这篇关于分布式session一致性解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135168

相关文章

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端

明明的随机数处理问题分析与解决方案

明明的随机数处理问题分析与解决方案 引言问题描述解决方案数据结构设计具体步骤伪代码C语言实现详细解释读取输入去重操作排序操作输出结果复杂度分析 引言 明明生成了N个1到500之间的随机整数,我们需要对这些整数进行处理,删去重复的数字,然后进行排序并输出结果。本文将详细讲解如何通过算法、数据结构以及C语言来解决这个问题。我们将会使用数组和哈希表来实现去重操作,再利用排序算法对结果

UE5 半透明阴影 快速解决方案

Step 1: 打开该选项 Step 2: 将半透明材质给到模型后,设置光照的Shadow Resolution Scale,越大,阴影的效果越好

MySQL中一致性非锁定读

一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行正在执行DELETE或UPDATE操作,这是读取操作不会因此等待行上锁的释放。相反的,InnoDB会去读取行的一个快照数据 上面展示了InnoDB存储引擎一致性的非锁定读。之所以称为非锁定读,因

InnoDB的多版本一致性读的实现

InnoDB是支持MVCC多版本一致性读的,因此和其他实现了MVCC的系统如Oracle,PostgreSQL一样,读不会阻塞写,写也不会阻塞读。虽然同样是MVCC,各家的实现是不太一样的。Oracle通过在block头部的事务列表,和记录中的锁标志位,加上回滚段,个人认为实现上是最优雅的方式。 而PostgreSQL则更是将多个版本的数据都放在表中,而没有单独的回滚段,导致的一个结果是回滚非

PHP: 深入了解一致性哈希

前言 随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。 取模算法 取模运

laravel框架实现redis分布式集群原理

在app/config/database.php中配置如下: 'redis' => array('cluster' => true,'default' => array('host' => '172.21.107.247','port' => 6379,),'redis1' => array('host' => '172.21.107.248','port' => 6379,),) 其中cl

基于MySQL实现的分布式锁

概述 在单机时代,虽然不需要分布式锁,但也面临过类似的问题,只不过在单机的情况下,如果有多个线程要同时访问某个共享资源的时候,我们可以采用线程间加锁的机制,即当某个线程获取到这个资源后,就立即对这个资源进行加锁,当使用完资源之后,再解锁,其它线程就可以接着使用了。例如,在JAVA中,甚至专门提供了一些处理锁机制的一些API(synchronize/Lock等)。 但是到了分布式系统的时代,这种