一种适用于磁盘阵列及分布式存储系统的二容错编码方法

文档序号:9597120阅读:607来源:国知局
一种适用于磁盘阵列及分布式存储系统的二容错编码方法
【技术领域】
[0001] 本发明涉及一种适用于磁盘阵列及分布式存储系统的二容错编码方法,属于编码 论中的纠删码技术领域。
【背景技术】
[0002] 信息社会中数据量的爆炸式增长对大容量可靠存储提出了更高的要求。为此,存 储系统一方面不断提高单个磁盘的容量,一方面通过磁盘阵列或者分布式存储的形式将多 个磁盘整合起来提供大容量的可靠存储服务。由于应用了大量的廉价磁盘,磁盘失效的情 况经常发生。为保障数据可靠性,系统需要存储一定的冗余数据,以便能够在某些磁盘失效 的情况下仍然可以恢复出所存储的信息。每当有磁盘失效时,系统需要在一个替代磁盘上 重构失效磁盘上存储的数据。这一过程称为数据修复过程。
[0003] 二元有限域上的阵列码,这类编码将存储的数据抽象为一个m行η列的阵列,阵列 中的每个元素为一个比特,即二元有限域上的一个元素。实际应用中阵列的元素可以为等 长的比特序列(通常称为一个数据块)。每个存储节点存储阵列中的一列,因而η即存储节 点的个数。对于能够容忍两个磁盘失效的二容错阵列码,阵列中的前k = η-2列存储未编 码的原始数据,第k+Ι列和k+2列存储冗余数据。存储原始数据的列(节点)通常称为系 统盘,冗余数据的列(节点)通常称为校验盘,校验盘中的每个元素都由系统盘中若干个原 始数据元素经过异或运算所得,即奇偶校验和。RAID-6系统是这类编码的一个典型应用场 景。通常RAID-6编码中第k+Ι列中的每个元素由系统盘中(即前k列中)位于同一行的 元素经过异或运算所得,因而又称为行校验。RAID-6系统规范并未限定第k+2列冗余数据 的生成方法。
[0004] 当有单个存储节点失效时,传统阵列码的修复方法是:如果失效的节点为校验盘, 则根据编码的定义再次通过系统盘上的数据生成冗余数据;如果失效的节点为系统盘,则 利用剩余的k-Ι个系统盘与一个校验盘恢复失效节点上存储的数据。这两种情况都需要从 k个盘中总共读取m*k个元素来进行数据修复,消耗了大量的磁盘读写(I/O)资源。近年来 有学者针对已有的RAID-6编码设计了特别的修复算法,允许从剩余的k+Ι个可用磁盘中读 取数据,充分利用两个校验盘中的校验数据,使得修复单个磁盘时平均所需读取的数据量 降低了约25%。

【发明内容】

[0005] 本发明的目的是,为了在单个磁盘失效时,能够及时高效地恢复损坏磁盘上所存 储的数据,本发明提出一种适用于磁盘阵列及分布式存储系统的二容错编码方法。
[0006] 本发明的技术方案适用于磁盘阵列及分布式存储系统的二容错编码方法包括编 码方案和单个磁盘错误修复方案。所述方法除最后一个冗余节点失效的情况外,修复单个 数据节点过程中每一个正常工作的数据节点仅需读取所存储数据块的一半,并且在传输前 无需对读取的内容进行编码运算;所述方法将一个磁盘阵列划分为多个条带,每个条带由 各个磁盘中一块相同大小的存储空间组成,每个磁盘在不同条带中的校验盘与系统盘进行 轮转循环。
[0007] 所述编码方案包括冗余节点所存储的校验数据生成和构造编码矩阵。
[0008] 所述冗余节点所存储的校验数据生成方法为,设系统中共有η个磁盘,其中有k = n-2个系统盘,令m = 2k,将待存储的原始数据划分为等长的mk个数据块,每个系统盘中存 储m个数据块的原始数据。为了描述方便,我们用aii ]表示第i个盘中存储的第j个数据 士夬。将每个盘中存储的数据看作长度为m的列向量并记为&1= (a^ay,…,&1,"广,这里上 标T表示矩阵转置。第一个校验盘采用行校验编码,即ak+1=ai+a2+-+a k。这里加法为异 或运算。第二个校验盘的数据可以表示为ak+2= A化+六也+…+六!^,其中Ad A2,…,A^m 行m列的矩阵,其中的元素都取自二元有限域。通过给出矩阵A2,…,\的构造方法来给 出第二个校验盘的编码方案。
[0009] 对于任意给定的参数k,采用以下算法构造编码矩阵:
[0010] 第1步:令
[0011] 第2步:若i = k,则输出矩阵Ai,A2,…,Ak;否则进行下一步;
[0012] 第3步:令
::本步骤中〇,1 分别为21行2 1列的0矩阵和单位矩阵;
[0013] 第4步:令i - i+Ι,转到第2步。
[0014] 所述单个磁盘失效的修复方案为:
[0015] 当第k+2个盘,即第二个校验盘失效时,读取前k个盘存储的数据并按照编码方案 重新生成第二个校验盘存储的数据;
[0016] 当第i (i〈k+2)个盘失效时,按如下步骤进行修复:
[0017] 第1步:构造下标集合R1:若i = k+Ι,令
4
[0018] 第2步:读取未失效盘中由下标集民指定的数据块,例如若1^= {1,2,5,6},则对 于每一个未失效盘aj,读取其中第1、2、5、6个数据块au, a^,ay, a^;将第j个盘中由下 标集民指定的若干数据块看作一个列向量,并记为a , I R1;利用行校验修复失效盘中由下标 集 Ri指定的数据块,Bp a i I Ri = a ! I Ri+a21 Ri+··· +a; ! I Ri+ai+11 Ri+··· +ak+11 Ri;
[0019] 第3步:构造矩阵
:,其中0, I分别为2k节2 k 1列的0矩阵和单位矩 阵;对于下标i〈k,构造矩阵1= A i+Bk+1;
[0020] 第4步:将失效盘中下标不在民中的数据块K.j/S/U看作一个列向量并记为x ; 令h |民表示矩阵B j中行下标和列下标都属于R i的元素构成的子矩阵,令D表示矩阵B冲 行下标属于民且列下标不属于R i的元素构成的子矩阵,根据本编码的构造方法,失效盘中 下标不在民中的全部数据块X可以通过求解以下方程得出:
[0021] Dx+B ! iRp! | …+Bk+1 |R1〇
[0022] 本发明方法的实现对硬件环境的要求为可以并行读写的多磁盘存储系统,如磁盘 阵列或分布式存储系统。本发明的实现需要与文件系统及磁盘驱动紧密结合:向下需要磁 盘驱动提供读写接口,向上为文件系统提供可靠存储服务。本发明能够以硬RAID卡或软 RAID卡的形式实现。本发明对语言工具没有特别要求,C语言、C++语言、Java语言等都能 实现。对操作系统平台也没有特别要求,Microsoft Windows系统、各种Linux系统、Mac系 统等都可以作为操作系统运行平台。
[0023] 本发明在实现时,所涉及的一个数据块通常可设定为一次磁盘读写的最小单元, 如一个4KB大小的page。为了平衡多个磁盘间的负载,通常需要与传统的RAID轮转技术相 结合。将一个磁盘阵列划分为多个条带(stripe),每个条带由各个磁盘中一块相同大小的 存储空间组成,每个磁盘在不同条带中的身份(校验盘/系统盘)进行轮转循环。
[0024] 在实现中,不需要每次编码操作或修复操作都按照说明中给出的算法进行矩阵的 乘法、求逆等运算操作。可以通过预先计算得出每个校验数据块所涉及的原始数据块,以及 每个磁盘失效时的具体修复方案,然后以硬编码的形式写入代码。
[0025] 本发明与现有技术比较的有益效果是,当单个系统盘或行校验盘失效时,本发明 在未失效盘中读取的数据量总计为M(k+l)/2,而传统的编码及修复方案所需读取的数据量 为Mk,这里Μ为单个磁盘的容量。当k较大时,本发明对修复单个磁盘时所需读取的数据量 降低约50%,从而可以较快的重构出失效磁盘上所存储的数据,并且在热修复时,对系统中 其他应用的不利影响降到最低。
【附图说明】
[0026] 图1是
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1