一致性hash
算法解釋
- 將hash空間虛擬成一個環形的空間,將服務器節點進過hash運算后分布在環形空間上。
- item經過hash運算后,得到其在hash環上的位置,然后順時針或者逆時針就近取其應該存儲的節點。
以下是一致性hash的示意圖:
一致性hash示意圖
圖中存在Node1-4 4個節點,順時針就近取,item1-item4分別放置在4個節點上。
傳統Hash VS 一致性Hash
hash
hash其實是將item與其存儲在hash空間中的位置進行了映射,能夠快速查找指定的item。
因此好的hash應該滿足以下幾點:
- Balance:盡可能讓item能存儲到空間的每一個地方,是所有的空間都能夠得到利用。
- Monotonicity(單調):hash空間節點的改變,盡可能地不影響現有數據的位置。
- Spread(分散)
- Load(負載)
傳統hash VS 一致性hash
類別 | 普通hash | 一致性hash |
---|---|---|
結構 | 線性 | 虛擬環形 |
節點改變影響 | 大 | 小 |
一致性hash節點變化造成的影響
刪除Node的影響
圖為刪除節點3時,受影響的部分,僅僅是node3與node2之間。
添加Node的影響
圖為增加一個節點5時,受影響的部分節點5和2之間的部分
上面其實可以看出,一致性hash在節點修改增加或者刪除的時候,僅僅只影響變更節點與其前一個節點之前的部分(順時針,逆時針則是與其后一個節點)
一致性hash存在的問題
數據傾斜
當節點數較少的時候,容易出現數據傾斜問題。
數據傾斜問題
以灰色先為邊界,左側部分全部會分配給node1,右邊全部分配給Node2,分配不均,導致數據傾斜問題。
虛擬節點解決
為節點多進行幾次hash,產生一些虛擬節點,這些虛擬節點映射到實際節點。(item-->虛擬節點--> 實際節點),從而達到盡可能讓數據分布均勻。
引入虛擬節點
為Node1,Node2分別建立3個虛擬節點
item# --> (Node1#1/Node1#2/Node1#3) --> Node1
item# --> (Node2#1/Node2#2/Node2#3) --> Node2