1致性哈希算法在1997年由麻省理工學院提出的1種散布式哈希(DHT)實現算法,設計目標是為了解決因特網中的熱門(Hot spot)問題,初衷和CARP10分類似。1致性哈希修正了CARP使用的簡 單哈希算法帶來的問題,使得散布式哈希(DHT)可以在P2P環境中真正得到利用。
1致性hash算法提出了在動態變化的Cache環境中,判定哈希算法好壞的4個定義:
1、平衡性(Balance):平衡性是指哈希的結果能夠盡量散布到所有的緩沖中去,這樣可使得所有的緩沖空間都得到利用。很多哈希算法都能夠滿足這1條件。
2、單調性(Monotonicity):單調性是指如果已有1些內容通過哈希分派到了相應的緩沖中,又有新的緩沖加入到系統中。哈希的結果應能夠保證原有已分配的內容可以被映照到原本的或新的緩沖中去,而不會被映照到舊的緩沖集合中的其他緩沖區。
3、分散性(Spread):在散布式環境中,終端有可能看不到所有的緩沖,而是只能看到其中的1部份。當終端希望通過哈希進程將內容映照到緩沖上時,由于不同終端所見的緩沖范圍有可能不同,從而致使哈希的結果不1致,終究的結果是相同的內容被不同的終端映照到不同的緩沖區中。這類情況明顯是應當避免的,由于它致使相同內容被存儲到不同緩沖中去,下降了系統存儲的效力。分散性的定義就是上述情況產生的嚴重程度。好的哈希算法應能夠盡可能避免不1致的情況產生,也就是盡可能下降分散性。
4、負載(Load):負載問題實際上是從另外一個角度看待分散性問題。既然不同的終端可能將相同的內容映照到不同的緩沖區中,那末對1個特定的緩沖區而言,也可能被不同的用戶映照為不同 的內容。與分散性1樣,這類情況也是應當避免的,因此好的哈希算法應能夠盡可能下降緩沖的負荷。
在散布式集群中,對機器的添加刪除,或機器故障后自動脫離集群這些操作是散布式集群管理最基本的功能。如果采取經常使用的hash(object)%N算法,那末在有機器添加或刪除后,很多原本的數據就沒法找到了,這樣嚴重的違背了單調性原則。接下來主要講授1下1致性哈希算法是如何設計的:
環形Hash空間
依照經常使用的hash算法來將對應的key哈希到1個具有2^32次方個桶的空間中,即0~(2^32)⑴的數字空間中。現在我們可以將這些數字頭尾相連,想象成1個閉合的環形。以下圖
把數據通過1定的hash算法處理后映照到環上
現在我們將object1、object2、object3、object44個對象通過特定的Hash函數計算出對應的key值,然后散列到Hash環上。以下圖:
將機器通過hash算法映照到環上
在采取1致性哈希算法的散布式集群中將新的機器加入,其原理是通過使用與對象存儲1樣的Hash算法將機器也映照到環中(1般情況下對機器的hash計算是采取機器的IP或機器唯1的別名作為輸入值),然后以順時針的方向計算,將所有對象存儲到離自己最近的機器中。
假定現在有NODE1,NODE2,NODE33臺機器,通過Hash算法得到對應的KEY值,映照到環中,其示意圖以下:
通過上圖可以看出對象與機器處于同1哈希空間中,這樣按順時針轉動object1存儲到了NODE1中,object3存儲到了NODE2中,object2、object4存儲到了NODE3中。在這樣的部署環境中,hash環是不會變更的,因此,通過算出對象的hash值就可以快速的定位到對應的機器中,這樣就可以找到對象真實的存儲位置了。
機器的刪除與添加
普通hash求余算法最為不妥的地方就是在有機器的添加或刪除以后會照成大量的對象存儲位置失效,這樣就大大的不滿足單調性了。下面來分析1下1致性哈希算法是如何處理的。
1. 節點(機器)的刪除
以上面的散布為例,如果NODE2出現故障被刪除,那末依照順時針遷移的方法,object3將會被遷移到NODE3中,這樣僅僅是object3的映照位置產生了變化,其它的對象沒有任何的改動。以下圖:
2. 節點(機器)的添加
如果往集群中添加1個新的節點NODE4,通過對應的哈希算法得到KEY4,并映照到環中,以下圖:
通過按順時針遷移的規則,那末object2被遷移到了NODE4中,其它對象還保持這原本的存儲位置。通過對節點的添加和刪除的分析,1致性哈希算法在保持了單調性的同時,還是數據的遷移到達了最小,這樣的算法對散布式集群來講是非常適合的,避免了大量數據遷移,減小了服務器的的壓力。
平衡性
根據上面的圖解分析,1致性哈希算法滿足了單調性和負載均衡的特性和1般hash算法的分散性,但這還其實不能當作其被廣泛利用的緣由,由于還缺少了平衡性。下面將分析1致性哈希算法是如何滿足平衡性的。hash算法是不保證平衡的,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖),object1存儲到了NODE1中,而object2、object3、object4都存儲到了NODE3中,這樣就照成了非常不平衡的狀態。在1致性哈希算法中,為了盡量的滿足平衡性,其引入了虛擬節點。
“虛擬節點”( virtual node )是實際節點(機器)在 hash 空間的復制品( replica ),1實際個節點(機器)對應了若干個“虛擬節點”,這個對應個數同樣成為“復制個數”,“虛擬節點”在 hash 空間中以hash值排列。
以上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖)為例,之前的對象在機器上的散布很不均衡,現在我們以2個副本(復制個數)為例,這樣全部hash環中就存在了4個虛擬節點,最后對象映照的關系圖以下:
根據上圖可知對象的映照關系:object1->NODE1⑴,object2->NODE1⑵,object3->NODE3⑵,object4->NODE3⑴。通過虛擬節點的引入,對象的散布就比較均衡了。那末在實際操作中,正真的對象查詢是如何工作的呢?對象從hash到虛擬節點到實際節點的轉換以下圖:
“虛擬節點”的hash計算可以采取對應節點的IP地址加數字后綴的方式。例如假定NODE1的IP地址為192.168.1.100。引入“虛擬節點”前,計算 cache A 的 hash 值:
引入“虛擬節點”后,計算“虛擬節”點NODE1⑴和NODE1⑵的hash值:
版權聲明:本文為博主原創文章,未經博主允許不得轉載。