基於範德蒙矩陣的Erasure code技術詳解

時間2014-05-04 20:57:31  存儲之道 原文  http://alanwu.blog.51cto.com/3652632/1406312

在傳統存儲領域,隨着磁盤容量的不斷增大, RAID 數據重構時間將會是一個非常嚴重的問題。大家知道,過長的數據重構時間意味着數據可靠性下降。所以,在RAID 設計的過程中,一定要考慮數據重構的時間,並且儘可能的將“無數據保護狀態”的時間降到最小。在不改變傳統 RAID 架構前提下,只能通過增加數據冗餘度來緩解大容量磁盤引入的超長數據重構時間的問題。這種思路就好比幾年前,當RAID5 無法滿足過長數據重構時間時,只能被迫採用 RAID6 算法,通過 RAID6 能夠提供兩塊盤的冗餘度來緩解長時間數據重構的問題。隨着時間的推移,目前,在很多應用中, RAID6 也無法滿足應用需求了。爲了達到更高的數據冗餘度,一個比較不錯的選擇是採用冗餘度更大的編解碼方式: Erasure Code 。很多公司將基於這種編碼方式的 RAID 稱之爲 RAID7 。

在互聯網領域,通常採用 Server SAN 的存儲架構方式。也就是將廉價的 Server通過集羣軟件的方式組建一套分佈式的存儲系統。 Google 首先倡導了這種方式,架構了 GFS 系統,將很多非格式化的數據(例如網頁)存儲到這種分佈式系統中。通常,這種廉價的 Server 是不具備 RAID 功能的,那麼數據可靠性如何保證呢?在這種 Server SAN 中,通常會將數據複製多份存儲到不同的節點上,一旦一個節點失效,數據可以從其它節點上獲取。數據多節點複製的方式可以很好的提高數據可靠性,並且可以將讀寫數據流很好的分離。但是,帶來的問題是存儲利用率大爲降低。對於一般的數據,通常會存儲三份,對於非常重要的數據,會存儲六份。如何平衡存儲空間和數據可靠性成了分佈式存儲需要考慮的重要問題。Erasure Code 可以平衡這兩者關係,在提高存儲空間利用率的前提下,不會影響數據可靠性。採用 Erasure Code 對數據進行編碼冗餘的方式和“網絡 RAID ( RAIN)”的概念是很相像的。當互聯網領域引入 Erasure Code 之後,需要考慮的問題是如何降低編解碼的運算複雜度問題。

事實已經證明, Erasure Code 作爲一種數據編解碼技術在大數據環境下有了十分迫切的需求。不僅傳統的 RAID 需要這種技術,而且分佈式存儲也需要這種技術去提升存儲資源利用率。

常用的 Erasure code 是基於範德蒙( Vandermonde )矩陣的 RS 算法。其基本思想很簡單,採用範德蒙矩陣作爲生成矩陣,得到校驗數據。現假設輸入數據爲D1~Dn ,生成的校驗數據爲 C1~Cm ,那麼輸入數據和校驗數據之間的關係可以描述爲:

wKiom1NmOYCAthUnAACRcYLRdKQ999.jpg

其中,

wKioL1NmOXWzeF4aAAAklV9KIf8826.jpg

爲範德蒙矩陣,該矩陣爲編碼矩陣。所以,爲了得到校驗數據,主要的任務是將輸入數據和編碼矩陣相乘,得到的輸出結果就是編碼值。爲了能夠更好的表示磁盤上存儲的數據,通常將編碼矩陣方程表示如下:

wKioL1NmOY-TUV5hAABUp52VC98710.jpg

可以發現這個生成矩陣( A )就是單元矩陣和範德蒙矩陣的組合。輸入數據( D)和生成矩陣( A )的乘積就是編碼之後的存儲數據( E )。採用傳統 RAID 的思路去理解,編碼之後的結果就是一個條帶需要存儲的所有數據。

編碼過程我們已經很清楚了,生成矩陣的格式很規整。那麼,問題是如何進行解碼操作呢?當存儲的數據 d1~dn,c1~cm 中有些數據無法讀取時,如何進行數據恢復呢?從數學的原理來看,只要將讀取的有效數據和生成矩陣的逆矩陣相乘就可以恢復丟失的數據。假設 m 個數據塊丟失,則可以將 m 個數據塊對應的矩陣 A 和 E中的行刪掉,得到新的 n*n 階生成矩陣 A2 和 1*n 階結果矩陣 E2 。由於生成矩陣是有範德蒙矩陣和單元矩陣的組合,所以,矩陣 A 的任意 n 行子集都可以保證線性無關。因此,需要恢復的數據可以通過 A2 和 E2  的逆矩陣乘積得到,即 D= 逆(A2 ) * 逆( E2 )。

從數學的角度來看,我們現在常用的 RAID5 和 RAID6 算法只是範德蒙矩陣算法的一個子集而已。當冗餘數據只有一個的時候,就退化成了 RAID5 算法,在實數域只需要將輸入數據累加就可以得到校驗碼了。爲了簡化計算複雜度,編解碼運算放到了迦羅話域,加法運算變成了 XOR 邏輯運算。當冗餘數據有兩個的時候,範德蒙矩陣退化成了 RAID6 算法,也可以在迦羅華域通過查表、 XOR 的方法完成運算。具體可以參考文章《 一個 IO 的傳奇一生( 12 ) --  磁盤陣列 1 》。

從這個角度來看,基於範德蒙矩陣的 Erasure Code 方法是傳統 RAID5/RAID6 算法的擴展。在實現過程中,同樣可以在迦羅華域中完成乘、除和加減法運算。爲了實現快速算法,需要構建兩張對數表和反對數表,然後通過查表和 XOR 運算快速實現編解碼。

基於範德蒙矩陣的 Erasure Code 編解碼原理比較簡單,可以說是在RAID5/RAID6 算法基礎上的一種延伸。採用這種方法的算法複雜度還是比較高的,編碼複雜度爲 O ( mn ),其中 m 爲校驗數據個數, n 爲輸入數據個數。解碼複雜度爲 O ( n^3 ),解碼具有較高的計算複雜度。

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