一、概述
Erasure Code 可以應用於分布式存儲系統中,替代多份數據拷貝的數據冗余方式,從而可以提高存儲空間利用率。此外, Erasure code 還可以應用於傳統 RAID系統中,增加數據冗余度,支持多塊盤同時發生故障,從而可以提高數據可靠性。
采用范德蒙矩陣可以構建 Erasure code (關於范德蒙矩陣的編解碼方法,可以參考文章《 基於范德蒙矩陣的 Erasure code 技術詳解 》),其生成矩陣表示如下:
采用范德蒙矩陣作為編碼矩陣的問題在於算法復雜度太高,其解碼算法復雜度為O ( n^3 )。采用目前的處理器技術,還是會影響 IO 的性能,增加 IO 延遲。因此,找到一種更加合理的編碼矩陣,降低算法復雜度是 Erasure code 得以廣泛應用的一個前提條件。
二、基於柯西矩陣的編解碼過程
基於柯西矩陣的李德 - 所羅門( RS )碼是在范德蒙矩陣的 RS 碼基礎上作了兩點重要改進:
1, 用柯西矩陣來代替范德蒙矩陣。由於范德蒙矩陣求逆運算的復雜度為 O (n^3 ),而柯西矩陣求逆運算的復雜度僅為 O ( n^2 )。因此,采用柯西矩陣可以降低解碼的運算復雜度。
2, 采用有限域二進制矩陣的方式來提高運算效率,直接將乘法轉換成 XOR 邏輯運算,大大降低了運算復雜度。
大家知道,柯西矩陣可以描述如下:
X ( i )和 Y ( i )都是迦羅華域 GF ( 2^w )中的元素。柯西矩陣有兩個特點:第一,任意一個子方陣都是奇異矩陣,存在逆矩陣;第二,柯西矩陣在迦羅華域上的求逆運算,可以在 O ( n^2 )的運算復雜度內完成。
采用柯西矩陣進行 Erasure code 編碼過程描述如下:
其運算過程和范德蒙矩陣編碼過程是一樣的,只不過采用柯西矩陣替換了范德蒙矩陣。從運算過程來看,編碼過程是迦羅華域的系列乘法、加法運算。
柯西解碼方程描述如下:
當任何一個數據元 d ( i )遭到損壞時,需要通過解碼過程進行數據恢復。數據解碼過程可以分成如下幾大步驟:
1, 選取剩余有效的數據塊,構成一個解碼列向量。例如, d1 、 d3 數據塊損壞了,那么可以選取剩余數據 d0 、 d2 、 c0 、 c2 作為解碼列向量。
2, 摘取生成矩陣(柯西矩陣)中解碼列向量所對應的行,構成方陣 A ,該矩陣的逆矩陣就是解碼生成矩陣 inv(A) 。
3, 解碼生成矩陣 inv(A) 和解碼列向量的乘積就可以得到丟失的數據 d1 和 d3 。
從整個過程來看,矩陣求逆過程是最大的運算開銷。解碼過程和范德蒙矩陣編碼是一樣的,但是柯西矩陣的求逆運算復雜度要低於范德蒙矩陣,因此,具有更好的性能。
三、柯西編解碼過程優化
從編解碼過程來看,柯西編解碼最大的運算量是乘法和加法運算。在范德蒙編碼的時候,我們可以采用對數 / 反對數表的方法將乘法運算轉換成了加法運算,並且在迦羅華域中,加法運算轉換成了 XOR 運算。
柯西編解碼為了降低乘法復雜度,采用了有限域上的元素都可以使用二進制矩陣表示的原理,將乘法運算轉換成了迦羅華域“與運算”和“ XOR 邏輯運算”,提高了編解碼效率。
從數學的角度來看,在迦羅華有限域中,任何一個 GF ( 2^w )域上的元素都可以映射到 GF ( 2 )二進制域,並且采用一個二進制矩陣的方式表示 GF ( 2^w )中的元素。例如, GF ( 2^3 )域中的元素可以表示成 GF ( 2 )域中的二進制矩陣:
圖中,黑色方塊表示邏輯 1 ,白色方塊表示邏輯 0 。通過這種轉換, GF ( 2^w)域中的陣列就可以轉換成 GF ( 2 )域中的二進制陣列。生成矩陣的陣列轉換表示如下:
在 GF ( 2^w )域中的生成矩陣為 K* ( K+m ),轉換到 GF ( 2 )域中,變成了 (w*k) * (w*(k+m)) 二進制矩陣。采用域轉換的目的是簡化 GF ( 2^w )域中的乘法運算。在 GF ( 2 )域中,乘法運算變成了邏輯與運算,加法運算變成了 XOR運算,可以大大降低運算復雜度。和范德蒙編解碼中提到的對數 / 反對數方法相比,這種方法不需要構建對數 / 反對數表,可以支持 w 為很大的 GF 域空間。采用這種有限域轉換的方法之后,柯西編碼運算可以表示如下:
四、總結
可以說柯西編碼是在范德蒙編碼基礎之上的一種優化。其主要有兩點:第一降低了矩陣求逆的運算復雜度;第二通過有限域轉換,將 GF ( 2^w )域中的元素轉換成二進制矩陣,簡化了乘法運算。所以,柯西編解碼要優於范德蒙矩陣的方法,柯西編碼的運算復雜度為 O ( n(n- m) ),解碼復雜度為 O ( n^2 )。
本文出自 “存儲之道” 博客,轉載請與作者聯系!