哈希分佈與一致性哈希算法簡介

哈希分佈與一致性哈希算法簡介

     一致性hash應用領域主要是分佈式緩存(分佈式memcache)以及分佈式存儲(amazon的dynamo存儲)。

     在大型web應用中,緩存算是一個標配,在大規模的緩存應用中,分佈式緩存系統應運而生。key-value如何均勻的分散到集羣中?最常規的方式莫過於hash取模的方式。比如集羣中可用機器數量爲N,那麼key值爲K的的數據請求很簡單的可以路由到hash(K) mod N對應的機器。這種結構較簡單實用。但是在一些高速發展的web系統中,這樣的解決方案仍有缺陷。隨着系統訪問壓力的增長,緩存系統不得不通過增加機器節點的方式提高集羣的響應速度和數據承載量。如果還是按照hash取模的方式,在增加機器節點的時,會存在大量的緩存不命中,緩存數據需要重新建立,甚至進行整體的緩存數據遷移,會給DB帶來極高的系統負載,甚至導致DB服務器宕機。 那麼就沒有辦法解決hash取模的方式帶來的詬病嗎?看下文。

(一) 一致性哈希基本原理(Consistent Hashing)
 選擇具體的機器節點不在只依賴需要緩存數據的key的hash本身了,而是機器節點本身也進行了hash運算。
(1) hash機器節點
    首先求出機器節點的hash值(怎麼算機器節點的hash?ip可以作爲hash的參數,當然還有其他的方法),然後將其分佈到0~2^32的一個圓環上(順時針分佈)。如下圖所示:

x軸表示的是需要爲每臺物理服務器擴展的虛擬節點倍數(scale),y軸是實際物理服務器數,可以看出,當物理服務器的數量很小時,需要更大的虛擬節點,反之則需要更少的節點,從圖上可以看出,在物理服務器有10臺時,差不多需要爲每臺服務器增加100~200個虛擬節點才能達到真正的負載均衡。

 

(2)訪問方式 
    如果有一個寫入緩存的請求,其中Key值爲K,計算器hash值Hash(K), Hash(K) 對應於圖 – 1環中的某一個點,如果該點對應沒有映射到具體的某一個機器節點,那麼順時針查找,直到第一次找到有映射機器的節點,該節點就是確定的目標節點,如果超過了2^32仍然找不到節點,則命中第一個機器節點。比如 Hash(K) 的值介於node2~node2之間,那麼命中的機器節點應該是node節點(如上圖 )。

(3)增加節點的處理 
    在原有集羣的基礎上欲增加一臺機器node5,增加過程如下: 計算機器節點的Hash值,將機器映射到環中的一個節點,如下圖:

    (一):如果用在緩存領域,增加機器節點node5之後,訪問策略不改變,依然按照(2)中的方式訪問,此時緩存命不中的情況依然不可避免,不能命中的數據是hash(K)在增加節點以前落在node2~node5之間的數據。儘管依然存在節點增加帶來的命中問題,但是比較傳統的 hash取模的方式,一致性hash已經將不命中的數據降到了最低。

    (二):在實際的像dynamo這樣的實際存儲系統中,加入節點成功的標準應該是把 node2和node5之間之前存儲在node4中的數據遷移到新加入的node5中才算成功。

(二)負載均衡+虛擬節點

    Consistent Hashing最大限度地抑制了hash鍵的重新分佈。另外要取得比較好的負載均衡的效果,往往在服務器數量比較少的時候需要增加虛擬節點來保證服務器能均勻的分佈在圓環上。因爲使用一般的hash方法,服務器的映射地點的分佈非常不均勻。使用虛擬節點的思想,爲每個物理節點(服務器)在圓上分配100~200個點。這樣就能抑制分佈不均勻,最大限度地減小服務器增減時的緩存重新分佈。用戶數據映射在虛擬節點上,就表示用戶數據真正存儲位置是在該虛擬節點代表的實際物理服務器上。
下面有一個圖描述了需要爲每臺物理服務器增加的虛擬節點。

    x軸表示的是需要爲每臺物理服務器擴展的虛擬節點倍數(scale),y軸是實際物理服務器數,可以看出,當物理服務器的數量很小時,需要更多的虛擬節點,反之則需要更少的節點,從圖上可以看出,在物理服務器有10臺時,差不多需要爲每臺服務器增加100~200個虛擬節點才能達到較好的負載均衡。 

 

(二)參考資料

以下爲一些分佈式緩存的資料。

      《memcached 全面剖析》:

ponit:

  • 類似內核高速緩存slab機制的內存管理
  • 一致性hash
  • rddtools 圖形化監控與管理
  • 可插拔的存儲引擎
                slab內存 /  bdb  等

      memcache的適用性    http://blog.developers.api.sina.com.cn/?p=124 :

     《dynamo》:http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf

     《Scaling Parallel I/O Performance through I/O Delegate and Caching System》:http://dl.acm.org/ft_gateway.cfm?id=1413380&type=pdf&CFID=76343966&CFTOKEN=54995877

 

 

 

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