连肝两宿,做出这18张图,彻底让你学会“一致性哈希”二

「 分布式技术 」一致性哈希算法(Hash)详解 在分布式系统中,数据的存储和访问是很重要的问题。为了提高系统的可用性和扩展性,常常需要将数据分布到不同的节点上,而且这些节点也可能会动态地加入或离开集群。一致性哈希算法就是一种常用的解决方案,它可以解决节点的动态变化和负载均衡的问题。本文将深入探讨一致性哈希算法的底层原理,包括其基本思想、关键步骤以及优缺点等,同时结合实际场景进行举例说明。一致性哈希算法是一种用于分布式系统中的数据分片和负载均衡的算法。它将整个哈希空间划分为一个环,并且每个节点在这个环上都有一个对应的位置。 阅读详情

三、新的问题来了,也许这就是人生吧

由于公司内部很多人在使用这个 IM 工具。有些时候,为了方便,公司的客户还有一些合作方也用起了这个 IM。这让事情变得复杂了起来。起初,开发人员还是像往常一样,每当人们抱怨说收消息过慢的时候,他们就会加一台机器。

最糟糕的是,公司的客户也会抱怨,他们发现 IM 有时候彻底不可用。这可不是小事情。公司内部人员的问题还可以内部沟通解决。但是公司客户的问题,大意不得,因为这关系到公司产品的名誉。

那么,这到底是怎么一回事呢?

原来,根本原因还在于每次修改完配置规则后的重启服务。每次修改完配置规则,就需要规划好一个恰当的停机时间,去重新对项目做个上线。

但是,这种方法在公司的客户也使用这个 IM 后就行不通了。因为公司的客户有不少是在国外的。也就是说,不管白天还是深夜,很可能总是有人在使用这个 IM。

这就迫使开发人员们,在增加机器时,还需要去和多方协调沟通出一个上线时间,然后发布公告,再去上线。这种反复沟通,再上线,再反复沟通,再上线直接把开发人员们折腾了个半死。

往往沟通完,上线时间直接被放到了半个月以后。而在这半个月里,开发人员还要承受无数内部 IM 使用人的口水。费心竭力的沟通,声嘶力竭的解释,缺眠少觉的上线,这一切的一切推动着开发人员们必须对眼前这套技术方案作出改变了。

四、思路转起来,队列环起来

新的技术方案的需求本质就是:

无论是分配消息规则变化还是集群机器添加都不能停机停服务

对于这种情况,一个很好的解决方案就是如果我们对项目配置文件进行动态的定时检测,当发现变动时,刷新配置规则即可。

image

一切看上去很美好,采用了动态的定时检测后,每当我们需要新增集群中的机器时,我们只需要如下三个步骤了:

  1. 增加一个队列

  2. 修改分配消息的规则

  3. 部署新的机器

客户毫无感知,开发人员们也不需要和用户们协调沟通出专门的上线安排。可是,这个方案也存在一些问题:

  1. 随着我们的系统部署越来越多,我们需要手工修改规则的系统也越来越多。

  2. 如果消费机器宕机了,我们需要删除队列,同时还需要去删除修改分配消息的规则,等到机器恢复了,我们还要再把分配消息的规则改回去。

这个分配消息的规则真讨厌啊,每次有变动,就要去关心这个分配消息的规则。有没有什么办法能把这个分配变得更自动化一些呢?

如果我们假设在 MQ 中有 100 个收发聊天信息的队列(100:这是对我们的IM不可能达到的一个数字),我们只需要在配置规则中配置成:

m = hash(id) mod 100

然后,我们的发送消息的应用启动后,去动态的探测出真实的所有收发聊天信息的队列信息。

当我们通过哈希算出的编号发现没有真实对应的队列存在时,就根据一定的规则,去找到一个真实存在的队列,这个队列,就是我们要发消息的队列。

如果我们做到这样,那么以后,每次队列有变化,无论增多还是减少,我们都不需要再去考虑分配规则的事情了,只需要移除有问题的队列或者增加有对应消费者的队列即可。

这个思想,就是一致性哈希的思想。

具体怎么做呢?

第一步,我们假设有个 100 个收发聊天信息的队列,并且这些队列处于一个环上。

image

第二步,我们获取到真实的收发聊天信息的队列数量,假设有 5 个。

image

第三步,我们把真实的队列映射到我们第一步假设的环中。

image

第四步,我们通过分配规则 hash(id) mod 100 计算出对应的队列编号。

如果 hash(id) 的结果为 2000,那么算出的队列编号 m = 0。这时候,我们一查,发现对应编号 0 的 chat00 队列确实存在,那么就直接发送消息到 chat00 中。

image

如果我们的 hash(id) 的结果为 1999,那么算出的队列编号 m = 99。此时,我们去查队列映射关系,发现 99 编号并没有对应的真实队列。这时候怎么办?很简单,我们顺时针继续往下找,找到谁了呢?0 对应的 chat00 队列,这是真实存在的,这时候,我们就将消息发送到 chat00 队列中。

image

上面四步就是一个基本的一致性哈希算法了。

那么,这套一致性哈希算法满足我们不想总是更新消息分配规则的需求吗?让我们验证一下:

1.假设我们需要在消费信息端集群增加一台机器

我们如果要增加一台机器,那么同时我们也需要在 MQ 中增加一个队列。这时候,我们的分配规则是 hash(id) mod 100,增加了队列后,真实的队列数假设为 6。此时,如果 hash(id) mod 100 的结果小于 6,那么分配的规则和没有增加机器的时候规则一样,以前分配到哪个队列,现在还是分配到哪个队列。但是对于结果等于 6 的情况,则发生了变化。信息会被自动分配给 chat05。当分配给 chat05 后,新的消费者就会自动开始进入正常工作了,我们不需要做任何人工干预,也不需要考虑分配规则的变化。

增加机器以前:

image

增加机器之后:

image

2.假设消费信息端集群一台机器宕机了

模拟宕机,此时我们会去减少一个队列。减少后的真实队列数量为 5,则正好和增加队列相反,m = 5 时,那么行为不会有任何变化,以前分到哪个队列,还是分到哪个队列。如果 m = 6,由于已经不存在真实的队列了,就会做顺时针查找,结果找到 chat00,以前会分到 chat05 的就会被分到 chat00。而此时,chat00 由于正好有消费者,所以,系统的用户是毫无感知的,我们也专心修复我们机器即可。当机器恢复后,就会和新增机器一样,计算结果为 6 的信息会被重新分配回 chat05。

目前,我们可以看到,当我们引入一致性哈希后,我们不管新增机器还是集群机器宕机,我只需要跟随着机器的状态,做一个操作即可:增加或者减少 MQ 中的队列。一切简单化了。

那么,这个方案是否依然还有问题呢?

五、失衡的圆环,压垮骆驼的可能只是一根稻草

假设我们目前有 5 个队列存在,我们的分配规则是 m = hash(id) mod 100。那么,此时,问题就出来了。

如果 m 的值大于 5,由于没有对应的真实队列存在,系统就会顺时针顺着我们构造出来的哈希环找,最终会找到 chat00 这个队列上。

然后,你会发现,只要是 m 值大于 5 的 id 对应用户发的信息,最终都会落入到 chat00 队列中。

image

在极端情况下,如果大量的信息涌入到 chat00 队列里,由于对应 chat00 的消费者处理不过来,很可能会导致这个消费者的崩溃。

然后,去除队列后,根据规则,又会有大量的信息涌入到 chat00 后续的队列 chat01 里,这些信息又会导致 chat01 对应应用的崩溃,最终引发整个集群的崩溃,这就是雪崩效应。

我们需要一种更巧妙的办法来解决这个问题。

六、从实变虚,也许我们应该更敢想一些

经过上面的论述,我们发现,我们在分配队列时,之所以失衡,是因为我们的队列在圆环上的分配失衡。

我们所有的真实队列都是按照顺时针依次排布在圆环上的。在上面的场景里,我们只有 5 个队列。此时,我们假设会有 100 个队列。那么,m = hash(id) mod 100 这个公式里:

m 大于 5 的概率为 95%

由于我们的 5 个队列是按照编号顺序依次排列的。那就说明所有 m 大于 5 的信息就都会映射到一个不存在的队列上,最终,根据规则,顺时针滑到了 0 对应的 chat00 队列中。

如果,我们可以让真实存在的队列均匀分布到环上,那么,这种严重失衡的现象还会再出现吗?

image

image

从上面的图我们可以看出,如果我们能让真实的队列均匀的在圆环上分布,那么这种严重失衡的现象就会得到极大的缓解。

那么如何让这些队列能均匀的分布在这个圆环中呢?还记得我们在苦恼分配信息规则的不断修改时,我们大胆的假设了一个我们的 IM 系统永远也不可能达到的队列数字吗?

我们假设了 MQ 中有 100 个队列,然后,我们去判断这些队列是否真实存在。不存在,我们就顺时针滑动一直找到真实存在的队列为止。

如果我们再大胆一点,偷偷的把我们的假设进一步优化,把一些本来需要判断为不存在的队列去映射到真正已经存在的队列上,那么我们是不是就等于把这些真正存在的队列均匀分布到这个圆环上了?

image

像上图这种,把已经存在的少量队列去映射到多个假设队列的方法,就是一致性哈希的虚拟节点办法。

而对于怎么让少量的队列映射到多个假设队列,是有多种实现算法存在的。

比如,我们可以把真实存在的队列名加上一些编号去分别哈希一下, 像hash(chat00) mod 100,hash(chat00#1) mod 100,然后根据得到的余数,去把 chat00 这个真实队列和对应余数的环中的位置映射上。

如果 hash(chat00) mod 100 = 31,那么 31 号的位置就对应于 chat00,以后所有 m = hash(id) mod 100 中 m = 31的所对应的消息就会直接被发送到 chat00 队列。

而 hash(00#1) mod 100 = 56,则 m = 56对应的消息同样也会直接发送到 chat00 队列。

这样,我们就间接的把 MQ 中的真实存在的队列做了均匀化分布,从而大大减少了信息失衡的现象。

七、理解算法的思想胜于算法的实现

好了,通过实际场景来对于一致性哈希的思想就暂时剖析到这里了。

一致性哈希作为一种非常经典的算法思想,被广泛的用于各大分布式项目当中,用于解决各种分片问题,任务分发问题。

但是,在这里,我要纠正一个观点:很多人都在网上说 redis 使用了一致性哈希。这是错的,redis 只是使用了一致性哈希的思想。比如一致性哈希中的环分布,再比如虚拟节点对应真实节点的思想。

但是 redis 并没有使用任何哈希算法去计算分布,如果有兴趣的读者,可以仔细去看下有关内容。从 redis 的例子上来说,我们可以看到,只有理解了算法的思想,我们才能更容易更灵活地因地制宜的分解、修正、改进算法,让算法能更切合实际的融入到我们的项目之中。

19 张图概览 Spring Cloud(收藏夹吃亏系列),缓存+一致性哈希+分布式面试题 如果你想要学习Java的话,我给你分享一些Java的学习资料,你不用浪费时间到处搜了,从Java入门到精通的资料我都给你整理好了,这些资料都是我做Java这几年整理的Java最新学习路线,Java笔试题,Java面试题,Java零基础到精通视频课程,Java开发工具,Java练手项目,Java电子书,Java学习笔记,PDF文档教程,Java程序员面经,Java求职简历模板等,这些资料对你接下来学习Java一定会带来非常大的帮助,每个Java初学者都必备,请你进我的**微服务目前并没有比较官方的定义。 阅读详情

相关推荐

SPMI、PMBus、AVSBus:三大电源管理总线对比与选型指南

在现代电子系统中,电源管理是确保高性能与低功耗平衡的核心技术。其原理在于通过数字通信协议,实现电源管理单元(PMIC)与用电芯片间的精准“对话”,从而动态调整供电。这项技术的核心价值在于提升系统能效、增强可靠性并简化设计。其应用场景广泛,从智能手机、服务器到汽车电子无处不在。具体实现上,衍生出了三大主流协议:为移动嵌入式高度集成的SPMI总线、专注于工业标准监控的PMBus总线,以及追求极致实时能效的AVSBus总线。理解SPMI在复杂时序控制与PMBus在标准化配置方面的异同,是进行电源架构选型与调试的关

ithome 448

分布式集群架构场景化解决方案:一致性Hash算法

分布式集群架构场景化解决方案:一致性Hash算法 分布式和集群 分布式和集群是不一样的,分布式一定是集群,但是集群不一定是分布式(因为集群就是多个实例一起⼯作,分布式将一个系统拆分之后那就是多个实例;集群并不一定是分布式,因为复制型的集群不是拆分而是复制) 一致性Hash算法 Hash算法,比如说在安全加密领域MD5、SHA等加密算法,在数据存储和查找方面有Hash表等, 以上都应用到了Hash算法。 为什么需要使用Hash? Hash算法较多的应用在数据存储和查找领域,最经典的就是Hash表,它的查询效

丿涛哥哥的博客 543

银行会计第2课:交易和核算分离的思想

核算作为会计的基础,将交易转化为可量化的信息,而会计则通过整合核算结果,实现对经济活动的全面把控。- 本质:指企业或主体之间发生的、能引起经济利益变动的具体事项,比如采购商品、销售货物、支付工资等,是客观发生的经济事实。可售产品(业务视角的核算对象) + 属性条件(核算的分类,限制等) = 核算类型(会计视角,含有科目分类内容)- 核算:会计人员根据采购发票、入库单等,将这笔交易记为“借:原材料,贷:银行存款”(对事实的会计处理)。- 特点:是核算的源头,不涉及会计处理,仅代表经济行为的发生。

ademen的博客 497

腾讯面试官问我“一致性哈希”,我丢给他 18 张图

点击上方“五分钟学算法”,选择“星标”公众号重磅干货,第一时间送达前言当架构师大刘看到实习生小李提交的记账流水乱序的问题的时候,他知道没错了:这一次,大刘又要用一致性哈希这个老伙计来解决...

程序员吴师兄的博客 345

半导体硅制造工艺

抛光液和硅片的反应速度很快,只要稍一停留,立刻便会腐蚀,因此取片时,不能在表面上留下抛光液,必须紧接着水抛,直至抛光液被全部冲去,再将片子取下。由于晶圆制造过程有各种各样的晶圆固定器和自动设备,需要严格的直径控制以减少晶圆翘曲和破碎,而单晶硅棒的外径表面并不平整且直径也比最终抛光晶片所规定的直径规格大,因此需要通过外径滚磨获得较为精确的直径。胶体的颗粒直径比磨料的颗粒直径小一个数量级,且硬度与硅相当,因此它比用磨料的机械抛光表面损伤更小,抛光出的硅片表面具有高度的镜面光洁。不受材料导电类型和电阻率的影响。

pgpaojiao的博客 2240

基于DE2-115红外解码实验

基于DE2-115红外解码实验   一、   功能描述 在同一个遥控电路中通常要使用实现不同的遥控功能或区分不同的机器类型, 这样就要求信号按一定的编码传送,编码则会由编码芯片或电路完成。对应于编码芯片通常会有相配对的解码芯片或包含解码模块的应用芯片。在实际的产品设计或业余电子制作中,编码芯片并一定能完成我们要求的功能,这时我们就需要了解所使用的编码芯片到底是如何编码的。只有知道编码方式,我...

乘风的博客 2513

一致性Hash算法(hash环)

一致性Hash(DHT)性质 考虑到分布式系统每个节点都有可能失效,并且新的节点很可能动态的增加进来,如何保证当系统的节点数目发生变化时仍然能够对外提供良好的服务,这是值得考虑的,尤其实在设计分布式缓存系统时,如果某台服务器失效,对于整个系统来说如果不采用合适的算法来保证一致性,那么缓存于系统中的所有数据都可能会失效(即由于系统节点数目变少,客户端在请求某一对象时需要重新计算其hash值(通常与...

wudiyong22的专栏 8132

SAP项目中 Waterfall vs Agile 的深度对比分析背景:方法论的演进SAP项目实施方法论经历了显著的代际更替。早期以 ASAP(Accelerated SAP) 为代表,采用经典瀑

本文对比分析了SAP项目实施中瀑布模型(ASAP)与敏捷方法(SAP Activate)的核心差异。瀑布模型采用线性流程,需求固定但变更成本高;敏捷方法则通过迭代开发实现动态调整,强调最佳实践和用户持续参与。文章指出,SAP系统的复杂性使纯粹敏捷难以实施,需在标准化与定制化间取得平衡。最终建议根据项目特性选择方法论:稳定需求适用瀑布模型,变化频繁则推荐敏捷,而SAP Activate本质上是两者的结构化融合,代表未来趋势。关键在于匹配项目实际需求,而非盲目追随方法论潮流。

金牌架构师 345

每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

五分钟让你深入了解分布式系统中常用的一致性哈希算法

Cynric 的博客 50万+

43、FMCW雷达高度计仿真

本文介绍了FMCW雷达高度计的波形级建模与仿真过程,重点模拟了着陆和倾斜两种飞行场景以评估其性能。通过结合高程数据和飞行轨迹构建雷达场景,使用自定义信号处理器分析IQ样本并估计高度。结果表明,该高度计在多数情况下满足性能要求,但也存在误差较大的点,提出了地面检测算法优化的潜在方向。

neovim7hacker的博客 135

2026最新版OpenClaw安装:Windows WSL2从零到跑通

Windows WSL2安装OpenClaw指南 本文详细介绍了在Windows系统上通过WSL2部署OpenClaw AI助理的完整流程。WSL2结合了Windows易用性和Linux高性能,特别适合Windows用户、开发者、学生和技术爱好者。文章涵盖硬件要求(推荐i5/16GB/SSD)、系统准备(Windows 10/11+WSL2)、环境部署(Python/Node.js/Redis)和OpenClaw配置(克隆/编译/初始化)等关键步骤。通过WSL2,用户可在保留Windows操作习惯的同

一键难忘的博客 2345

连肝两宿,做出这18张图,彻底让你学会“一致性哈希”一

前言 当架构师大刘看到实习生小李提交的记账流水乱序的问题的时候,他知道没错了:这一次,大刘又要用一致性哈希这个老伙计来解决这个问题了。 嗯,一致性哈希,分布式架构师必备良药,让我们一起来尝尝它。 一、满眼都是自己二十年前的样子,让我们从哈希开始 在 N 年前,互联网的分布式架构方兴未艾。大刘所在的公司由于业务需要,引入了一套由 IBM 团队设计的业务架构。 ​ 这套架构采用了分布式的思想,通过 RabbitMQ 的消息中间件来通信。这套架构,在当时的年代里,算是思想超前,技术少见的黑科技架构了。 但..

javase1086的博客 2871

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

连肝两宿,做出这18张图,彻底让你学会“一致性哈希”

前言 当架构师大刘看到实习生小李提交的记账流水乱序的问题的时候,他知道没错了:这一次,大刘又要用一致性哈希这个老伙计来解决这个问题了。 嗯,一致性哈希,分布式架构师必备良药,让我们一起来尝尝它。 一、满眼都是自己二十年前的样子,让我们从哈希开始 在 N 年前,互联网的分布式架构方兴未艾。大刘所在的公司由于业务需要,引入了一套由 IBM 团队设计的业务架构。 这套架构采用了分布式的思想,通过 RabbitMQ 的消息中间件来通信。这套架构,在当时的年代里,算是思想超前,技术少见的黑科技架构了。 但是,..

mt77621的博客 203

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

靠这18张图,我学会了一致性哈希

当架构师大刘看到实习生小李提交的记账流水乱序的问题的时候,他知道没错了:这一次,大刘又要用一致性哈希这个老伙计来解决这个问题了。嗯,一致性哈希,分布式架构师必备良药,让我们一起来尝尝它。在 N 年前,互联网的分布式架构方兴未艾。大刘所在的公司由于业务需要,引入了一套由 IBM 团队设计的业务架构。这套架构采用了分布式的思想,通过 RabbitMQ 的消息中间件来通信。这套架构,在当时的年代里,算是思想超前,技术少见的黑科技架构了。但是,由于当年分布式技术落地并不广泛,有很多尚不成熟的地方。所以,这套架构在经

JavaShark的博客 245

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

优秀!一鼓作气学会“一致性哈希”,就靠这 18 张图了

出品 | 四猿外责编 | 晋兆雨头图 |付费下载于视觉中国大家好,好久不见啦。最近快年底了,公司、部门事情太多:冲刺 KPI、做部门预算……所以忙东忙西的,写文章就被耽搁了。再加上这篇...

区块链大本营 887

鼓作气学会“一致性哈希”,就靠这 18 张图了

当架构师大刘看到实习生小李提交的记账流水乱序的问题的时候,他知道没错了:这一次,大刘又要用一致性哈希这个老伙计来解决这个问题了。 嗯,一致性哈希,分布式架构师必备良药,让我们一起来尝尝它。 1. 满眼都是自己二十年前的样子,让我们从哈希开始 在 N 年前,互联网的分布式架构方兴未艾。大刘所在的公司由于业务需要,引入了一套由 IBM 团队设计的业务架构。 这套架构采用了分布式的思想,通过 RabbitMQ 的消息中间件来通信。这套架构,在当时的年代里,算是思想超前,技术少见的黑科技架构了。 但是

被基金支配的打工人 153

一文彻底学会CSS-1

八、text- 文本相关属性什么是ActiveMQ?ActiveMQ服务器宕机怎么办?丢消息怎么办?持久化消息非常慢怎么办?消息的不均匀消费怎么办?死信队列怎么办?ActiveMQ中的消息重发时间间隔和重发次数吗?

q16974058的博客 647

两小时学会ajax,全程无废话,直接上代码,java常用框架面试

JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…oop,Spark,Storm,YARN,机器学习,云计算…[外链图片转存中…(img-fuv1Y4ke-1711814820550)]

2401_84002482的博客 267
上一篇: ”面霸“夏派卧底阿里、百度、美团等大厂带来面试题及答案
下一篇: 连肝两宿,做出这18张图,彻底让你学会“一致性哈希”
蒙塔ta
博客等级 码龄5年 4粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值