一致哈希

  一致哈希是一種特殊的哈希算法。在使用一致哈希算法後,哈希表槽位數(大小)的改變平均只需要對K/n個關鍵字重新映射,其中K是關鍵字的數量,n是槽位數量。然而在傳統的哈希表中,添加或刪除一個槽位的幾乎需要對所有關鍵字進行重新映射。

  一致哈希由MIT的Karger及其合作者提出,現在這一思想已經擴展到其它領域。在這篇1997年發表的學術論文中介紹了“一致哈希”如何應用於用戶易變的分佈式Web服務中。哈希表中的每一個代表分佈式系統中一個節點,在系統添加或刪除節點只需要移動K/n項。

  分佈式緩存設計核心點:在設計分佈式cache系統的時候,我們需要讓key的分佈均衡,並且在增加cache server後,cache的遷移做到最少。

  在使用n臺緩存服務器時,一種常用的負載均衡方式是,對資源的請求使用hash(K) mod N來映射到某一臺緩存服務器。當增加或減少一臺緩存服務器時這種方式可能會改變所有資源對應的hash值,也就是所有的緩存都失效了,這會使得緩存服務器大量集中地向原始內容服務器更新緩存。因些需要一致哈希算法來避免這樣的問題。

一致哈希算法的主要思想:
  將每個緩存服務器與一個或多個哈希值域區間關聯起來,其中區間邊界通過計算緩存服務器對應的哈希值來決定。(定義區間的哈希函數不一定和計算緩存服務器哈希值的函數相同,但是兩個函數的返回值的範圍需要匹配。)如果一個緩存服務器被移除,則它會從對應的區間會被併入到鄰近的區間,其他的緩存服務器不需要任何改變。

實現:
  一致哈希將每個對象映射到圓環邊上的一個點,系統再將可用的節點機器映射到圓環的不同位置。查找某個對象對應的機器時,需要用一致哈希算法計算得到對象對應圓環邊上位置,沿着圓環順時針查找直到遇到第一個節點機器,這臺機器即爲對象應該保存的位置。

  當添加一臺機器到圓環邊上某個點時,這個點的下一臺機器需要將這個節點前對應的對象移動到新機器上。

   

  當刪除一臺節點機器時,這臺機器上保存的所有對象都要移動到下一臺機器。

    

虛擬節點:
  一致性哈希算法在服務節點太少時,容易因爲節點分部不均勻而造成數據傾斜問題,如下:

    

  可以看到這裏的A節點負載將很重。
  對此,我們把每臺server分成v個虛擬節點,再把所有虛擬節點(n*v)隨機分配到一致性哈希的圓環上,這樣所有的用戶從自己圓環上的位置順時針往下取到第一個vnode就是自己所屬節點。當此節點存在故障時,再順時針取下一個作爲替代節點。

    

參考:

https://zh.wikipedia.org/wiki/%E4%B8%80%E8%87%B4%E5%93%88%E5%B8%8C
http://opensource.plurk.com/LightCloud/Design_spec/

發佈了89 篇原創文章 · 獲贊 9 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章