一致性hash算法的工做原理


1.一致性hash算法的工做原理


     首先咱們有一個hash函數H,能夠經過數據的key值計算出一個數字型的hash值。而後咱們將整個hash環的範圍定義爲[1,L]這個區間,咱們將剛纔算出的hash值對L進行取餘,就能算出一個key值在這個環上的位置。而每一臺真實服務器結點就會負責[1-L]之間的某個區間的數據。如上圖,就是一個五個結點的hash環。算法

上面hash環的L值爲1000,而後咱們對ABCDE 5個點分別進行hash運算,H(A) mod L = 7, H(B) mod L = 234, H(C)mod L = 447, H(D) mod L = 660, and H(E) mod L = 875 ,這樣,hash值在7-233之間的全部數據,咱們都讓它保存在A節點上。在實際動做中,咱們對數據進行hash,算出其應該在哪一個節點存儲便可,例:H('employee30') mod L = 899 那麼它應該在E節點上,H('employee31') mod L = 234 那麼這個數據應該在B節點上。服務器

2.優化的數據分配策略


    雖然hash算法可以產生相對均勻的hash值。並且一般是節點數量越多,hash算法會越平均的分配key值。然而一般在項目初期不會有太多的數據,固然也不須要那麼多的機器節點,這時候就會形成數據分配不平均的問題。好比上面的5個節點,其中A節點須要負責的hash區間範圍大小爲227,而E節點負責的區間範圍爲132。同時在這種狀況下,出故障後數據請求轉移到相鄰節點的策略也可能很差實施了。爲了解決因爲節點比較少致使數據分配不均的問題,不少DHT系統都實現了一種叫作虛擬節點的技術。例如4個虛擬節點的系統中,A節點可能被虛擬化成A_1,A_2,A_3,A_4這四個虛擬節點,而後對這四個虛擬節點再進行hash運算,A節點負責的key值區間就比較分散了。Voldemort 使用了與上面相似的策略,它容許對虛擬節點數進行配置,一般這個節點數會大於真實節點數,這樣每一個真實節點其實是負責了N個虛擬節點上的數據。函數

相關文章
相關標籤/搜索