【什么是raid】
【单一冗余模型】

根据上图,可以很容易的分析出,不管这3页中的哪一页丢失,都可以通过另两页计算另一页的数据来。很显然,即使是超过3页的情况,按上述方式设计记录模式,也可以支持任意一页记录的丢失。
可以很清晰得看到,第三行的校验和,不再是3个数字,而且不论多少个数据成员,用异或得到的校验和容量不会累加。
d1 + d2 + d3 + ... +dn-1 = p1
dx = p1 - d1 - d2 - d3 - ... -dn-1(d序列中排除dx)
也就是:dx = p1 + d1 + d2 + d3 +... +dn-1(d序列中排除dx)
【多次冗余模型】
常用0x11d做为raid6的本原多项式,意思是2的n次方如果大于0x11d,就对于做xor的取余运算,确保结果小于0x256,这样就可以算出2^0到2^255之间的所有数值。
【raid6】
之所以p和q螺旋式循环分布,是为了使所有磁盘负载均衡,如果不好理解,可以把p和q单独放在一列中,算法的意义是相同的。
再重复一下,下面提及的+、-、*、/运算都是指基于gf(2^8)上的加、减、乘、除
p值等于同一行(条带)上的所有单元相加的和。或者可以理解为1与每个单元相乘后的累加和,如第一个条带的p:
在gf(2^8)上,每个多项式对应一个0~255的值,即d0对应多项式x的0次幂,d1对应多项式x的2次幂等,按多项式展开,x为2进制,故d0 = 1,d1 =2,d2=4 ,d3=8,等等,如下表所示:
返回raid结构图中,q值等于每个数值单元格乘以他们的相应的dn再累加的结果,其中dn可约定,只需保证同一条带的运算中不重复出现dn即可,如第一行的q可以为:
q = d1 x1 + d2x2 +d3*x3
这样,对于每一行(条带),就可以保证任意2个单元丢失,都可以计算出来(为了明了,以下计算直接将减法改为加法):
以第一行为例:
a) 如果p,q均丢失,数据区不影响,x1,x2,x3均可正常读写
b)如果xn丢失,根据p或q都可计算出来(实际中,因p 的计算更快速,通常会使用p校验计算出丢失的 xn)
c)如果p,xn丢失,p值不做处理,假设丢失的是x2,根据q值的定义
p = x1+x2+x3
=> x1 = p + x2 + x3
=> q = d1 (p + x2 + x3) +d2x2 +d3*x3
=> q = d1p + d1x2 + d1 x3 + d2x2 + d3*x3
=> q = d1p + d1x2 + d2x2 + d1x3 + d3*x3
=> q + d1p + d1x2 + d2x2 = (d1+d3) x3
=> x3 = ( q + d1p + d1x2 + d2*x2) / (d1+d3)