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