本文转自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