1、平衡性(balance):平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。
2、單調性(monotonicity):單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的結果應能夠保證原有已分配的內容可以被對映到原有的或者新的緩衝中去,而不會被對映到舊的緩衝集合中的其他緩衝區。
3、分散性(spread):在分布式環境中,終端有可能看不到所有的緩衝,而是只能看到其中的一部分。當終端希望通過雜湊過程將內容對映到緩衝上時,由於不同終端所見的緩衝範圍有可能不同,從而導致雜湊的結果不一致,最終的結果是相同的內容被不同的終端對映到不同的緩衝區中。這種情況顯然是應該避免的,因為它導致相同內容被儲存到不同緩衝中去,降低了系統儲存的效率。分散性的定義就是上述情況發生的嚴重程度。好的雜湊演算法應能夠盡量避免不一致的情況發生,也就是盡量降低分散性。
4、負載(load):負載問題實際上是從另乙個角度看待分散性問題。既然不同的終端可能將相同的內容對映到不同的緩衝區中,那麼對於乙個特定的緩衝區而言,也可能被不同的使用者對映為不同的內容。與分散性一樣,這種情況也是應當避免的,因此好的雜湊演算法應能夠盡量降低緩衝的負荷。
按照常用的hash演算法來將對應的key雜湊到乙個具有2^32次方個桶的空間中,即0~(2^32)-1的數字空間中。現在我們可以將這些數字頭尾相連,想象成乙個閉合的環形。如下圖
現在我們將object1、object2、object3、object4四個物件通過特定的hash函式計算出對應的key值,然後雜湊到hash環上。
在採用一致性雜湊演算法的分布式集群中將新的機器加入,其原理是通過使用與物件儲存一樣的hash演算法將機器也對映到環中(一般情況下對機器的hash計算是採用機器的ip或者機器唯一的別名作為輸入值),然後以順時針的方向計算,將所有物件儲存到離自己最近的機器中。
假設現在有node1,node2,node3三颱機器,通過hash演算法得到對應的key值,對映到環中,其示意圖如下:
以看出物件與機器處於同一雜湊空間中,這樣按順時針轉動object1儲存到了node1中,object3儲存到了node2中,object2、object4儲存到了node3中。在這樣的部署環境中,hash環是不會變更的,因此,通過算出物件的hash值就能快速的定位到對應的機器中,這樣就能找到物件真正的儲存位置了。
普通hash求餘演算法最為不妥的地方就是在有機器的新增或者刪除之後會照成大量的物件儲存位置失效,這樣就大大的不滿足單調性了。下面來分析一下一致性雜湊演算法是如何處理的。
1. 節點(機器)的刪除
以上面的分布為例,如果node2出現故障被刪除了,那麼按照順時針遷移的方法,object3將會被遷移到node3中,這樣僅僅是object3的對映位置發生了變化,其它的物件沒有任何的改動。
如果往集群中新增乙個新的節點node4,通過對應的雜湊演算法得到key4,並對映到環中,如下圖:
通過按順時針遷移的規則,那麼object2被遷移到了node4中,其它物件還保持這原有的儲存位置。通過對節點的新增和刪除的分析,一致性雜湊演算法在保持了單調性的同時,還是資料的遷移達到了最小,這樣的演算法對分布式集群來說是非常合適的,避免了大量資料遷移,減小了伺服器的的壓力。
hash演算法是不保證平衡的,若只部署了node1和node3的情況(node2被刪除的圖),object1儲存到了node1中,而object2、object3、object4都儲存到了node3中,這樣就照成了非常不平衡的狀態。在一致性雜湊演算法中,為了盡可能的滿足平衡性,其引入了虛擬節點。
「虛擬節點」( virtual node )是實際節點(機器)在 hash 空間的複製品( replica ),一實際個節點(機器)對應了若干個「虛擬節點」,這個對應個數也成為「複製個數」,「虛擬節點」在 hash 空間中以hash值排列。
以上面只部署了node1和node3的情況(node2被刪除的圖)為例,之前的物件在機器上的分布很不均衡,現在我們以2個副本(複製個數)為例,這樣整個hash環中就存在了4個虛擬節點,最後物件對映的關係圖如下:
根據上圖可知物件的對映關係:object1->node1-1,object2->node1-2,object3->node3-2,object4->node3-1。通過虛擬節點的引入,物件的分布就比較均衡了。那麼在實際操作中,正真的物件查詢是如何工作的呢?物件從hash到虛擬節點到實際節點的轉換如下圖:
「虛擬節點」的hash計算可以採用對應節點的ip位址加數字字尾的方式。例如假設node1的ip位址為192.168.1.100。引入「虛擬節點」前,計算 cache a 的 hash 值:
hash(「192.168.1.100」);
引入「虛擬節點」後,計算「虛擬節」點node1-1和node1-2的hash值:
hash(「192.168.1.100#1」); // node1-1
hash(「192.168.1.100#2」); // node1-2
一致性雜湊演算法的基本實現原理是將機器節點和key值都按照一樣的hash演算法對映到乙個0~2^32的圓環上。當有乙個寫入快取的請求到來時,計算key值k對應的雜湊值hash(k),如果該值正好對應之前某個機器節點的hash值,則直接寫入該機器節點,如果沒有對應的機器節點,則順時針查詢下乙個節點,進行寫入,如果超過2^32還沒找到對應節點,則從0開始查詢(因為是環狀結構)。
經過一致性雜湊演算法雜湊之後,當有新的機器加入時,將只影響一台機器的儲存情況,而其他所有節點的處理情況都將保持不變,因此表現出很好的單調性。
由於在機器節點雜湊和緩衝內容雜湊時都採用了同一種雜湊演算法,因此也很好得降低了分散性和負載。而通過引入虛擬節點的方式,也大大提高了平衡性。
參考:
一致性雜湊演算法
好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...
一致性雜湊演算法
在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用hash的方式將業務請求分散到這些節點處理,如果有n個節點,計算方法為 hash id n。如果只是簡單的計算,不涉及使用者狀態,這是乙個簡單有效的方案。如果節點的計算涉及使用者狀態,比如維護購物車 memcache快取服務等,好像也沒...
一致性雜湊演算法
判定好壞的四個定義 1 平衡性 balance 平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。2 單調性 monotonicity 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...