--Party 2算法
Rechard Luoide
1、XOR校验XOR算法,最基本的bit运算法则为:性能
1⊕1 = 0, 0⊕0=0, 1⊕0=1;编码
所以,会衍生出以下的byte运算法则,对于byte数据M来讲:spa
M⊕M=0, M⊕0=M;设计
从而若是P为数据块X,Y,Z计算的XOR 值,也就说P = X⊕Y⊕Z时;当X数据块不可用时,能够经过P,Y,Z来获得它,也就是code
X = P⊕Y⊕Z = (X⊕Y⊕Z) ⊕Y⊕Z=X⊕(Y⊕Y) ⊕(Z⊕Z)blog
这就是基于XOR运算的RAID5可以容许一个存储设备故障的根本缘由。ip
2、P+Q校验2.1 多个块同时写内存
图-1 同时写多个块的P+Q校验
对于RAID6须要计算双重校验,第一重校验和RAID5同样,采用XOR校验,从上面的讲解可知,异或运算法则比较简单,因此能够设计专门的硬件来完成;在Intel的IOP33x处理器上就有专门的硬件模块,XOR应用加速器 (Application Accelerator with XOR),它专门处理异或运算,将CPU解放出来,从而提升整个系统的性能。如图-1,同时写多个数据块时,P = D0⊕D1⊕D2⊕D3,只需告诉XOR应用加速器D0, D1, D2, D3在内存的位置,它就能够自动的完成XOR计算获得P。
对于第二重校验,须要采用基于伽罗瓦域(Galois Field)计算操做的Reed- Solomon编码,也就是说在计算Q时,会引入一个系数Ki,如图-1所示:
Q = (K0⊙D0)⊕(K1⊙D1)⊕(K2⊙D2)⊕(K3⊙D3)
一样,因为RAID6采用了更为复杂的算法,所以能够设计专门的硬件来完成RAID6计算,Intel的IOP333上就有RAID6应用加速器 (Application Accelerator for RAID6);它和XOR应用加速器同样,只须要知道数据D0,D1,D2,D3在内存中的位置,它就能够自动完成RAID6的计算。
2.1 只写一个块
图-2 写一个块的P+Q校验
当系统只须要写一个数据块时,若是把全部的其余相关的数据块都读取出来计算校验,是比较耗费计算资源的。如图-2所示,此时先把须要写的块D0new对应的旧数据D0old读取,同时还有对应的Pold和Dold读取出来,从而能够获得以下公式:
Pnew = Pold ⊕ (D0new ⊕ D0old)
= (D0old⊕D1⊕D2⊕D3)⊕(D0new ⊕ D0old)
= D0new⊕D1⊕D2⊕D3
Qnew = Qold ⊕ Kx ⊙ (D0new⊕ D0old)
=(K0⊙D0)⊕(K1⊙D1)⊕(K2⊙D2)⊕(K3⊙D3)⊕Kx⊙(D0new⊕ D0old)
=(K0⊙D0)⊕(K1⊙D1)⊕(K2⊙D2)⊕(K3⊙D3)⊕K0⊙(D0new⊕ D0old)
=(K0⊙D0)⊕(K1⊙D1)⊕(K2⊙D2)⊕(K3⊙D3)
⊕(K0⊙D0new)⊕(K0⊙ D0old)
= (K1⊙D1)⊕(K2⊙D2)⊕(K3⊙D3)⊕(K0⊙D0new)
= (K0⊙D0new)⊕(K1⊙D1)⊕(K2⊙D2)⊕(K3⊙D3)
显然,经过上述只操做P和Q达到更新写一个块的数据,更为简洁高效。
3、里德--所罗门(Reed-Solomon)编码Reed-Solomon编码,是欧文.里德(Irving Reed)和格斯.所罗门(Gus Solomon)于1960年发布的一种纠错编码,它是最大距离可分码(MDS码,Maximum Distance Separable Code)的一种类型;表示为RS(n,k),其中n表示每一个码字(codeword)符号的总数,k表示每一个码字(codeword)中数据符号的总数
图-3 RS码字
其中2t = n – k,对于RAID6来讲2t=2,因此它能修复两个磁盘损坏;若是符号(symbol)的长度为s,那么码字的长度n=2s – 1。Reed-Solomon编码将会用到伽罗瓦域(GF)运算法则,对于采用byte长度为Symbol,其最大码字长度为n = 28–1=255,因此它此时支持255个磁盘 ,其中253个为数据盘,剩下2个为校验盘,下面对该运算进行详细讲解。
4、伽罗瓦域(Galois Field)运算它包括+,-,×, ÷四种运算,其中+,-操做和XOR运算同样,表示为⊕;而×表示为乘以基数a,表示为⊙;一样,÷定义为,若A=C÷B,则C=A⊙B。
十进制整数 (常规数学运算) |
伽罗瓦域 (用XOR表示+) |
||
数 (十进制) |
X=10 有效值={0…9} |
数 (二进制/十六进制) |
X=a 有效值={0,1} |
256 |
2X2+5X1+6X0 |
1/0x1 |
1a0 |
15 |
1 X1+5 X0 |
101/0x5 |
1a2+0a1+1a0 |
求多项式的根 X2-3X1+2=0,X2=3X1+2 X={1,2} |
若是a为多项式 P(x)= X3+X1+1=0的根,那么因为+为XOR操做,因此a3=a1+1 |
||
推导公式: E0=1,En+1= En +1 |
推导公式: E0=a0,En+1= aEn |
表-1 十进制运算和伽罗瓦域运算对比
所以,能够获得GF(8)在产生多项式X8+ X4+ X3+ X2+1状况下的表:
多项式X8+ X4+ X3+ X2+1 |
求a8+ a4+ a3+ a2+1=0的根为 -> a8=a4+ a3+ a2+1 |
HEX |
0 |
0 |
0h |
a0 |
1 |
1h |
a1 |
a |
2h |
a2 |
a2 |
4h |
a3 |
a3 |
8h |
a4 |
a4 |
10h |
a5 |
a5 |
20h |
a6 |
a6 |
40h |
a7 |
a7 |
80h |
a8 |
a4+ a3+ a2+1 |
1dh |
a9 |
a(a4+ a3+ a2+1)= a5+ a4+ a3+a |
3ah |
… |
… |
… |
表-2多项式X8+ X4+ X3+ X2+1的GF(8)表
从而获得该多项式GF(8)的运算表为:
Gfilog(x)= ars |
s |
|||||||||||
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
… |
f |
||
r |
0 |
1 |
2 |
4 |
8 |
10 |
20 |
40 |
80 |
1d |
… |
26 |
1 |
4c |
98 |
2d |
5a |
b4 |
75 |
ea |
c9 |
8f |
… |
c0 |
|
… |
表-3 GF(8)运算表
对应GF(8)的逆运算表GF-1(8)为
Gflog(x)= ars |
s |
|||||||||||
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
… |
f |
||
r |
0 |
-- |
0 |
1 |
19 |
2 |
32 |
1a |
c6 |
3 |
… |
4b |
1 |
4 |
64 |
e0 |
e |
34 |
8d |
ef |
81 |
1c |
… |
71 |
|
… |
表-3 GF-1(8)运算表
从而,在GF运算将经过查表完成,如
2⊙8 = gfilog [gflog[2] + gflog[8] ] = gfilog[1+3]
= gfilog[4] = 0x10
5、RAID6的数据恢复5.1 P、Q故障
5.2 P与数据盘故障
5.3 Q与数据盘故障
5.4 两个数据盘故障
4、计算校验与性能关系内容