一致性雜湊演算法

2021-08-13 18:12:19 字數 2031 閱讀 3662

一致性雜湊演算法(consistent hashing)

我們有大量的資源需要分別儲存到三颱伺服器上,這三颱伺服器為a、b、c伺服器。最簡單的做法就是隨機地平均地將資源分配到這三颱伺服器上,這樣既滿足了儲存的要求又使每台伺服器受到壓力相近。但是有乙個問題:我們該如何從這三颱伺服器中查詢所需要的資源?三颱伺服器都遍歷一遍?這樣的效率無疑是低下的,尤其是當這種伺服器數量不止三颱的時候。這個時候我們用下面的方法來解決這種問題。

為了方便描述,我們假設這種資源是。每張有不同的名稱且名稱不重複。

對每張的名稱做雜湊計算,將結果對3取餘,結果只有三種情況0、1、2。所以我們就將每張名稱最後雜湊取餘的結果放到對應的伺服器上(在一開始我們就假設了a、b、c伺服器)。

這樣,我們可以將所以的分配到三颱伺服器上,且在讀取時我們也只需要使用上面的計算方式,就可以知道每張所存放的伺服器。所以我們就只需要遍歷三颱中一台伺服器就能找到所需要找的。

但是這樣會有什麼問題呢?如果伺服器數量發生變化,原來存放的伺服器可能需要改變(幾乎所有位置),這樣會帶來很大的影響。所以我們就有了下面這種方法——一致性雜湊演算法。

首先,對每台伺服器的ip位址進行雜湊,之後將結果對232

2

32進行取模。這樣我們就一定能得到三個完全不一樣的結果且在

0 0

到232

−1' role="presentation">232−

1232−

1之間。有乙個問題,為什麼是對232

2

32取模?因為ip位址是最多有232

2

32個。從0.0.0.0到255.255.255.255,排列組合得到的所有可能位址。

接下來,我們想象乙個圓環,這個圓環從任意一點開始再回到這個點,其中所有的點都是由

0 0

到232

−1' role="presentation">232−

1232−

1構成。這樣這個圓環就有232

2

32個點,我們將這個圓環稱作hash環。接下來我們將剛剛三颱伺服器ip位址運算的結果代入進這個hash環中。

之後,我們用方法一中的方法。將每張名稱做雜湊計算,將結果對232

2

32取模,最後得到乙個值。我們將這個值放到hash環上,以這個點為出發點順時針旋轉,之後遇到的第乙個伺服器的點,遇到了a伺服器,就將這張放到a伺服器上。總結來說,就是對名稱做運算,得到的結果放在hash環上,順時針方向離的最近的伺服器就是的儲存伺服器。

大功告成,以上就是的儲存方法。如果需要讀取,也可以通過上面的計算方式找到儲存的伺服器。那麼這樣是否還會有方法一的問題嗎?假設我們現在移除了一台伺服器,所以我們在hash環上對應的伺服器點去除,然後將伺服器上的所有,存放到離它順時針最近的伺服器上。這樣並不會改變所有的儲存位置,帶來影響比方法一小了很多。當然,我們也可以做增添一台伺服器的假設,過程基本同上。

但是,這樣會有什麼問題呢?最明顯的乙個缺點就是沒辦法保證伺服器所受壓力相同,換句話說,某台伺服器上可能有很多很多,而另一台伺服器上可能沒有幾張。為了解決這個問題,就有了下面的方法三。

剛剛方法二的問題用一種專業(裝逼)詞彙來說就是hash環的偏斜,為了解決這種偏斜,我們可以引入虛擬節點

原來我們只有a、b、c三颱伺服器,那麼我們可以在此基礎上模擬我們又多了三颱伺服器a1、b1、c1。原來的伺服器我們稱為實際節點,模擬出來的我們稱為虛擬節點,虛擬節點是實際節點複製而來。我們將這些虛擬節點放在hash環上,這樣就可以使節點在hash環上的分布稍微均勻一點,如果有需要可以繼續進行複製出更多的虛擬節點。當進行儲存的時候,如果順時針遇到的第乙個節點為虛擬節點,則將該儲存到該虛擬節點原有的實際節點中。虛擬節點越多,節點分布地就越均勻,每台實際伺服器上的壓力也越均衡。

虛擬節點的數量,是原有伺服器數量的n倍,這樣才能保證分布均勻。虛擬節點放置的位置應該是由實際節點的位置旋轉而來。換句話說,a1、b1、c1三個虛擬節點之間的距離應該與實際節點的相同。

參考文章 :

白話解析:一致性雜湊演算法 consistent hashing

一致性雜湊演算法

好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...

一致性雜湊演算法

在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用hash的方式將業務請求分散到這些節點處理,如果有n個節點,計算方法為 hash id n。如果只是簡單的計算,不涉及使用者狀態,這是乙個簡單有效的方案。如果節點的計算涉及使用者狀態,比如維護購物車 memcache快取服務等,好像也沒...

一致性雜湊演算法

判定好壞的四個定義 1 平衡性 balance 平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。2 單調性 monotonicity 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...