一致性hash算法

简介: 一致性hash算法

一致性hash算法



Hash 算法也叫做散列算法,他可以让任意长度的数据M映射成为长度固定的值H。


Hash算法的作用


Hash算法的第一个作用就是数据的快速存储与查找。写过程序的人都知道,基本上主流的编程语言里面都有个数据结构叫做Map(dictionary或者 hash table)。它是根据key来直接访问结果的数据结构。key的种类多种多样,形式各异,怎么通过key来快速查找结果呢?如果将key通过一定的Hash算法变成通用一致的格式(索引),就可以实现这一功能。


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


Hash算法的冲突


根据Hash算法的定义,将任意长度的数据M映射成为固定长度的数据H(M),因此肯定存在不同的key映射到同一个值的情况。作为密码算法的Hash算法主要关注的是散列函数是否均匀,而作为存储和查找的Hash算法则同时需要关注当产生冲突时候的解决办法。


一致性hash算法


在分布式系统中,如果数据是存储在很多个节点中,由于节点的状态是不稳定的,可能新增节点也可能随时有节点下线。可以参考P2P下载网络,节点的个数和在线时间都是不稳定的。如何在这样的不稳定的环境中保证数据的正确命中,不会因为节点个数的增减而导致大部分数据的失效,这就是一致性Hash算法需要解决的问题。


  1. 算法是否均匀
    算法均匀是指使用这样的算法,不同的key计算出来的结果是均匀的,不会出现集中分布的情况,这个是Hash算法的基本要求,大多数Hash算法都能做到。


  1. 算法是否单调
    算法是否单调是指,在新增数据节点之后,需要进行数据的重新分配,但是这种数据的分配只会出现在将现有节点的数据转移到新增节点之上,而不会出现将现有节点的数据转移到老数据节点的情况。这样的好处就是尽量保证现有数据的位置不变,从而减少数据再分配过程中对系统性能的消耗。


  1. 分散性
    在分布式环境中,由于网络的原因,并不是每个节点都能够获取到完整的全节点信息,那么在做数据散列的时候,有可能因为获取到的全节点信息不同而导致得出不同的散列结果,这也是好的一致性算法应该要解决的问题。


一致性hash算法的原理


一致性Hash算法是在1997年由麻省理工学院提出的一种分布式hash实现算法。简单点说就是使用常用的hash算法将key映射到一个具有232次方个桶空间中,即0-(232-1)的数字空间中。我们可以将其用一个首尾相连的闭合环形表示,如下图所示:


image.png


图中列出了一个虚拟的圆环,上面有0-232个节点位置。算法首先需要计算出存储节点在圆环上的位置。具体可以选择服务器的ip或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置。这一点是为了保证算法的分散性:节点的位置跟具体多少个节点没关系,只跟节点的内在特性有关系。


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


如下图所示,我们有A,B,C,D四个数据对象,经过hash计算之后,其在图中的位置和应该存在的节点位置如下:


image.png


其中A存储在node1节点,B存储在node2节点,C存储在node3节点,D存储在node4节点。


容错性


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


image.png


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


image.png


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


虚拟节点


当系统中节点很少的情况下,或者现有的节点计算出来的Hash值比较接近的情况下,


image.png


如上图所示,所有A-B这一段路径上的数据都会存储在node1上面,很明显这会导致node1上面数据过多,不满足系统分散性的需求。解决办法就是我们可以创出一下虚拟节点,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,如下图所示:


image.png


这样就可以解决数据倾斜的问题。

相关文章
|
7月前
|
消息中间件 存储 缓存
zk基础—1.一致性原理和算法
本文详细介绍了分布式系统的特点、理论及一致性算法。首先分析了分布式系统的五大特点:分布性、对等性、并发性、缺乏全局时钟和故障随时发生。接着探讨了分布式系统理论,包括CAP理论(一致性、可用性、分区容错性)和BASE理论(基本可用、软状态、最终一致性)。文中还深入讲解了两阶段提交(2PC)与三阶段提交(3PC)协议,以及Paxos算法的推导过程和核心思想,强调了其在ZooKeeper中的应用。最后简述了ZAB算法,指出其通过改编的两阶段提交协议确保节点间数据一致性,并在Leader故障时快速恢复服务。这些内容为理解分布式系统的设计与实现提供了全面的基础。
|
4月前
|
机器学习/深度学习 传感器 算法
基于不变扩展卡尔曼滤波器RI-EKF的同时定位与地图构建SLAM算法的收敛性和一致性特性研究(Matlab代码实现)
基于不变扩展卡尔曼滤波器RI-EKF的同时定位与地图构建SLAM算法的收敛性和一致性特性研究(Matlab代码实现)
145 2
|
6月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
217 1
|
存储 算法 NoSQL
(七)漫谈分布式之一致性算法下篇:一文从根上儿理解大名鼎鼎的Raft共识算法!
Raft通过一致性检查,能在一定程度上保证集群的一致性,但无法保证所有情况下的一致性,毕竟分布式系统各种故障层出不穷,如何在有可能发生各类故障的分布式系统保证集群一致性,这才是Raft等一致性算法要真正解决的问题。
381 11
|
存储 算法 索引
(六)漫谈分布式之一致性算法上篇:用二十六张图一探Raft共识算法奥妙之处!
现如今,大多数分布式存储系统都投向了Raft算法的怀抱,而本文就来聊聊大名鼎鼎的Raft算法/协议!
464 8
|
存储 算法 Java
(五)漫谈分布式之一致性算法篇:谁说Paxos晦涩难懂?你瞧这不一学就会!
没在时代发展的洪流中泯然于众的道理很简单,是因为它们并不仅是空中楼阁般的高大上理论,而是有着完整落地的思想,它们已然成为构建分布式系统不可或缺的底层基石,而本文则来好好聊聊分布式与一致性思想的落地者:Paxos与Raft协议(算法)。
476 6
|
缓存 负载均衡 算法
(四)网络编程之请求分发篇:负载均衡静态调度算法、平滑轮询加权、一致性哈希、最小活跃数算法实践!
先如今所有的技术栈中,只要一谈关于高可用、高并发处理相关的实现,必然会牵扯到集群这个话题,也就是部署多台服务器共同对外提供服务,从而做到提升系统吞吐量,优化系统的整体性能以及稳定性等目的。
479 2
|
算法 Java
Java中常用hash算法总结
Java中常用hash算法总结
277 0
|
3月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
367 0
|
3月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
241 2

热门文章

最新文章