一致性hash原理及在存儲中的應用

在做分佈式存儲方案設計時面臨的一個重要問題是如何記錄數據在多個存儲節點上的分佈情況。當前分佈式存儲在元數據管理上有兩種架構,去中心化和中心化。在去中心化的分佈式系統中元數據分佈通常通過計算得出,比如ceph和glusterfs,這種情況下不需要元數據服務器參與。
中心化的分佈式存儲系統中例如cephfs、hdfs、gfs、tikv等,需要通過中心化元數據服務器來存儲當前系統的元數據信息,並且元數據服務器參與IO,在IO過程中會訪問元數據服務器獲取IO的元數據信息。

中心化是採用元數據服務器(MS)的方式集中存儲數據塊在存儲節點上的映射關係。採用元數據服務器方式可以很好的將數據和元數據分離,當需要訪問數據塊的時候,可以直接從元數據服務器上獲取該數據塊的映射信息。基於MS的分佈式存儲架構如下圖所示:

基於元數據服務器的方式是分佈式存儲的經典架構,因其技術成熟、安全可靠至今還是分佈式存儲中的常見配置。具體來說具有以下幾個優點:

(1)、設計實現簡單

(2)、擴容方便,因爲數據和元數據分離,可以輕鬆實現存儲節點擴容。

(3)、元數據管理方便,數據分佈的均衡、遷移都比較方便

雖然看起來很完美,但是還是存在如下兩大主要問題:

1,可擴展性受限於元數據服務器的能力。所有的元數據信息都集中在元數據服務器上面,所以,當Client想要獲取元數據時就需要訪問該服務器。因此,整體的帶載能力(Client的個數)就受限於元數據服務器的能力。元數據服務器就是整個分佈式系統的潛在瓶頸點。特別當Client訪問小文件時,會產生大量的元數據信息,此時元數據服務器就會成爲系統性能瓶頸。

2,一旦元數據服務器發生故障,整個分佈式存儲系統將無法正常工作,因此,元數據服務器的可靠性尤爲重要。

總結起來,集中式元數據服務器的最大問題在於性能和可靠性。針對集中式元數據存儲也有很多優化手段,例如,針對性能問題多采用NVDIMM等非易內存作爲緩存,在client和元數據服務器多級元數據緩存,一次元數據多申請些儘量減少和元數據服務器通信等手段進行緩解。針對可靠性問題,一般採用分佈式元數據服務器,避免單節點元數據故障導致整個元數據服務不可用。市場上分佈式元數據服務開源產品也比較多,技術也比較成熟。

但論怎麼優化,採用元數據服務器方式的分佈式存儲都不能達到線性可擴展的目的。基本上擴展能力呈現對數LOG的曲線方式。爲了達到線性可擴展的能力,業界開始考慮如何去掉元數據服務器,即去中心化。其中發展出來的算法有HASH算法、一致性HASH算法、彈性HASH算法和CRUSH算法。此處重點討論一致性HASH算法。

在談到一致性HASH的時候,首先需要考慮HASH算法。在分佈式存儲中應用的HASH算法很簡單,其可以描述如下:

當Client需要將一塊數據寫入存儲節點是的時候,可以將數據塊的邏輯地址和文件名作爲Key值算出一個HASH值,這個HASH算法需要有很好的分佈特徵。在得出這個HASH值之後,再和Storage Node的個數N做取餘操作,得出的結果在0到N-1之間,該結果就是需要訪問的Storage Node編號。從這種方法來看讀寫過程不需要元數據服務器的介入,文件和存儲節點之間的映射關係由HASH函數來決定,並且是可計算的。

HASH算法看起來非常的完美,但是,其問題在於如果動態增加一個節點之後,這種數據映射關係就會遭到破壞,原因在於HASH算法中的N發生了變化。爲了建立新的映射關係,不得不需要引入大量的數據遷移操作,這在大規模分佈式存儲中是不允許發生的。爲了解決這個問題,引入了一致性HASH算法。

一致性HASH的核心思想是將HASH結果域做成一個空間,並且爲所有的存儲節點分配一個標籤值,這些標籤值屬於這個HASH值空間。通常這種關係可以描述成一個哈希環,這個空間就構成了這個HASH環,所有存儲節點是這個環上的一個點。可以描述如下:

當Client需要將一個塊數據寫入Storage的時候,同樣可以將數據塊的邏輯地址和文件名作爲HASH函數的參數,然後得到一個HASH值。這個得到的HASH值肯定會屬於HASH值空間,也就是說在HASH環上面肯定可以找到一個對應的點。例如,這個點位於SN1和SN2之間。按照協議,可以選擇順時針離HASH值最近的節點作爲數據存儲點。即新寫入的文件可以存入SN2。

一致性HASH算法的最大優點在於避免添加存儲節點之後的大規模數據遷移。例如在剛纔的例子中,如果後來在SN1和SN2之間添加了一個SN6,那麼原先存入SN2中的一部分數據需要遷移到SN6,但是,其餘節點不需要做任何的數據遷移操作。

顯然這種方法大大降低了數據遷移量,又能很好的避免元數據服務器帶來的問題。因此,一致性HASH算法被廣泛應用到了CDN系統、SWIFT對象存儲系統、Amazon的dynamo存儲系統中。

 

 

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