一致性Hash

第一次知道一致性Hash協議是在方騰飛的技術文章實戰解析-論三年內快速成長爲一名技術專家裏看到的。算法

問:對於三十歲的程度員,若是還想再深刻作技術,有什麼建議?

答:技術人員必定要有危機感,不管多大年紀仍然要持續的學習,我也已經三十多了,每週會花點時間學習點技術。
可是年紀大了,其實時間不會那麼多,因此要提升學習的效率,掌握一些學習方法和方法論,而且要靜下心來持續的學習。
學技術什麼時間都不晚,由於總有新技術冒出來,可是一些永遠不變的技術能夠優先學習,好比各類協議(TCP,HTTP,一致性hash協議),實現原理,算法等。負載均衡

當時十分興奮,當即去找了關於一致性hash協議的文章來看。到了今天再去回想,發現對一致性hash協議的概念已經模糊不清了。雖然關於一致性hash協議的文章數不勝數,可是仍是須要用本身的語言來表達一遍,才能真正的理解這些技術概念,成爲本身的東西。這也是寫這篇文章的理由。分佈式

什麼是一致性Hash協議?

一致性Hash協議是指知足瞭如下4個條件的Hash算法:性能

  • 均衡性(Balance)
  • 單調性(Monotonicity)
  • 分散性(Spread)
  • 負載(Load)

均衡性

均衡性是指Hash的結果應該儘量的平均分配給全部的節點,實現負載均衡的效果,這也是最基本的特性。學習

單調性

單調性是指在節點增長或減小的狀況下,已Hash的結果與節點的映射關係儘可能不發生變化。單調性低的Hash算法在節點增長或減小的時候會出現Hash的結果與節點的映射關係大量失效的狀況,形成嚴重的性能問題或系統故障。spa

分散性

分散性是指相同內容在不一樣客戶端Hash的結果是否一致。由於在分佈式的環境下,不一樣客戶端能夠看到的節點數多是不一樣的,分散性高的Hash算法會致使相同的內容卻映射了多個節點。設計

負載

負載是從節點角度出發,不一樣內容的Hash結果卻映射了同一個節點位置。code

普通餘數Hash算法

Hash結果 % 節點數,很是的簡單和好用。雖然這種算法知足了均衡性,可是單調性卻很是的差勁,一旦節點數有變更就會形成大量的Hash的結果與節點的映射關係失效
。只適用於節點數固定的場景。ci

一致性Hash算法

一致性哈希算法在1997年由麻省理工學院的Karger等人在解決分佈式Cache中提出的,設計目標是爲了解決因特網中的熱點(Hot spot)問題,初衷和CARP十分相似。一致性哈希修正了CARP使用的簡單哈希算法帶來的問題,使得DHT能夠在P2P環境中真正獲得應用。rem

首先構造一個長度爲2^32的整數環,而後將節點Hash的結果均勻映射到整數環上。

這時將內容映射到整數環上。

如圖所示,Hash的結果與節點的映射關係是根據Hash的結果按順時針遇到的第一個節點來斷定的。這樣作是爲了有良好的單調性,假如如今節點C故障了那麼新的映射關係以下圖所示:

咱們能夠看到本來屬於節點C的映射如今都從新映射到了節點D上,這樣至少保證了大部分的映射能夠正常工做。

保證良好的均衡性

一致性Hash算法的均衡性取決於節點的位置是否分佈均勻,若是是按上圖所示分佈節點,那麼很明顯節點D的壓力遠遠高於其餘節點。不過即便節點已經分佈均勻了,若是節點數量太少的話也很容易形成數據傾斜問題。

虛擬節點

虛擬節點是用來解決節點數量過少形成的數據傾斜問題。顧名思義,經過虛擬出一些節點來增長總節點數,這樣就有良好的均衡性了。

後記

原理雖然簡單實現起來卻挺麻煩,你們若是有興趣能夠本身去實現一個版本。我雖然寫了個demo但感受並很差,就不放上來獻醜了。計劃是一週寫一篇文章的,如今已經寫了5篇了,動力開始不足了。緣由可能不少,好比不知道寫什麼,肚子裏墨水很少等。但願能堅持下去,爲了更好的明天。

相關文章
相關標籤/搜索