本文轉自http://www.bitstech.net/2013/11/10/reed-solomon-erasure-code/算法
糾刪碼是存儲領域經常使用的數據冗餘技術, 相比多副本複製而言, 糾刪碼可以以更小的數據冗餘度得到更高數據可靠性。 Reed Solomon Coding是存儲領域經常使用的一種糾刪碼,它的基本原理以下: 給定n個數據塊d1, d2,…, dn,n和一個正整數m, RS根據n個數據塊生成m個校驗塊, c1, c2,…, cm。 對於任意的n和m, 從n個原始數據塊和m 個校驗塊中任取n塊就能解碼出原始數據, 即RS最多容忍m個數據塊或者校驗塊同時丟失(糾刪碼只能容忍數據丟失,沒法容忍數據篡改,糾刪碼正是得名與此)。服務器
編碼原理
RS編碼以word爲編碼和解碼單位, 大的數據塊拆分到字長爲w的word(字長w取值通常爲8或者16位),而後對word進行編解碼。 因此數據塊的編碼原理與word編碼原理沒什麼差異, 爲論述方便, 後文中變量Di, Ci將表明一個word。
首先, 把輸入數據視爲向量D=(D1,D2,…, Dn), 編碼後數據視爲向量(D1, D2,…, Dn, C1, C2,.., Cm),RS編碼可視爲如圖1所示矩陣運算。 下圖最左邊是編碼矩陣, 矩陣上部是單位陣(n行n列),下邊是vandermonde矩陣B(m行n列), vandermode矩陣如圖2所示, 第i行,第j列的原數值爲j^(i-1)。之因此採用vandermonde矩陣的緣由是, RS數據恢復算法要求編碼矩陣任意n*n子矩陣可逆。性能
數據恢復原理
RS最多能容忍m個刪除錯誤。 數據恢復原理的過程以下:
(1)從編碼矩陣中刪去丟失數據塊和丟失編碼塊對應行。 假設D一、C2丟失, 根據圖1所示RS編碼運算等式,咱們獲得以下B’以及等式。優化
(2)因爲B‘是可逆的, 兩邊乘上B’逆矩陣。
(3)獲得以下原始數據D的計算公式
(4)對D從新編碼,獲得丟失的校驗碼編碼
矩陣求逆採用高斯消元法, 須要進行實數加減乘除四則運算,沒法做用於字長爲w的二進制數據。 爲了解決這個問題, RS採用伽羅華羣GF(2^w)中定義的四則運算法則。 GF(2^w)域有2^w個值, 每一個值都對應一個低於w次的多項式, 這樣域上的四則運算就轉換爲多項式空間的運算[2]。 GF(2^w)域中的加法就是XOR, 乘法比較特殊,須要維護兩個大小爲2^w -1的表格: log表gflog,反log表gfilog。.net
CRS(Cauchy Reed Solomon)code
RS糾刪碼的計算代價較高, 瓶頸在於乘除法, 乘除法操做須要3次查表操做, 一次加(減)法操做, 一次條件判斷,一次取模操做(可優化爲一次條件判斷和一次減法操做)。 CRS從兩個方面優化RS性能
(1) 使用Cauchy編碼矩陣, Cauchy編碼矩陣的好處是求逆矩陣比較快
(2) 將GF(2^w)中的運算所有轉換爲XOR, 其中的數學原理比較複雜, 可參見文獻[3]get
小結數學
RS的特色:
(1) 低冗餘度,高可靠性。
(2) 數據恢復代價高。 丟失數據塊或者編碼塊時, RS須要讀取n個數據塊和校驗塊才能恢復數據, 數據恢復效率也在必定程度上制約了RS的可靠性。
(3) 數據更新代價高。 數據更新至關於從新編碼, 代價很高, 所以經常針對只讀數據,或者冷數據。
(4) RS編碼依賴於兩張2^w-1大小的log表, 一般只能採用16位或者8位字長,不能充分利用64位服務器的計算能力, 具體實現上可能要作一些優化。it
參考文獻:[1]James S. Plank. Erasure Codes For Storage Application.[2]James S. Plank. A Tutorial on Reed-Solomon Coding for Fault-Tolerance in RAID-like Systems[3]James S. Plank. Optimizing Cauchy Reed-Solomon Codes for Fault-Tolerant Storage Applications