Hash一致性演算法理解

2021-07-05 02:43:51 字數 1965 閱讀 7430

在分布式地環境中,集群中大量機器的重啟,新增新機器,刪除舊的機器是經常發生的事情。如果採用傳統的雜湊演算法將快取對映到機器,即就是採用如下的方法;

hash(object)%n
上面公式中的object為結果,n為當前集群中機器節點的數目。

採用這種方式有什麼缺陷呢?

怎麼解決這個問題呢?

這就需要hash一致性演算法來解決。

hash一致性演算法主要需要滿足以下幾點:

1、平衡性。內容要盡可能地均勻地分布到所有的機器快取中,所有快取空間得以充分地使用;

2、單調性。內容通過hash分派到相應的機器快取中,現在有新的快取節點加入,在新節點加入或者舊的節點刪除的時候,hash演算法應當保證原來內容還是能夠對映到原來相應的節點上或者新新增的節點上,而不能對映到舊的其他節點上。

3、分散問題。在分布式集群中,使用者向集群中儲存資料的時候,不同使用者看到機器快取的範圍可能不同,同樣的內容可能被對映到不同的機器快取中,這樣就降低了系統的儲存效率。所以在設計hash演算法時候應當盡量降低分散的問題。

4、負載問題。分散問題是同乙個內容可能被不同的使用者對映到不同的快取節點上,那麼同樣的,乙個快取節點可能被不同使用者對映為不同的內容,造成節點的負載加重。所以在實際的hash演算法設計中,應當減少這種情況。

在設計一致性hash演算法中,為了較好的描述,我們將hash產生的key對映到乙個32位長度的環形空間中,如下圖所示:

然後我們利用相同的hash函式將使用者內容資料與機器節點對映到此hash空間中:

在儲存資料的時候,以hash環,我們按照順時針的方向,key值找到其最近的node進行儲存。比如上面圖完整的儲存方案:

現在考慮下節點node2掛掉,或者在key4與key3之間新增乙個新的節點node4會發生什麼情況。

其實節點刪除掉後,儲存到這個節點上的內容會順時針遷移到距離其最近的節點上,新增乙個節點也是,只是影響其周圍的節點,把距離這個節點最近的資料新增進來,依然是按照順時針方向。

以上的處理方案看似可以完美解決問題,但是這種方案並不完美,看上面node2節點失效的時候,按照順時針方向儲存,節點node3上要負擔三個內容資料,負載極高,其他節點儲存的確很少,這樣就造成了集群中極大的不平衡。為了解決這一點,引入乙個虛擬節點的概念。

這個虛擬節點是實際的節點在hash環上的複製,乙個實際的節點可以對應於多個「虛擬節點」,這個虛擬節點在hash空間以hash值排列。

為了說明這一點,我們假設開始這個三節點的例程每個節點有兩個虛擬節點,則其在hash環中的分布如下:

如果node2失效,則現在的儲存情況如下:

現在可以看到實際的物理節點node1與node3各儲存2份內容,這樣集群中就比較平衡。

為了清晰說明虛擬節點的對映情況可以看看下圖:

以上只是對一致性hash演算法乙個初步的認識,其中的許多東西還需要後面繼續玩味!

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

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

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

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

一致性hash演算法的理解

用hash做快取,假如有三颱伺服器,1,2,3,有三萬張,我想將平均快取到我三颱伺服器上,乙個伺服器大概一萬張,怎麼去實現這個辦法呢,可以用hash來取餘數進行操作,加入我們是以的名字作為key進行hash計算,hash 名稱 n 其中n為我們伺服器的個數,我們將hash 名稱 這一部分進行計算後得...