隨著資料的分布式儲存,如何快速定位資料在集群中的位置,關係到集群的效能。下面介紹常見的分布式儲存方式。普通集群把固定的key對映到固定的節點上,節點中至只存放各自key的資料。這種方式就需要將key和節點的關係作為一張單獨的**進行維護,當其中乙個節點宕機的時候,節點上的資料需要遷移,這個時候這張**也需要重新維護。
這種方法的問題也有,當需要查詢某乙個key對應的節點的時候,我們需要遍歷整張**。查詢速度比較慢。
為了不想維護上面的**,降低複雜性和其他開銷,容易想到的方法是對資料的key進行雜湊,這樣我們在查詢的時候可以直接取模訪問這個節點。
但是這個方案的問題在於如果某個節點宕機了,那麼這個節點的資料就完全不可用了。在遷移的時候往往需要遷移大部分的資料,整個集群的資料也需要重新對映一遍。
再說了,如果新增節點的話,遷移的工作也非常麻煩。這就提出了一致性雜湊的方案。
一致性雜湊是一種演算法,簡單的說,在移除或者新增乙個節點的時候,它可以盡可能小的改變已存在key的對映關係。
一致性雜湊將整個雜湊值的空間組織成乙個虛擬的圓環,現在假設某個雜湊函式hash的值的空間為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的對映位置發生了變化,其它的物件沒有任何的改動。如下圖:
2.節點(機器)的新增
如果往集群中新增乙個新的節點node4,通過對應的雜湊演算法得到key4,並對映到環中,如下圖:
通過按順時針遷移的規則,那麼object2被遷移到了node4中,其它物件還保持這原有的儲存位置。通過對節點的新增和刪除的分析,一致性雜湊演算法在保持了單調性的同時,還是資料的遷移達到了最小,這樣的演算法對分布式集群來說是非常合適的,避免了大量資料遷移,減小了伺服器的的壓力。
上面的**分析,一致性雜湊演算法滿足了單調性和負載均衡的特性以及一般hash演算法的分散性,但這還並不能當做其被廣泛應用的原由,因為還缺少了平衡性。下面將分析一致性雜湊演算法是如何滿足平衡性的。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
一致性雜湊
直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...
一致性雜湊
from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...
一致性雜湊
一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...