一致性哈希

簡介

轉自:五分鐘理解一致性哈希算法

一致性hash算法提出了在動態變化的cache環境中,判定哈希算法好壞的四個定義。

  • 平衡性:平衡性是指哈希的結果能夠儘可能分佈到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多哈希算法都能夠滿足這一條件。
  • 單調性:單調性是指如果已經有一些內容通過哈希分派到了相應的緩衝中,又有新的緩衝加入到系統中。哈希的結果應能夠保證原有已分配的內容可以被映射到原有的或者新的緩衝中去,而不會被映射到舊的緩衝集合中的其他緩衝區。
  • 分散性:在分佈式環境中,終端有可能看不到所有的緩衝,而是隻能看到其中的一部分。當終端希望通過哈希過程將內容映射到緩衝上時,由於不同終端所見的緩衝範圍有可能不同,從而導致哈希的結果不一致,最終的結果是相同的內容被不同的終端映射到不同的緩衝區中。這種情況顯然是應該避免的,因爲它導致相同內容被存儲到不同緩衝中去,降低了系統存儲的效率。分散性的定義就是上述情況發生的嚴重程度。好的哈希算法應能夠儘量避免不一致的情況發生,也就是儘量降低分散性。
  • 負載:負載問題實際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內容映射到不同的緩衝區中,那麼對於一個特定的緩衝區而言,也可能被不同的用戶映射爲不同 的內容。與分散性一樣,這種情況也是應當避免的,因此好的哈希算法應能夠儘量降低緩衝的負荷。
情景

在分佈式集羣中,對存儲機器的添加刪除或者說機器故障都會影響到整體的數據訪問存儲情況,也會存在很多數據找不到,所以,在出現上述這種情況時,需要設計一致性哈希算法來保證數據的正確存儲,提高整個集羣的效率。

環形hash空間

按照常用的hash算法來將對應的key哈希到一個具有2的32次方個桶的空間中,即0~(2^32)-1的數字空間中。現在我們可以將這些數字頭尾相連,想象成一個閉合的環形。如下圖
在這裏插入圖片描述
把數據通過一定的hash算法映射到環中
現在我們將object1、object2、object3、object4四個對象通過特定的Hash函數計算出對應的key值,然後散列到Hash環上。如下圖:

Hash(object1) = key1;

Hash(object2) = key2;

Hash(object3) = key3;

Hash(object4) = key4;

在這裏插入圖片描述再將存儲機器通過hash算法映射到環上
採用一致性哈希算法的分佈式集羣中將新的機器加入,其原理是通過使用與對象存儲一樣的Hash算法將機器也映射到環中(一般情況下對機器的hash計算是採用機器的IP或者機器唯一的別名作爲輸入值),然後以順時針的方向計算,將所有對象存儲到離自己最近的機器中。

假設現在有NODE1,NODE2,NODE3三臺機器,通過Hash算法得到對應的KEY值,映射到環中,其示意圖如下:

 Hash(NODE1) = KEY1;

 Hash(NODE2) = KEY2;

 Hash(NODE3) = KEY3;

在這裏插入圖片描述
通過上圖可以看出對象與機器處於同一哈希空間中,這樣按順時針轉動object1存儲到了NODE1中,object3存儲到了NODE2中,object2、object4存儲到了NODE3中。在這樣的部署環境中,hash環是不會變更的,因此,通過算出對象的hash值就能快速的定位到對應的機器中,這樣就能找到對象真正的存儲位置了。

機器的刪除與添加操作

機器的刪除

以上面的分佈爲例,如果NODE2出現故障被刪除了,那麼按照順時針遷移的方法,object3將會被遷移到NODE3中,這樣僅僅是object3的映射位置發生了變化,其它的對象沒有任何的改動。如下圖:
在這裏插入圖片描述

機器的添加

如果往集羣中添加一個新的節點NODE4,通過對應的哈希算法得到KEY4,並映射到環中,如下圖:
在這裏插入圖片描述
通過按順時針遷移的規則,那麼object2被遷移到了NODE4中,其它對象還保持這原有的存儲位置。通過對節點的添加和刪除的分析,一致性哈希算法在保持了單調性的同時,還是數據的遷移達到了最小,這樣的算法對分佈式集羣來說是非常合適的,避免了大量數據遷移,減小了服務器的的壓力。

虛擬節點

虛擬節點是在遇到如下問題時,嚴重影響到機器的平衡性時,採用將一個機器創建多個虛擬機器(虛擬節點),從而提高集羣的平衡性。
在這裏插入圖片描述
創建多個虛擬結點,提高平衡性
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章