一致性雜湊的理解

2021-09-24 21:06:10 字數 2331 閱讀 4849

參考:

先說結論:

一致性雜湊也是雜湊演算法的一種,只是為了解決普通雜湊因為節點的變動導致資料遷移過大的問題。其核心思想是將位址空間看做乙個環狀結構,將節點進行雜湊,使節點盡可能均勻的散落在環上。同時將資料進行雜湊,也將資料均勻的散落在環上,最後,將資料全都放置在離資料順時針方向(因為是混裝結構,順時針方向為遞增方向)最近的節點上。此時如果乙個節點需要刪除,那麼只會影響原來的放置在待刪除節點的資料,此時這些資料仍然按照順時針方向尋找下乙個節點。如果增添節點,只會影響到環上新節點與新節點逆時針方向最近節點之間的資料。這種方式對比普通雜湊,大大的緩解了因節點的變更導致的大範圍資料遷移的問題。但是在使用一致雜湊的過程中,節點的數量比較少時,會導致大量的資料堆積在某幾個節點上的情況,即出現不均衡的情況,因此為了優化這種不均勻分布的問題,引入了虛擬節點的概念,將乙個節點拆分成多個虛擬的節點,這多個虛擬的節點實際對應的還是乙個節點。總之環中節點數量越多,越容易使資料分布均勻,同時還具有優良的伸縮性。

借用其他部落格的例子:

首先可以回顧一下普通的雜湊:

普通的hash是這樣的,假設有3個節點,資料分別是1 2 3 4 5 6 7 8 9 10,那麼用取模方法的話分布如下。

0:3 6 9

1:1 4 7 10

2:2 5 8

這種情況下如果增加乙個節點的話則會變成。

0:4 8

1:1 5 9

2:2 6 10

3:3 7

移動的資料要很多,所以這裡就要用上一致性hash。

對節點做hash計算,對值也做hash運算,最後把節點弄成環。把區間數值歸右端點。給個其他部落格的例子:

十條資料,算出各自的雜湊值

0:192

1:196

2:200

3:204

4:208

5:212

6:216

7:220

8:224

9:228

有三個節點,算出各自的雜湊值

node a: 203

node g: 209

node z: 228

結果:node a: 0,1,2

node g: 3,4

node z: 5,6,7,8,9

一致性雜湊的示意圖如下:

例如我們有object a、object b、object c、object d四個資料物件,經過雜湊計算後,在環空間上的位置如下:

根據一致性hash演算法,資料a會被定為到node a上,b被定為到node b上,c被定為到node c上,d被定為到node d上。

刪除節點的情況:

如果此時node c出現問題需要刪除,那麼object c將與object d共同新增到node d,環中其他資料所處的節點不會發生改變。

增加節點的情況:

環中新加入新的節點node x,則此時object c由原來應該處於node c更改到新加入的節點node 中,其他的資料所處的位置不發生改變。

資料不均勻現象:

如果節點數量過少,很有可能因為刪除乙個節點導致大量資料聚集在某些節點處的現象,如下圖所示:

此時會導致大量的資料聚集在節點a處,資料嚴重不均勻。

因此為了應對這種現象,引入了虛擬節點的方法,

即對每乙個服務節點計算多個雜湊,每個計算結果位置都放置乙個此服務節點,稱為虛擬節點。具體做法可以在伺服器ip或主機名的後面增加編號來實現。例如上面的情況,可以為每台伺服器計算三個虛擬節點,於是可以分別計算 「node a#1」、「node a#2」、「node a#3」、「node b#1」、「node b#2」、「node b#3」的雜湊值,於是形成六個虛擬節點:

node a#1」、「node a#2」、「node a#3」三個虛擬節點其實是乙個真正的節點,這三個虛擬節點上的的資料全都定位到node a上,同理node b#1」、「node b#2」、「node b#3」也是如此。

一致性雜湊的理解

一致性雜湊 consistent hashing 首先,讓我們了解一下一致性雜湊解決了怎樣的實際問題,當我們有了n臺伺服器 cache 時,我們通常會採用如下的通用演算法 將物件 object 均勻對映分配到伺服器上,hash object n 試想一下,當其中的一台伺服器down機了,或是添置一台...

一致性雜湊

直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...

一致性雜湊

from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...