Erasure Code – EC纠删码原理
一、什么是Erasure Code
Erasure Code(EC),即纠删码,是一种前向错误纠正技术(Forward Error Correction,FEC,说明见后附录),主要应用在网络传输中避免包的丢失, 存储系统利用它来提高 存储 可靠性。相比多副本复制而言, 纠删码能够以更小的数据冗余度获得更高数据可靠性, 但编码方式较复杂,需要大量计算 。纠删码只能容忍数据丢失,无法容忍数据篡改,纠删码正是得名与此。
EC的定义:Erasure Code是一种编码技术,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。
目前,纠删码技术在分布式存储 系统中的应用主要有三类,阵列纠删码(Array Code: RAID5、RAID6等)、RS(Reed-Solomon)里德-所罗门类纠删码和LDPC(LowDensity Parity Check Code)低密度奇偶校验纠删码。
LDPC码也可以提供很好的保障可靠性的冗余机制。与RS编码相比,LDPC编码效率要略低,但编码和解码性能要优于RS码以及其他的纠删码,主要得益于编解码采用的相对较少并且简单的异或操作。LDPC码目前主要用于通信、视频和音频编码等领域。
本文主要讲解RS类纠删码。
二、Reed-Solomon Code
RS code是基于有限域的一种编码算法,有限域又称为Galois Field,是以法国著名数学家伽罗华(Galois)命名的,在RS code中使用GF(2^w),其中2^w >= n + m。
RS code的编解码定义如下:
编码:给定n个数据块(Data block)D1、D2……Dn,和一个正整数m,RS根据n个数据块生成m个编码块(Code block),C1、C2……Cm。
解码:对于任意的n和m,从n个原始数据块和m个编码块中任取n块就能解码出原始数据,即RS最多容忍m个数据块或者编码块同时丢失。
把输入数据视为向量D=(D1,D2,…, Dn), 编码后数据视为向量(D1, D2,…, Dn, C1, C2,.., Cm),RS编码可视为如下图所示矩阵运算。

上图最左边是编码矩阵(或称为生成矩阵、分布矩阵,Distribution Matrix),编码矩阵需要满足任意n*n子矩阵可逆。
为方便数据存储,编码矩阵上部是单位阵(n行n列),下部是m行n列矩阵。下部矩阵可以选择范德蒙德矩阵或柯西矩阵。后文说明。
2、RS code编码数据恢复原理
RS最多能容忍m个数据块被删除。 数据恢复的过程如下:
(1)假设D1、D4、C2丢失,从编码矩阵中删掉丢失的数据块/编码块对应的行。

根据图1所示RS编码运算等式,可以得到如下B’ 以及等式。

(2)由于B’ 是可逆的,记B’的逆矩阵为 (B’^-1),则B’ * (B’^-1) = I 单位矩阵。两边左乘B’ 逆矩阵。


(4)对D重新编码,可得到丢失的编码码
3、RS code编码的限制
1)数据恢复代价高和数据更新代价高,因此常常针对只读数据,或者冷数据。
2)RS编码依赖于两张2^w-1大小的log表, 通常只能采用16位或者8位字长,不能充分利用64位服务器的计算能力, 具体实现上可能要做一些优化。
在线性代数中有一种矩阵称为范德蒙德矩阵,它的任意的子方阵均为可逆方阵。一个m行n列的范德蒙德矩阵定义如下,其中Ai 均不相同,且不为0。

令A1、A2…An分别为1、2、3…n,则得到范德蒙德矩阵为:

编码矩阵就是单位矩阵和范德蒙德矩阵的组合。输入数据(D)和编码矩阵的乘积就是编码后的数据。

算法复杂度:
采用这种方法的算法复杂度还是比较高的,编码复杂度为O(mn),其中m为校验数据个数,n为输入数据个数。解码复杂度为O(n^3)。
2、基于柯西( Cauchy)矩阵
柯西矩阵的任意一个子方阵都是奇异矩阵,存在逆矩阵。而且柯西矩阵在迦罗华域上的求逆运算,可以在O(n^2)的运算复杂度内完成。
柯西矩阵的描述如下:

Xi 和Yi 都是迦罗华域GF(2^w)中的元素。
基于柯西矩阵的编码矩阵:

3、柯西编解码过程优化
在范德蒙编码的时候,我们可以采用对数/反对数表的方法,将乘法运算转换成了加法运算,并且在迦罗华域中,加法运算转换成了XOR运算。
柯西编解码为了降低乘法复杂度,采用了有限域上的元素都可以使用二进制矩阵表示的原理,将乘法运算转换成了迦罗华域“AND运算”和“XOR逻辑运算”,提高了编解码效率。
从数学的角度来看,在迦罗华有限域中,任何一个GF(2^w)域上的元素都可以映射到GF(2)二进制域,并且采用一个二进制矩阵的方式表示GF(2^w)中的元素。
例如,GF(2^3)域中的元素可以表示成GF(2)域中的二进制矩阵:

上图中,黑色方块表示逻辑1,白色方块表示逻辑0。通过这种转换,GF(2^w)域中的阵列就可以转换成GF(2)域中的二进制阵列。生成矩阵的阵列转换表示如下:


算法复杂度:
使用柯西矩阵要优于范德蒙德矩阵的方法,柯西矩阵的运算复杂度为O(n *(n – m)),解码复杂度为O(n^2)。
五、RS编码升级
RS编码后的数据,如果丢失了一块,恢复丢失的数据需要最少读取n块数据。在生产环境中,硬盘故障经常发生,恢复数据对网络IO和CPU都会有较大的消耗。
因此有些公司在EC编码的基础上做了一些改进,使用LRC或SEC替换RS编码。
1、LRC – Locally Repairable Code 本地副本存储
LRC编码与RS编码方式基本相同,同时增加了额外的数据块副本。
2、SEC – Sparse Erasure Code 稀疏纠删码
LRC编码中只对数据块做了2副本,当编码块丢失时,仍然需要读取n块数据来重新计算编码块。
SEC编码中对数据块和编码块都做增加了校验块。
SEC同样通过增加存储块,减少了恢复数据是的网络和CPU开销。
Forward Error Correction,FEC- 前向纠错编码技术通过在传输码列中加入冗余纠错码,在一定条件下,通过解码可以自动纠正传输误码。这种编码的译码设备较复杂。
除FEC之外,还有两种差错控制编码:Automatic repeat request(ARQ)检错重发(或自动请求重传),Hybrid Error Correction(HEC)混合纠错。
检错重发由发送端送出能够发现错误的码,接收端如果发现错误,通过反向信道把这一判决结果反馈给发送端。然后,发送端把接收端认为错误的信息再次重发。其特点是需要反馈信道,译码设备简单。
混合纠错是 ARQ和 FEC方式的混合。发送端同时送出具有检错和纠错能力的码,如果接收端收到信码在纠错能力以内,则自动进行纠正。如果超出纠错能力,则经过反馈信道请求发送端重发。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198999.html原文链接:https://javaforall.net
