標籤:
[轉]Reed Solomon糾刪碼 http://peterylh.blog.163.com/blog/static/12033201371375050233/ 糾刪碼是儲存領域常用的資料冗餘技術, 相比多副本複製而言, 糾刪碼能夠以更小的資料冗餘度獲得更高資料可靠性。 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子矩陣可逆。圖1: 編碼運算 圖2:vandermode矩陣
資料恢複原理RS最多能容忍m個刪除錯誤。 資料恢複原理的過程如下:(1)從編碼矩陣中刪去遺失資料塊和丟失編碼塊對應行。 假設D1、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。 乘法公式: a * b = gfilog(gflog(a) + fglog(b)) % (2^w -1)
小結RS的特點:(1) 低冗餘度,高可靠性。(2) 資料恢複代價高。 遺失資料塊或者編碼塊時, RS需要讀取n個資料區塊和校正塊才能恢複資料, 資料恢複效率也在一定程度上制約了RS的可靠性。(3) 資料更新代價高。 資料更新相當於重新編碼, 代價很高, 因此常常針對唯讀資料,或者冷資料。(4) RS編碼依賴於兩張2^w-1大小的log表, 通常只能採用16位或者8位字長,不能充分利用64位伺服器的計算能力, 具體實現上可能要做一些最佳化。 參考文獻:[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
[轉]Reed Solomon糾刪碼