图解一致性哈希算法的基本原理

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

一致性哈希的基本原理

一致性哈希算法是将每个Node节点映射到同一个圆上。将各Node的key采用hash计算,可得到一个整数数组。将该数组排序后,首尾相连即是一个圆。如下图所示

 

简单来说,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希环如下:

 

整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到2^32-1,也就是说0点左侧的第一个点代表2^32-1, 0和2^32-1在零点中方向重合,我们把这个由2^32个点组成的圆环称为Hash环。

假如有4个服务器节点,分别为NodeA、NodeB、NodeC和NodeD,根据他们的IP或者服务名称计算hash值对2^32取模就可以分别得到它们在圆环上的位置。

 

接下来使用如下算法定位数据访问到相应服务器:  将数据key使用相同的函数Hash函数计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针找到的第一个服务器就是其本次访问的服务器。

 

容错性和可扩展性

 

假如Node C此时宕机,A、B、D节点不受影响,受影响的是此节点C到其前面一个节点(Node B)之间的环空间会受影响。但是如果我们在Node C宕机时及时将其从圆环中移除,则原本可能受影响的环空间可以沿着顺时针找到下一个节点(Node D)。

 

 

新增节点X,那么节点X到其前面一个节点(Node B)环上的对象会从原本请求的节点(Node D)调整到Node X节点上。所以一致性哈希算法有非常好的容错性和可扩展性。 

 

解决Hash环的倾斜问题

一致性Hash算法在服务节点太少时,往往会出现节点分布不均匀的情况,如下图所示

 

这样就导致服务器请求不均衡,请求到Node A上的对象远远大于请求到节点B上的对象。为了解决哈希环倾斜的问题往往在实际应用一致性哈希算法时会引入”虚拟节点”,

这些由实际节点虚拟复制而来的节点被称为"虚拟节点",即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器IP或主机名的后面增加编号来实现。

 

例如上面的情况,可以为每台服务器计算三个虚拟节点,于是可以分别计算 “Node A#1”、“Node A#2”、“Node A#3”、“Node B#1”、“Node B#2”、“Node B#3”的哈希值,于是形成六个虚拟节点:

 

由于hash是随机的,所以虚拟节点越多hash环上的节点分布就会越均匀

 

一致性哈希的性质

1.平衡性(Balance)

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

 

2.单调性(Monotonicity)

单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲区加入到系统中,那么哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲区中去,而不会被映射到旧的缓冲集合中的其他缓冲区。简单的哈希算法往往不能满足单调性的要求,如最简单的线性哈希:x = (ax + b) mod (P),在上式中,P表示全部缓冲的大小。不难看出,当缓冲大小发生变化时(从P1到P2),原来所有的哈希结果均会发生变化,从而不满足单调性的要求。哈希结果的变化意味着当缓冲空间发生变化时,所有的映射关系需要在系统内全部更新。而在P2P系统内,缓冲的变化等价于Peer加入或退出系统,这一情况在P2P系统中会频繁发生,因此会带来极大计算和传输负荷。单调性就是要求哈希算法能够应对这种情况。

 

3. 分散性(Spread)

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

 

4. 负载(Load)

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

 

5. 平滑性(Smoothness)

平滑性是指缓存服务器的数目平滑改变和缓存对象的平滑改变是一致的。

 

以上内容主要整理自:https://blog.youkuaiyun.com/my8688/article/details/85264880

从工程实践的角度理解一致性哈希算法(Consistent Hashing) 一致性哈希算法 阅读详情

相关推荐

DAC8568 Controller

DAC8568 ControllerDAC8568 简介串行接口三级目录 DAC8568 简介 PIN Description Name Description LDAC‾\overline{LDAC}LDAC load DACs SYNC‾\overline{SYNC}SYNC 低电平有效,电平触发控制, 该输入为输入数据的帧同步信号. 当SYNC为低,使能DAC内输入移位寄存器,并在随后的所有时钟沿采样数据。 在第32个时钟之后,DAC更新输出。 若不到32个时钟SYNC被置高(即

u010170039的博客 5134

一致性哈希算法原理详解

(1)一致性哈希算法将整个哈希值空间按照顺时针方向组织成一个虚拟的圆环,称为 Hash 环; (2)接着将各个服务器使用 Hash 函数进行哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,从而确定每台机器在哈希环上的位置; (3)最后使用算法定位数据访问到相应服务器:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针寻找,第一台遇到的服务器就是其应该定位到的服务器

张维鹏的博客 5万+

R语言实战:非正态数据下的Scheirer–Ray–Hare检验全流程解析

本文详细解析了在R语言中执行Scheirer–Ray–Hare检验的全流程。当实验数据不符合正态分布时,该非参数检验是分析两因素设计(包括主效应和交互效应)的有效工具。文章从原理、环境配置、数据导入、核心代码到结果解读与报告撰写,提供了完整的实战指南,并附有常见的避坑建议。

weixin_29061465的博客 398

5分钟带你理解一致性Hash算法。

QQ用得起来越少了,现在就加入300+技术微信群,公众号回复"微信群"即可加入。 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用...

weixin_33901843的博客 337

BAQ压缩原理

BAQ——Block Adaptive Quantization,块自适应量化,一种数据压缩算法。

2876

【逐函数讲解ORB_SLAM3源码】获取普通帧率、关键帧、IMU数据

获得imu的旋转 mRwc * mImuCalib.mTcb.rotationMatrix(); Sophus::SE3 mTwc 创建ORB_SLAM3系统 Create SLAM system. It initializes all system threads and gets ready to process frames. ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::IMU_RGBD, true, 0, file_nam

小秋 AI SLAM 入门实战教程 1245

一致性Hash算法原理详解

一致性Hash算法原理详解

tiantian929的博客 1938

第十二章 供水管网水力模型软件介绍

本文介绍了国内外主要供水管网建模软件及其特点,重点分析了某高建模软件V14的创新功能。国际主流软件包括开源的EPANET、商业软件InfoWorksWS、WaterGEMS和MIKEURBAN,各具特色但存在应用局限。某高V14软件实现了管网GIS与模型一体化管理,采用一G多网、一网多模、一模多案、网模合一技术路线,支持全信息模型建立和动态数据更新。其创新点包括水量分配理念革新(精确/模糊匹配、三种用水模式)和首创Web服务功能。通过并发计算、GPU加速等技术优化性能,具有较高性价比。

weixin_45258875的博客 210

一致性Hash算法原理

一、前言 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用。 但是普通的余数hash(hash(比如用户id)%服务器机器数)算法伸缩性很差,当新增或者下线服务器机器时候,用户id与服务器的映射关系会大量失效。一致性hash则利用hash环对其进行了改进。 二、一致性Ha...

u010988549的专栏 806

Python 爬虫实战:医学临床指南爬取(含 PDF 解析与结构化存储)

在当今数字化时代,医学临床指南作为医生进行科学诊疗的重要参考资料,包含大量经过临床验证的诊疗路径和建议。这些指南通常发布在权威医学网站上,数量庞大且更新频繁。如何自动化地抓取并存储这些指南,成为医疗数据分析、医学研究以及医疗 AI 模型训练等工作的关键第一步。本文将系统讲解如何利用 Python 爬虫技术从权威医学网站爬取临床指南内容,并实现 PDF 解析与结构化存储。

u014481728的博客 451

【系统架构设计师】论文:论虚拟现实技术的应用与发展

虚拟现实技术是当前科学研究的热点,同时也是国家大力支持发展的核心技术之一。所谓虚拟现实,就是通过计算机等虚拟手段来构造一个非常接近真实世界的虚拟环境,它主要体现在视觉、触觉、嗅觉等方面的逼真模拟来达到高度的沉浸性,也就是如我们通常所说的“身临其境”。

数据知道的博客 1万+

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

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

smf12138的博客 1450

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

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

图解一致性哈希算法,一篇就吃透!

这种虽然有三个节点,但所有数据都存储在节点C上,一点也不均衡,当集群扩容或收缩时,受影响的数据过多,相当于退化为了普通哈希,如果节点C被移除了,那么根据规则节点C上的数据就会迁移到节点B上,若数据量过多超过了节点B的处理上限,那么节点B就会出问题,以此类推可能出现一连串的系统瓶颈问题,直到整个系统瘫痪。如上述的集群扩容,集群收缩也是同样的情况,所以这种对机器数量取模的hash函数,在集群扩容和收缩时都有非常大的局限性,为了解决该问题,一致性哈希算法应运而生~完全不用迁移数据吗?

Zj_boring的博客 1927

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

图解什么是一致性哈希算法

1. 写在前面周末就像太阳,总会到来,也总会离开。此刻,没错,是周六呀!还是双休那种!昨晚在B站看了几个长视频,导致2点才睡觉,早上一觉醒来已经10点了。在这里温馨提示各位盆友们,虽然我...

weixin_41385912的博客 537

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

图解一致性哈希算法

图解一致性哈希算法

blblccc 249

图解一致性哈希算法,看这一篇就够了!

有些朋友一听到算法就头大,其实大可不必,一致性哈希算法听起来高大上,其实非常简单。接下来开始介绍什么是一致性哈希算法,它解决了什么问题。一致性哈希(Consistent Hash)算法是1997年提出,是一种特殊的哈希算法,目的是解决分布式系统的数据分区问题:当分布式集群移除或者添加一个服务器时,必须尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。前面说了一致性哈希算法的原理以及扩容缩容的问题。

weixin_44917365的博客 216

一致性哈希算法

一致性哈希算法图解 一致性哈希算法-java实现

qq_28743891的博客 259

图解一致性哈希算法,看这文就够了!

作者 |LemonCoder来源 |后端技术学堂(ID:lemon10240)很多同学应该都知道什么是哈希函数,在后端面试和开发中会遇到「一致性哈希」,那么什么是一致性哈希呢?名字听...

优快云资讯 3255

一致性哈希算法与Java实现

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

小僧下山踏红尘 178

c++ 哈希_图解一致性哈希算法,分布式缓存就是这么简单

本文转载自微信公众号,孤独烟本文故事绝对真实,如有雷同,绝对不是巧合!话说前几天有一次,某大厂的二面。然后呢,烟哥那天刚好有事,所以去不了。于是就约了一场视频面试了!于是呢,烟哥提前十分钟在公司里头找了一个厕所的坑位,然后进去随手一锁门….(以下省略10000字)…唉…我竟然…我竟然…我竟然又带薪上厕所了,而且上了一小时!我有罪!额,是这样的,大厂的厕所是有雅间的。所以环境还马马虎虎,鼻子还是正常...

weixin_39639514的博客 160

【转载】16张图解带你掌握一致性哈希算法

不同的负载均衡算法适用的业务场景也不同的。轮训这类的策略只能适用与每个节点的数据都是相同的场景,访问任意节点都能请求到数据。但是不适用分布式系统,因为分布式系统意味着数据水平切分到了不同的节点上,访问数据的时候,一定要寻址存储该数据的节点。哈希算法虽然能建立数据和节点的映射关系,但是每次在节点数量发生变化的时候,最坏情况下所有数据都需要迁移,这样太麻烦了,所以不适用节点数量变化的场景。为了减少迁移的数据量,就出现了一致性哈希算法。

atwdy的博客 198

五分钟理解一致性哈希算法(consistent hashing)

本文章转载自 http://blog.youkuaiyun.com/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正...

weixin_30535843的博客 108
上一篇: 解决go mod拉取etcd依赖包报错的问题
下一篇: golang实现一致性哈希算法
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值