一致性hash演算法學習

2021-08-20 14:41:32 字數 2333 閱讀 3918

在解決分布式系統中負載均衡的問題時候可以使用hash演算法讓固定的一部分請求落到同一臺伺服器上,這樣每台伺服器固定處理一部分請求,起到負載均衡的作用。

但是普通的餘數hash(hash(比如使用者id)%伺服器機器數)演算法伸縮性很差,當新增或者下線伺服器機器時候,使用者id與伺服器的對映關係會大量失效。一致性hash則利用hash環對其進行了改進

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

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

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

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

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

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

為了能直觀的理解一致性hash原理,這裡結合乙個簡單的例子來講解,假設有4臺伺服器,位址為ip1,ip2,ip3,ip4。

如上圖可知user1,user2的請求會落到伺服器ip2進行處理,user3的請求會落到伺服器ip3進行處理,user4的請求會落到伺服器ip4進行處理,user5,user6的請求會落到伺服器ip1進行處理。

下面考慮當ip2的伺服器掛了的時候會出現什麼情況?

當ip2的伺服器掛了的時候,一致性hash環大致如下圖:

根據順時針規則可知user1,user2的請求會被伺服器ip3進行處理,而其它使用者的請求對應的處理伺服器不變,也就是只有之前被ip2處理的一部分使用者的對映關係被破壞了,並且其負責處理的請求被順時針下乙個節點委託處理。

下面考慮當新增機器的時候會出現什麼情況?

當新增乙個ip5的伺服器後,一致性hash環大致如下圖:

根據順時針規則可知之前user1的請求應該被ip1伺服器處理,現在被新增的ip5伺服器處理,其他使用者的請求處理伺服器不變,也就是新增的伺服器順時針最近的伺服器的一部分請求會被新增的伺服器所替代

當伺服器節點比較少的時候會出現上節所說的一致性hash傾斜的問題,乙個解決方法是多加機器,但是加機器是有成本的,那麼就加虛擬節點,比如上面三個機器,每個機器引入1個虛擬節點後的一致性hash環的圖如下:

其中ip1-1是ip1的虛擬節點,ip2-1是ip2的虛擬節點,ip3-1是ip3的虛擬節點。

可知當物理機器數目為m,虛擬節點為n的時候,實際hash環上節點個數為m*n。比如當客戶端計算的hash值處於ip2和ip3或者處於ip2-1和ip3-1之間時候使用ip3伺服器進行處理

上節我們使用虛擬節點後的圖看起來比較均衡,但是如果生成虛擬節點的演算法不夠好很可能會得到下面的環

可知每個服務節點引入1個虛擬節點後,情況相比沒有引入前均衡性有所改善,但是並不均衡。

均衡的一致性hash應該是如下圖:

均勻一致性hash的目標是如果伺服器有n臺,客戶端的hash值有m個,那麼每個伺服器應該處理大概m/n個使用者的。也就是每台伺服器負載盡量均衡

一致性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...