一致性Hash演算法

2021-10-06 09:02:53 字數 3324 閱讀 1054

一致性hash演算法在2023年由麻省理工學院提出的一種分布式雜湊(dht)實現演算法,設計目標是為了解決網際網路中的熱點(hot spot)問題,初衷和carp十分相似。一致性hash修正了carp使用的簡單雜湊演算法帶來的問題,使得分布式雜湊(dht)可以在p2p環境中真正得到應用。

一致性hash演算法提出了在動態變化的cache環境中,判定雜湊演算法好壞的四個定義:

1、平衡性(balance):平衡性是指雜湊的結果能夠盡可能分布在所有的緩衝(cache)中去,這樣可以使得所有的緩衝空間得到利用。很多雜湊演算法都能夠滿足這一條件。

2、單調性(monotonicity):單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的結果應該能夠保證原有已分配的內容可以被對映到原有的或者新的緩衝中去,而不會對映到舊的緩衝集合中的其他緩衝區。

3、分散性(spread):在分布式環境中,終端有可能看不到所有的緩衝,而只能看到其中的一部分。當終端希望通過雜湊過程將內容對映到緩衝上去,由於不同終端所見的緩衝範圍有可能不同,從而導致雜湊的結果不一致,最終的結果是相同的內容被不同的終端對映到不同的緩衝區中。這種情況顯然是應該避免的,因為它導致相同內容被儲存到不同緩衝中去,降低了系統儲存的效率。分散性的定義就是上述情況發生的嚴重程度。好的雜湊演算法應該能夠盡量避免不一致的情況發生,也就是盡量降低分散性。

4、負載(load):負載問題實際上是從另乙個角度看待分散性問題。既然不同的終端可能將相同的內容對映到不同的緩衝區中,那麼對於乙個特定的緩衝區而言,也可能被不同的使用者對映到不同的內容。與分散性一樣,這種情況也是應當避免的,因此好的雜湊演算法應能夠盡量降低緩衝的負荷。

在分布式集群中,對機器的新增刪除,或者機器故障後自動脫落集群這些操作是分布式集群管理最基本的功能。如果採用常用的hash(object)%n演算法,那麼在有機器新增或者刪除後,很多原有的資料就無法找到了,這樣嚴重的違反了單調性原則。

解釋使用hash(object)%n,其中n是指n個cache伺服器/n個節點為啥不行:

如果n個cache伺服器中編號為a的伺服器故障了,需要把a從伺服器群中移除,這個時候cache伺服器的數量就變成了n-1臺,那麼所有物件(object)對映到cache伺服器的計算公式就變成了hash(object)%n-1,對,影響到了所有的物件與cache伺服器的對映關係,類似,由於訪問加重,需要新增cache伺服器,這時候cache伺服器是n+1臺,對映公式就變成了hash(object)%n+1,這就意味著幾乎所有的cache都失效了,對於伺服器而言,這是一場災難,所有訪問都會直接衝向後台伺服器。

接下來主要講解一下雜湊演算法是如何設計的:

環形hash空間

按照常用的hash演算法來將對應的key雜湊到乙個具有2^32次方個桶的空間中,即0~(2^32)-1的數字空間。現在我們可以將這些數字頭尾相連,想象成乙個閉合的環形。如下圖

把資料(物件)通過一定的hash演算法處理後對映到環上

現在我們將object1、object2、object3、object4四個物件通過特定的hash函式計算出對應的key值,然後雜湊到hash換上。如下圖:

hash(object1)=key1;hash(object2)=key2;hash(object3)=key3;hash(object4)=key4;

將機器通過hash演算法對映到環上

在採用一致性雜湊演算法的分布式集群中將新的機器加入,其原理是通過使用與物件儲存一樣的hash演算法將機器也對映到換種(一般情況下對機器的hash計算是採用機器的ip或者唯一的別名作為輸入值),然後以順時針的方向計算,將所有物件儲存到離自己最近的機器中。

假設現在有node1,node2,node3三颱機器中,通過hash演算法得到對應的key值,對映到環中,其示意圖如下:

hash(node1)=key1;hash(node2)=key2;hash(node3)=key3;

通過上圖可以看出物件與機器處於同乙個雜湊空間中,這樣按順時針轉動object1(物件)儲存到了node1(機器)中,object3(物件)儲存到了node2(機器)中,object2、object4(物件)儲存到了node3(機器)中。在這樣的部署環境中,hash環是不會變更的,因此,通過算出物件的hash值就能快速的定位到對應的機器中,這樣就能找到物件真正的儲存位置了。

機器刪除與新增

普通hash求餘演算法最為不妥的地方就是在有機器的新增與刪除以後會造成大量的物件儲存位置的失效,這樣就大大的不滿足單調性了。下面來分析一下一致性雜湊演算法是如何處理的。

1、節點(機器)的刪除

以上面的分布式集群為例,如果node2出現故障被刪除了,那麼按照順時針遷移的方法,object3將會被遷移到node3中,這樣僅僅是object3的對映位置發生了變化,其他的物件沒有任何的變動,如下圖:

2、節點(機器)的新增

如果往集群中新增乙個新的節點node4,通過對應的hash演算法得到key4,並對映到環中,如下圖:

通過按照順時針遷移的規則,那麼object2被遷移到node4中,其他物件還保持這原有的儲存位置。通過對節點的新增和刪除的分析,一致性雜湊演算法在保持了單調性的同時,還是資料的遷移達到了最小,這樣的演算法對分布式集群來說非常合適的,避免了大量收資料遷移,減少了伺服器的壓力。 

平衡性根據上面的**分析,一致性雜湊演算法滿足了單調性和負載均衡的特性以及一般hash演算法的分散性,但這還並不能當做其被廣泛應用的原由,因為缺少了平衡性。下面將分析一致性雜湊演算法是如何滿足平衡性的。hash演算法是不保證平衡性的,如上面只部署了node1和node3的情況(node2被刪除的圖),object1儲存在node1中,而object2、object3、object4都儲存在node3中,這樣就造成了非常不平衡的狀態。在一致性雜湊演算法中,為了盡可能的滿足平衡性,其引入了虛擬節點。

何為虛擬節點?虛擬節點(virtual node)是實際節點(機器)在hash空間的複製品(replica),乙個實際節點對應了若干個「虛擬節點」,這個對應個數也稱為「複製個數」,「虛擬節點」在hash空間中以hash值排列。

在上面只部署了node1和node3的情況(node2被刪除的圖)為例,之前的物件在機器上的分布很不均衡,現在我們以2個副本(每個節點複製2個)為例,這樣整個hash環就存在4個虛擬節點,最後物件對映的關係圖如下:

根據上圖可知物件的對映關係:object1->node1-1,object2->node1-2 ,object3->node3-2,object4->node3-1,通過虛擬節點的引入,物件的分布就比較均衡了。那麼在實際操作中,真正的物件查詢是如何工作的呢?物件從hash到虛擬節點到實際節點的轉換如下圖:

hash(「192.168.1.100」);

引入「虛擬節點」後,計算「虛擬節」點node1-1和node1-2的hash值:

hash(「192.168.1.100#1」); // node1-1

hash(「192.168.1.100#2」); // node1-2

參考:

一致性hash演算法 面試必備 一致性hash演算法

最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...

一致性hash演算法虛擬節點 一致性hash演算法

hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map dictionary或者 hash table 它是根據key來直接訪問結果的資料結構。key的...

一致性hash演算法

july部落格16章開始 第一題 全排列,輸入乙個字串,列印出該字串中字元的所有排列 1.個人思路 回溯法建立的排序樹 2.july部落格 遞迴實現,依次固定第乙個字母,後面的交換,和上面描述的使用回溯法相似 c stl 演算法 next permutation的思想,關於next permutat...