什么是一致性Hash算法?

区块链:哈希算法与一致性哈希算法 哈希算法是指通过哈希函数(Hash Function)对任意长度的输入数据(比如文件、消息、数字等)进行转换,生成一个固定长度的哈希值(Hash Value)的过程。在区块链中,哈希算法常用于区块的数据验证和区块链的安全性保证。抗冲突(collision-resistance): 即不同的输入不能产生相同的输出;信息隐藏性(information hiding): 即无法通过哈希函数的输出反推出其输入; 阅读详情


HelloWorld应用 2018-03-17 10:37:54

一、Redis集群的使用

我们在使用Redis的时候,为了保证Redis的高可用,提高Redis的读写性能,最简单的方式我们会做主从复制,组成Master-Master或者Master-Slave的形式,或者搭建Redis集群,进行数据的读写分离,类似于数据库的主从复制和读写分离。如下所示:

什么是一致性Hash算法?

同样类似于数据库,当单表数据大于500W的时候需要对其进行分库分表,当数据量很大的时候(标准可能不一样,要看Redis服务器容量)我们同样可以对Redis进行类似的操作,就是分库分表。

假设,我们有一个社交网站,需要使用Redis存储图片资源,存储的格式为键值对,key值为图片名称,value为该图片所在文件服务器的路径,我们需要根据文件名查找该文件所在文件服务器上的路径,数据量大概有2000W左右,按照我们约定的规则进行分库,规则就是随机分配,我们可以部署8台缓存服务器,每台服务器大概含有500W条数据,并且进行主从复制,示意图如下:

什么是一致性Hash算法?

由于规则是随机的,所有我们的一条数据都有可能存储在任何一组Redis中,例如上图我们用户查找一张名称为”a.png”的图片,由于规则是随机的,我们不确定具体是在哪一个Redis服务器上的,因此我们需要进行1、2、3、4,4次查询才能够查询到(也就是遍历了所有的Redis服务器),这显然不是我们想要的结果,有了解过的小伙伴可能会想到,随机的规则不行,可以使用类似于数据库中的分库分表规则:按照Hash值、取模、按照类别、按照某一个字段值等等常见的规则就可以出来了!好,按照我们的主题,我们就使用Hash的方式。

二、为Redis集群使用Hash

可想而知,如果我们使用Hash的方式,每一张图片在进行分库的时候都可以定位到特定的服务器,示意图如下:

什么是一致性Hash算法?

上图中,假设我们查找的是”a.png”,由于有4台服务器(排除从库),因此公式为

hash(a.png) % 4 = 2

,可知定位到了第2号服务器,这样的话就不会遍历所有的服务器,大大提升了性能!

三、使用Hash的问题

上述的方式虽然提升了性能,我们不再需要对整个Redis服务器进行遍历!但是,使用上述Hash算法进行缓存时,会出现一些缺陷,主要体现在服务器数量变动的时候,所有缓存的位置都要发生改变!

试想一下,如果4台缓存服务器已经不能满足我们的缓存需求,那么我们应该怎么做呢?很简单,多增加几台缓存服务器不就行了!假设:我们增加了一台缓存服务器,那么缓存服务器的数量就由4台变成了5台。那么原本

hash(a.png) % 4 = 2

的公式就变成了

hash(a.png) % 5 = ?

, 可想而知这个结果肯定不是2的,这种情况带来的结果就是当服务器数量变动时,所有缓存的位置都要发生改变!换句话说,当服务器数量发生改变时,所有缓存在一定时间内是失效的,当应用无法从缓存中获取数据时,则会向后端数据库请求数据!

同样的,假设4台缓存中突然有一台缓存服务器出现了故障,无法进行缓存,那么我们则需要将故障机器移除,但是如果移除了一台缓存服务器,那么缓存服务器数量从4台变为3台,也是会出现上述的问题!

所以,我们应该想办法不让这种情况发生,但是由于上述Hash算法本身的缘故,使用取模法进行缓存时,这种情况是无法避免的,为了解决这些问题,Hash一致性算法(一致性Hash算法)诞生了!

四、一致性Hash算法的神秘面纱

一致性Hash算法也是使用取模的方法,只是,刚才描述的取模法是对服务器的数量进行取模,而一致性Hash算法是对2^32取模,什么意思呢?简单来说,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希环如下:

什么是一致性Hash算法?

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

下一步将各个服务器使用Hash进行一个哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置,这里假设将上文中四台服务器使用IP地址哈希后在环空间的位置如下:

什么是一致性Hash算法?

接下来使用如下算法定位数据访问到相应服务器:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器!

例如我们有Object A、Object B、Object C、Object D四个数据对象,经过哈希计算后,在环空间上的位置如下:

什么是一致性Hash算法?

根据一致性Hash算法,数据A会被定为到Node A上,B被定为到Node B上,C被定为到Node C上,D被定为到Node D上。

说到这里可能会有疑问,为什么hash一致性的数据空间范围是2^32次方?

因为,java中int的最大值是2^31-1最小值是-2^31,2^32刚好是无符号整形的最大值;

进一步追尾基础,为什么java中int的最大值是2^31-1最小值是-2^31?

因为,int的最大值最小值范围设定是因为一个int占8个字节,一个字节占4位,二进制中刚好是32位。(基础忘记的需要恶补一下了)

五、一致性Hash算法的容错性和可扩展性

现假设Node C不幸宕机,可以看到此时对象A、B、D不会受到影响,只有C对象被重定位到Node D。一般的,在一致性Hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响,如下所示:

什么是一致性Hash算法?

下面考虑另外一种情况,如果在系统中增加一台服务器Node X,如下图所示:

什么是一致性Hash算法?

此时对象Object A、B、D不受影响,只有对象C需要重定位到新的Node X !一般的,在一致性Hash算法中,如果增加一台服务器,则受影响的数据仅仅是新服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它数据也不会受到影响。

综上所述,一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。

六、Hash环的数据倾斜问题

一致性Hash算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题,例如系统中只有两台服务器,其环分布如下:

什么是一致性Hash算法?

此时必然造成大量数据集中到Node A上,而只有极少量会定位到Node B上。为了解决这种数据倾斜问题,一致性Hash算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器IP或主机名的后面增加编号来实现。

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

什么是一致性Hash算法?

同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如定位到“Node A#1”、“Node A#2”、“Node A#3”三个虚拟节点的数据均定位到Node A上。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。

七、总结

上文中,我们一步步分析了什么是一致性Hash算法,主要是考虑到分布式系统每个节点都有可能失效,并且新的节点很可能动态的增加进来的情况,如何保证当系统的节点数目发生变化的时候,我们的系统仍然能够对外提供良好的服务,这是值得考虑的!

关注微信公众号和今日头条,精彩文章持续更新中。。。。。

什么是一致性Hash算法?

什么是一致性Hash算法?

普通哈希算法与一致性hash原理及应用 普通哈希算法与一致性哈希算法在缓存或者数据库中的应用深入分析 阅读详情

相关推荐

consistent:Node.JS 的快速一致性哈希模块

持续的 Node.JS 的一致性哈希模块 安装 npm install consistent 用法 var consistent = require ( 'consistent' ) ; var ring = consistent ( { members : [ "member1" , "member2" , { key : "member3" , weight : 1.5 // optional, default weight is 1 } ] , hash : 'md5' // can use 'md5' or 'murmurhash' } ) ; console . log ( ring . get ( 'some key' ) ) ; // outputs member1 or member2 or membe

一致性哈希算法原理详解

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

张维鹏的博客 5万+

consistent-hashing:一致哈希的简单JavaScript实现

一致的散列 这是一致性哈希的简单JavaScript实现。 有关一致性哈希的更多信息,请参见。 安装 使用以下命令安装依赖项: $ npm install 用法 var ConsistentHashing = require ( './consistent_hashing' ) ; var nodeNames = [ 'node1' , 'node2' , 'node3' , 'node4' , 'node5' , 'node6' ] ; var replicaCount = 100 ; var cons = new ConsistentHashing ( nodeNames , replicaCount ) ; var chars = [ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L'

js 一致性hash算法

https://blog.youkuaiyun.com/sparkliang/article/details/5279393 npm库https://www.npmjs.com/package/consistent-hashing

sun 741

matinal:S4 HANA 详解ACDOCA与BSEG的区别都在这了

当你在Coding Block中添加自定义字段的时候

matinal 當冬夜漸暖 。公众号:matinal 4596

vscode配置OpenGL开发环境【详细】

vscode配置OpenGL开发环境【详细】

weixin_43952192的博客 3万+

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

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

丿涛哥哥的博客 544

FastAPI + Layui:打造企业级敏捷开发后台管理系统

本文详细介绍了如何使用FastAPI和Layui构建高效的企业级后台管理系统。FastAPI提供高性能的异步API支持,而Layui则简化了前端开发流程,两者结合可实现快速开发和部署。文章涵盖了从环境搭建、核心组件开发到性能优化的全流程,特别适合需要敏捷开发的企业项目。

weixin_29045585的博客 556

一致性hash算法

一致性hash算法Hash算法的作用Hash算法的冲突一致性hash算法一致性hash算法的原理容错性虚拟节点 Hash 算法也叫做散列算法,他可以让任意长度的数据M映射成为长度固定的值H。 Hash算法的作用 Hash算法的第一个作用就是数据的快速存储与查找。写过程序的人都知道,基本上主流的编程语言里面都有个数据结构叫做Map(dictionary或者 hash table)。它是根据key来直...

程序那些事 7445

基于STM32电压检测和电流检测

1.可测量直流电压0~36V,适用于低电压电子电路中。 2.可测量直流电0~5A范围内,目前采用的ACS712测量量程为5A,该模块有多个量程,可测量到20A 3.实时功率监测 4.电池电量监测(采用电压压降方式计算)

weixin_44453694的博客 6万+

DICOM标准:DICOM医学影像中的覆盖层(Overlay)概念详解

DICOM标准:深入详解DICOM医学影像中的覆盖层(Overlay)

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1565

一致性哈希算法详解

1、使用哈希算法有什么问题? 假设有一个由A、B、C三个节点组成的KV服务,每个节点存放不同的KV数据。通过哈希算法,每个key都可以寻址到对应的服务器,比如,查询key是key-01,计算公式为hash(key-01)%3,经过计算寻址到了编号为1的服务器节点A 但如果服务器数量发生变化,基于新的服务器数量来执行哈希算法的时候,就会出现路由寻址失败的情况,Proxy无法找到之前寻址到的那个服务器节点 假如3个节点不能满足业务需求了,这时增加了一个节点,节点的数量从3变化为4,那么之前的hash(key

hxt的博客 1万+

[Dify实战] 品牌舆情速览:多渠道抓取、聚类情绪、生成日报-带绑定资源

摘要: 品牌舆情监测面临多渠道信息分散、手工处理效率低的痛点。Dify舆情速览助手通过自动化流程(数据抓取→情绪聚类→日报生成)帮助快速识别热点与风险。方案核心包括: 结构化处理:按情绪(正/中/负)聚类,分级标注风险事件; 日报输出:含热点摘要、趋势分析及处置建议(动作+团队+时间窗口); 质量控制:数据去噪、黑名单过滤,结合人工复核确保合规性。 落地需明确数据源分级(如权威媒体优先)、设置情绪阈值,并建立"发现-响应-复盘"闭环机制,提升舆情应对效率。 (字数:150)

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 300

【hash】哈希算法、哈希碰撞、一致性哈希

一、hash算法 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 哈...

鲜衣怒马楼兰月 4579

IgH EtherCAT 从入门到精通:第 29 章 实战:EoE 远程维护通道搭建

摘要:本章详细介绍了基于EoE(Ethernet over EtherCAT)协议的远程维护通道搭建方案。主要内容包括:1)网络架构设计,采用管理网络与EoE子网隔离的方案;2)从站EoE支持确认与IP地址配置,提供API和命令行两种方式;3)路由/交换两种部署模式,重点推荐路由模式并给出自动化配置脚本;4)SSH远程访问配置,包括直接连接和跳板访问两种方式;5)安全加固措施,如防火墙规则、SSH密钥认证等;6)故障恢复机制与性能注意事项。该方案实现了通过EtherCAT网络对从站设备的远程SSH访问、文件

从事嵌入式linux android驱动开发,拥有全栈能力 365

Android SystemUI——自定义状态栏和导航栏(十二)

通过前面的文章内容,我们了解了Android系统原生的状态栏StatusBar和车载系统状态栏CarStatusBar的启动流程以及视图构建流程,这里我们来简单的看一下自定义状态栏和导航栏视图的实现流程。

小旭的专栏 2012

【算法】哈希算法——murmurhash一致性哈希算法

Murmurhash: 是一种非加密型哈希函数,适用于一般的哈希检索操作。高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc++、nginx、libmemcached等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的CityHash算法。 一致性哈希算法的主要步骤: 首先求出缓存服务器结...

IT_Mitchell的博客 5941

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Google Jump Consistent Hash 一致性哈希算法

接触到这个一致性哈希算法是在腾讯音乐的讲座中,用于在线扩容 如图中的例子,本来只有group0和group1,现在要增加一个group2用于推送新的数据,如果使用不满足单调性要求的hash方法,首先向group2推送数据,然后向group0推送数据,如下图所示: 此时,group1还未更新,group0和group2已经更新,在这个时间段,数据docC是丢失的。 但是如果满足单调性,在增加一个group的情况下,原来在group0的docC只会在原来的group0或者新的group2,不可..

ltochange的博客 951

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

温度PID控制PLC程序

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

一致性哈希算法与Java实现

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

清晨 1万+

Devexpress16.2.6破解工具

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

一致性哈希算法分区

目录1. 哈希算法分区的缺点2. 一致性哈希算法2.1 一致性哈希环的概念2.2 将服务器映射到Hash环2.3 数据落入服务器规则2.4 一致性哈希算法分区优缺点2.4.1 优点2.4.2 缺点 1. 哈希算法分区的缺点 虽然哈希算法能做到数据分区,能起到负载均衡+分而治之的作用 缺点:每次扩容缩容,数据和服务器的映射关系都会发生变化,需要将所有数据进行再平衡 2. 一致性哈希算法 一致性哈希算法解决了哈希算法的问题。当服务器的数量发生变化,尽量只对部分服务器产生影响 2.1 一致性哈希环的概念 一致性H

Bulut0907 1230

哈希算法和一致性hash算法

1、哈希算法 在分布式的环境下,我们搭建了一个redis集群,假如有n台机器,每次来的请求,经过hash运算,pos = key % n,pos就是对应的访问机器。 但是在分布式场景下,如果一台机器挂了,那么机器数量就发生了变化,之前的数据就要重新进行hash计算位置并转移,这样就导致了一个比较大的性能开销。所以后面引入了一种算法,叫做一致性hash算法。 2、一致性hash算法 在分布式环境下,来降低元素位置的集群服务受机器数量的影响。 2.1 实现原理: 避免使用固定值取模进行定位,改为范围定位。 [0

qq_35843514的博客 825

一致性哈希算法

我们在使用Redis的时候,为了保证Redis的高可用,提高Redis的读写性能,最简单的方式我们会做主从复制,组成Master-Master或者Master-Slave的形式,或者搭建Redis集群,进行数据的读写分离,类似于数据库的主从复制和读写分离 比如现在有大概2000W左右的数据,按照我们约定的规则进行分库,规则就是随机分配,我们可以部署8台缓存服务器,每台服务器大概含有500W条数据...

Lyzxii 2413

常见一致性哈希算法简析

在分布式系统中,负载均衡和数据分布是确保系统高效运行的关键。传统的Hash算法虽然能在一定程度上实现数据的均匀分布,但在节点增减时,需要重新分配所有数据,这会导致巨大的开销和潜在的性能问题。为了解决这个问题,一致性Hash算法应运而生。本文将详细介绍常见的几种一致性Hash算法的原理。

qq_40529346的博客 1088

一致性hash java_一致性哈希算法原理分析及实现

一致性哈希算法常用于负载均衡中要求资源被均匀的分布到所有节点上,并且对资源的请求能快速路由到对应的节点上。具体的举两个场景的例子:1、MemCache集群,要求存储各种数据均匀的存到集群中的各个节点上,访问这些数据时能快速的路由到集群中对应存放该数据的节点上;并且要求增删节点对整个集群的影响很小,不至于有大的动荡造成整体负载的不稳定;2、RPC过程中服务提供者做N个节点的集群部署,为了能在服务上维...

weixin_35663032的博客 204
上一篇: Druid中的Kafka Indexing Service源码分析
下一篇: 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值