時間2014-05-04 20:57:31
儲存之道
原文在傳統儲存領域,隨著磁碟容量的不斷增大, 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 ,那麼輸入資料和校驗資料之間的關係可以描述為:
其中,
為范德蒙矩陣,該矩陣為編碼矩陣。所以,為了得到校驗資料,主要的任務是將輸入資料和編碼矩陣相乘,得到的輸出結果就是編碼值。為了能夠更好的表示磁碟上儲存的資料,通常將編碼矩陣方程表示如下:
可以發現這個生成矩陣( 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 ),解碼具有較高的計算複雜度。
基於範德蒙矩陣的Erasure code技術詳解
在傳統儲存領域,隨著磁碟容量的不斷增大,raid 資料重構時間將會是乙個非常嚴重的問題。大家知道,過長的資料重構時間意味著資料可靠性下降。所以,在 raid 設計的過程中,一定要考慮資料重構的時間,並且盡可能的將 無資料保護狀態 的時間降到最小。在不改變傳統 raid 架構前提下,只能通過增加資料冗...
基於範德蒙矩陣的Erasure code技術詳解
在傳統儲存領域,隨著磁碟容量的不斷增大,raid資料重構時間將會是乙個非常嚴重的問題。大家知道,過長的資料重構時間意味著資料可靠性下降。所以,在raid設計的過程中,一定要考慮資料重構的時間,並且盡可能的將 無資料保護狀態 的時間降到最小。在不改變傳統raid架構前提下,只能通過增加資料冗餘度來緩解...
51nod 範德蒙矩陣
思路 根據矩陣乘法的定義,g中的第i行第j列的元素 ai,j 對答案的貢獻為 ai,j t中第j行的所有元素之和。因此我們可以將t中根據每行的和進行排序。第i行的和可以通過公式 ai n 1 ai 1 直接得出。注意考慮 ai 1,ai 0 以及 ai mod 的特殊情況即可。還有就是對於除法取模需...