存储 频道

RAID6连载(二):RAID6算法解析

    【IT168 专稿】上一节我们讲过了我们通过几种传统磁盘容错方式的比较,讲述了我们为什么需要RAID6,这一节我们将接续上节内容,详细讲述RAID6的数学算法。在本文开始之前需要声明的是:如果您并非对存储技术深感兴趣,或者平时不必要接触和配置RAID6,那么本节您可以直接略过。毕竟除了一些技术爱好者和白皮书狂人以外,不是所有人都能看下去这么枯燥晦涩公式。

    如果你需要实际配置和操作RAID6,或者你希望在听厂商洗脑的时候有一定的辨别能力,那么还请您耐住性子慢慢看下来。本文介绍的这些抽象的数学算法,可以让你更好的理解RAID6技术,尤其到我们连载系列第三节讲述真假RAID6的时候,会帮助你理解得更加直接和深刻。

    先做好接收烦恼的准备吧,下面让我们一起进入疯狂的公式世界。@_@

    首先我们先介绍一些后面必然会涉及到的基础概念,就像如果我们要解释E=MC8就必须先说清楚,什么是E,什么是M,什么是C等等。我们首先介绍XOR校验。

[疯狂公式之一XOR校验]
    XOR算法是RAID运算里最基础的概念,也是RAID5的容错原理,在RAID6里也将频繁涉及到。

    XOR最基本的bit运算法则为:1⊕1 = 0, 0⊕0=0, 1⊕0=1.因此,会衍生出如下的byte运算法则,对于byte数据M来说:M⊕M=0, M⊕0=M。

    如果P为数据块X,Y,Z计算的XOR 值,也就说P = X⊕Y⊕Z时;当X数据块故障时,可以通过P,Y,Z来得到它,也就是X = P⊕Y⊕Z = (X⊕Y⊕Z) ⊕Y⊕Z=X⊕(Y⊕Y) ⊕(Z⊕Z)。

    这就是基于XOR运算的RAID5能够允许一个存储设备故障的根本原因。

[疯狂公式之伽罗瓦域运算和里德-所罗门编码]

    伽罗瓦域(Galois Field)预算是在RAID6在进行双位校验需要用到的数学原理。它包括+,-,×, ÷四种运算,其中+,-操作和XOR运算一样,表示为⊕;而×表示为乘以基数,表示为⊙;同样,÷定义为,若A=C÷B,则C=A⊙B。

 表-1 十进制运算和伽罗瓦域运算对比

    因此可以得到GF(8)在产生多项式X8+ X4+ X3+ X2+1情况下运算表为:

表-2 GF(8)运算表

    对应GF(8)的逆运算表GF-1(8)为:

表-3 GF-1(8)运算表

    从而,在GF运算的乘除操作将通过查表完成,如
    0x2⊙0x8 = gfilog [gflog[2] + gflog[8]] = gfilog[1+3]
    = gfilog[4] = 0x10    (参考表-2,表-3中红色字体)
    0xd÷0x11 = gfilog[gflog[0xd] - gflog[0x11]]
    = gfilog[0x68 - 0x64]
    = gfilog[4]
    = 0x10

里德--所罗门编码
    Reed-Solomon编码,是欧文.里德(Irving Reed)和格斯.所罗门(Gus Solomon)于1960年发布的一种纠错编码。他使用伽罗瓦域(GF)运算法则,能提供在RAID6中Q校验计算的系数,并提供错误恢复功能。

    它是最大距离可分码(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。

    当采用byte长度(8bit)为Symbol时,其最大码字长度为n = 28–1=255,所以它此时支持255个磁盘 ,其中253个为数据盘,剩下2个为校验盘。

    看完这些数学概念,你是不是已经快疯掉,好在我们的概念到此为止就结束了,下面我们会介绍这些数学概念在RAID6写入和恢复过程中的作用。要打起精神哦,下面的路仍然很长。。。。

[RAID6写入-P+Q校验]

多个块同时写
   
RAID6写入需要计算双重校验,第一重校验和RAID5一样,采用XOR校验,从上面的讲解可知,异或运算法则比较简单,为此一些厂商设计了专门的硬件来完成;在Intel的IOP33x处理器上就有专门的硬件模块,XOR应用加速器 (Application Accelerator with XOR),它专门处理异或运算,将CPU解放出来,从而提高整个系统的性能。

图-1 同时写多个块的P+Q校验

    如图-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 写一个块的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达到更新写一个块数据的校验,更为简洁高效。

[RAID6的数据恢复]

P、Q故障
    当两个校验数据出现故障时,此时是最简单的情况,只需要将现有的数据按照P、Q计算方法,重新得到新数据,就可以恢复故障了。

P与数据盘故障
     如某数据,暂时记为D2与P发生故障,那么可以通过如下计算来恢复它:

     计算一个中间变量Q’:Q’= (K0⊙D0)⊕(K1⊙D1)⊕(K3⊙D3),
     D2可以通过如下公式得到(K2-1是K2在GF(8)表中的逆值):
    K2-1⊙(Q⊕Q’)=K2-1⊙{[(K0⊙D0)⊕(K1⊙D1)⊕(K2⊙D2)⊕(K3⊙D3)]⊕
    [(K0⊙D0)⊕(K1⊙D1)⊕(K3⊙D3)]}
    = K2-1⊙(K2⊙D2)
    = D2

     由于D2成功恢复,所以P的恢复,只需要按照其计算方法就可以得到了。

Q与数据盘故障
   
某数据,暂记为D1与Q发生故障,那么可以通过如下计算来恢复它:
    D1 = P⊕D0⊕D2⊕D3,  (因为P=D0⊕D1⊕D2⊕D3)
    因为D1成功恢复,所以Q的恢复,只需要按照其计算方法就可以得到了。

两个数据盘故障
    如果D1与D2发生故障,那么可以通过如下计算来恢复它:

    由D1= P⊕D0⊕D2⊕D3
    Q = (K0⊙D0)⊕(K1⊙D1)⊕(K2⊙D2)⊕(K3⊙D3)
    = (K0⊙D0)⊕(K1⊙[P⊕D0⊕D2⊕D3])⊕(K2⊙D2)⊕(K3⊙D3)
    = (K1⊙P)⊕[(K0⊕K1)⊙D0]⊕[(K1⊕K2)⊙D2]⊕[(K1⊕K3)⊙D3],

    因此,可以得到D2相关,并且不包含D1的表达式:
    (K1⊕K2)⊙D2= Q⊕(K1⊙P)⊕[(K0⊕K1)⊙D0] ⊕[(K1⊕K3)⊙D3]
    D2={Q⊕(K1⊙P)⊕[(K0⊕K1)⊙D0] ⊕[(K1⊕K3)⊙D3]}/(K1⊕K2)

    因为D2成功恢复,所以对于D1的恢复,就是相当简单计算了。

[计算校验与性能关系]
     通过上诉对RAID双重校验计算的原理,可以看出需要耗费大量的CPU周期来处理;为此,某些厂商设计了专门的RAID加速器(Accelerator)硬件,在Intel的Xscale系列芯片,如:IOP331,IOP332,IOP333,IOP340,IOP341,IOP342,IOP348中,基本都加入该模块来提高性能。当然也有一些软RAID6的解决方法,如Linux下的MD就提供,在后续的文章中,将会进行仔细介绍。

0
相关文章