一致性哈希算法

Redis一致性哈希算法和哈希槽区别 一致性哈希算法和哈希槽(Hash Slot)都是在分布式系统中用于数据分片和节点映射的技术,主要应用于像 Redis 集群这样需要将数据分散存储在多个节点的场景。一致性哈希是在哈希取余算法基础之上优化的,分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不对了。用于解决分布式缓存系统中的数据选择节点存储问题和数据选择节点读取问题以及在增删节点后减少数据缓存的消失范畴,防止雪崩的发生。 阅读详情

Hash算法

  Hash算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式——百度百科 

  通俗点说就是让任意长度的数据映射成为长度固定的值。

Hash算法的作用

  一、就是数据的快速存储以及插入、删除、查找。一般使用数据结构Map(Dictionary/Hashtable)。它是根据key来直接访问value的数据结构。将key通过一定的Hash函数计算变成通用一致的格式(索引),就可以实现类似数组的快速查找。

  二、Hash算法也可以看做是一种加密算法,但是这个加密算法只有加密的过程没有解密的过程,是不可逆的。各种加密货币中的密钥体系或多或少都用到了Hash算法,其中比较有名的像:MD4,MD5,SHA-1,SHA-2,SHA-3等。除了加密货币,Hash的加密算法在文件校验,数字签名,鉴权协议等方面都有非常重要的作用。

Hash算法在分布式应用中的不足

  在分布式系统中,如果数据是存储在很多个节点中,由于节点的状态是不稳定的,可能新增节点也可能随时有节点下线,节点的个数和在线时间都是不稳定的。要将数据存储到具体的节点上,如果我们采用普通的Hash算法进行路由,将数据映射到具体的节点上,如key % N,key是数据的key,N是节点数,如果有一个节点加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存就失效了。如何在这样的不稳定的环境中保证数据的正确命中,不会因为节点个数的增减而导致大部分数据的失效,这就是一致性Hash算法需要解决的问题。

一致性哈希算法

  一致性哈希提出了在动态变化的Cache环境中,哈希算法应该满足的4个适应条件——百度百科

  1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,即均匀分布。这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。

  2、单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。 

  3、分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。 

  4、负载(Load):负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。

一致性哈希算法原理:

  一致性Hash算法是在1997年由麻省理工学院提出的一种分布式Hash实现算法。

环形Hash空间

  一致性哈希算法核心就是使用常用的Hash算法将key映射到一个具有2^32次方个桶空间中,即0-(2^32-1)的数字空间中。我们可以将这些数字头尾相连,想象成一个闭合的环形。圆环上面有2^32个节点位置。算法首先计算出存储节点在圆环上的位置。具体可以选择服务器的ip或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置。这一点是为了保证算法的分散性:节点的位置跟具体多少个节点没关系,只跟节点的内在特性有关系。

将数据通过Hash算法映射到环上

   我们假设有4个节点:node1,node2,node3,node4。计算好他们的位置之后,接下来我们就需要就计算出各个不同的key的存储位置,将key用同样的算法计算出Hash值,从而确定其在数据环上的位置,然后从此位置沿着顺时针寻找,遇到的第一个服务器就是该数据应该存储的节点。

  如下图所示,有A,B,C,D四个数据对象,经过Hash计算之后,其在图中的位置和应该存在的节点位置如下:其中A存储在node1节点,B存储在node2节点,C存储在node3节点,D存储在node4节点。

节点的删除

  下面我们考虑下节点挂掉的情况,如下图所示,当node4节点挂掉之后,按照一致性hash算法的原则,A,B,C存储节点不做任何变化,只有D节点会重新存储到node1上。如下图所示:

节点的增加

   同样的,假如我们添加了一个node5节点,其hash值在C和node3之间,则只有C的存储位置需要转移。如下图所示:

  由此可见,一致性hash算法在系统节点变化的时候,只需要重定向一小部分数据的存储位置,具有较强的容错性和可扩展性。

虚拟节点

  当系统中节点很少的情况下,或者现有的节点计算出来的Hash值比较接近的情况下,如上图所示,所有A-B这一段路径上的数据都会存储在node1上面,很明显这会导致node1上面数据过多,不满足系统分散性的需求。

   解决办法就是我们可以创建一些虚拟节点,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,这样就可以解决数据倾斜的问题。如下图所示:

redis 一致性哈希算法 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。 阅读详情

相关推荐

Ketama一致性哈希算法源码剖析与实战

分布式哈希技术是构建大规模分布式系统的关键技术之一,它通过将数据合理地分布在多个服务器节点上,从而实现系统的高可用性与可扩展性。该技术的核心在于哈希函数的应用,通过哈希函数将数据或请求映射到特定的服务器节点,以实现快速的定位和访问。在分布式系统中,传统哈希方法面临着节点增减导致数据迁移的挑战,这直接影响系统的稳定性和性能。为了应对这一问题,一致性哈希算法应运而生,它通过特定的算法设计减少了节点变化对系统的影响,成为分布式存储和缓存系统中广泛采纳的解决方案。

weixin_29317963的博客 850

说一说Redis中如何使用一致性哈希算法

Redis一致性哈希算法解析:从传统哈希到分布式优化 本文系统性地介绍了Redis中一致性哈希算法的原理与实现。首先通过传统哈希算法在节点扩容时的痛点引入问题,详细讲解了一致性哈希的环状结构设计及其平滑扩容优势。随后剖析了Redis Cluster采用的16384槽位变种实现,以及虚拟节点技术如何解决数据分布不均问题。文章还对比了一致性哈希的优缺点,并通过社交平台缓存案例展示了实际应用场景。最后总结了渐进式扩容等最佳实践,为构建高可用Redis集群提供了实用指导。

从不水文,坚持创作,加油 1327

5步搞定ABB机器人RobotStudio与S7-1500PLC的Profinet通讯(附PLCSIM调试技巧)

本文详细介绍了如何利用RobotStudio与TIA Portal软件,结合PLCSIM Advanced仿真器,在零硬件条件下实现ABB机器人与西门子S7-1500 PLC之间的Profinet通讯虚拟调试。通过五个核心步骤,从环境搭建、网络配置、信号映射到联合仿真与高级调试,帮助工程师在项目前期高效验证逻辑、压缩现场调试周期,并掌握实用的PLCSIM调试技巧。

weixin_29188043的博客 505

一致性哈希算法解析

想象我们的网络世界是一个巨大的环形摩天轮,上面有无数的座位,每个座位都代表了一个存储空间。现在,我们需要将三万张照片安排到这个摩天轮的三台机器上。这些机器我们可以想象成三个大车厢,每个车厢可以装载一部分照片。在简单的哈希算法中,我们通过计算每张照片的哈希值来决定它应该放在哪个车厢。但如果我们决定在摩天轮上增加一个新的车厢,这时问题就来了。原本均匀分布的照片因为新车厢的加入,许多照片需要被重新分配到不同的车厢中,这就像是你已经坐好了,突然被告知要换一个座位,造成了大混乱。

avery66666的博客 831

达梦数据守护集群监视器详解与应用指南

主库/备库:承担读写和只读服务的数据节点Redo 日志:记录数据库变更的核心日志Redo 日志传输:主备库间的日志同步机制Redo 日志重演:备库重做日志的应用过程守护进程 (dmwatcher):实例级别的监控和管理组件监视器 (dmmonitor):集群级别的监控和管理工具监视器作为数据守护系统的重要组成部分,提供了集群监控、故障管理和状态确认等关键功能。达梦数据守护集群监视器是维护数据库高可用性的关键工具。

huanhuanzhou blog 1058

FAST-LIO2实战:如何在无人机上部署并实现厘米级定位(附ROS配置全流程)

本文详细介绍了如何在无人机上部署FAST-LIO2激光雷达惯性里程计系统,以实现厘米级精确定位。内容涵盖从硬件选型(如激光雷达与机载计算机)、软件环境配置(ROS Noetic)、传感器标定,到FAST-LIO2参数调优、与PX4飞控集成以及实际飞行测试的全流程。重点解决了实时定位中的外参标定、数据同步等关键问题,为无人机在无GPS或复杂光照环境下提供稳定可靠的定位解决方案。

weixin_29062865的博客 250

一致性哈希算法【图解理论 + 代码实现】

简单来说,就是比如现在我们来了一个用户请求,假如它叫张三,并被负载均衡到2号服务器上,那么2号服务器就保存了他的登录状态信息,但是如果下一次张三发出请求,他又被映射到了一号服务器上,但一号服务器上没有保存有关张三的会话信息,那么1号服务器怎么知道张三的登录状态呢?例如,服务端需要增删查看数据,如果服务端直接去数据库中查找,效率太低,所以我们需要将一些热点数据先缓存起来,以便下次查找时提高效率,假设现在我们以用户id作为。所以,综合上述的两个场景可以看出,普通的哈希算法是存在许多问题的,所以我们需要引入。

smf12138的博客 1450

基于deepseek本地模型的本地知识库构建

通过以上步骤,你已经成功构建了一个基于 AnythingLLM 和 LM Studio 的本地知识库。这个系统不仅能够高效地存储和检索知识,还能结合强大的语言模型生成准确的回答。你可以根据自己的需求进一步扩展和优化这个系统,比如增加更多的文档格式支持、优化检索算法等。

qq_30178745的博客 1381

27.3 一致性哈希算法介绍

hash(散列、杂凑)函数,是将任意长度的数据映射到有限长度的域上。直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹)举例 md5sum哈希算法一致性哈希算法优点特性迁移过程底层算法导致的不均衡性。

福大大架构师每日一题 905

OPNET网络仿真实验

外网

嚴 帅的博客 1万+

深入解析UDS 0x19服务:DTC状态掩码与故障诊断实战

本文深入解析了UDS诊断协议中的核心0x19服务(ReadDTCInformation),重点拆解了DTC状态掩码(DTCStatusMask)的八个状态位及其在故障生命周期中的联动逻辑。通过实战案例,详细说明了从故障发生、确认到清除的全过程,并介绍了如何利用该服务进行深度诊断,包括读取扩展数据(如冻结帧)和避免常见开发误区,是理解汽车ECU故障管理机制的关键。

weixin_29248313的博客 323

一致性哈希算法介绍

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。      一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1

福星志 2512

科研生产力革命:手把手教你打造基于大模型的Research Agent(文献调研+论文写作+思路激发)

本文介绍了如何利用Research Agent(科研智能体)提升科研效率。Research Agent能自主完成文献检索、信息整合和报告生成全流程,省去50%以上的基础工作时间。文章详细讲解了搭建运行环境的方法,包括工具准备和MetaGPT配置,并提供了两种实战方案:基础版Search-O1和专业版MetaGPT Research Agent。此外,还介绍了如何为垂直领域定制Agent,以及优化检索效果、改善报告逻辑等技巧。最后列举了学术研究、行业分析、内容创作和个人学习四大应用场景,帮助用户将AI从聊天工

LXY_LOVE36的博客 266

一致性哈希算法与Java实现

一致性哈希算法是分布式系统中常用的算法。比如,一个分布式的存储系统,要将数据存储到具体的节点上, 如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数, 如果有一个机器加入或退出这个集群,则所有的数据映射都无效了。

小僧下山踏红尘 178

华为OD机试2025C卷 - 精准核酸检测 (C++ & Python & JAVA & JS & GO)

华为OD机试2025C卷 精准核酸检测,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 1707

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 如何在O(1)时间复杂度获取栈中最大值和最小值
下一篇: 一次性密码本(绝对无法破解)
ali48
博客等级 码龄6年 31粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值