一致雜湊,雜湊
一致雜湊是一種特殊的雜湊演算法。在使用一致雜湊演算法後,雜湊表槽位元(大小)的改變平均只需要對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/
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。