一种基于Pyramid码的局部性修复编码方法与流程

文档序号:12463823阅读:266来源:国知局
一种基于Pyramid码的局部性修复编码方法与流程

本发明属于计算机领域,涉及一种基于Pyramid码的局部性修复编码方法。



背景技术:

当前分布式存储系统通常采用纠删码提高存储可靠性,其中最大距离可分(Maximum Distance Separable,MDS)码,在确保系统可靠性的同时,能提高系统的存储效率。然而,纠删码在修复故障节点时需要下载整个文件大小的数据量,修复带宽开销过大。为了降低传统纠删码的修复带宽开销,Dimakis等人提出了再生码,显著降低了故障节点的修复带宽开销。通过对修复带宽和存储开销进行分析,Dimakis等人于2010年又提出了最小存储再生(Minimum Storage Regeneration,MSR)码和最小带宽再生(Minimum Bandwidth Regeneration,MBR)码。简单再生码(Simple Regenerating Codes)以较高的存储开销为代价,在修复单节点故障时具有较好的修复局部性,但没有进一步考虑多故障节点的修复。MSR码和MBR码在修复故障节点时,只关注了修复带宽开销和存储开销,没有考虑磁盘存储开销,不适用于云存储系统。

云存储系统中两个或多个节点同时发生故障的概率很大,已有的SRC和LRC在修复一个节点故障时具有很好的修复局部性,但是在修复两个或多个故障节点时需要连接多个存活节点,磁盘I/O开销较高。



技术实现要素:

针对上述现有技术中存在的缺陷或不足,本发明的目的在于,提供一种基于Pyramid码的局部性修复编码方法,该方法可以降低故障节点修复过程中的磁盘I/O开销,且具有较优的节点存储开销。

为了实现上述目的,本发明采用如下技术方案:

一种基于Pyramid码的局部性修复编码方法,具体包括以下步骤:

分布式存储系统中存储节点数目众多,设其中有n个存储节点存储数据块,将每8个存储节点作为一个最小编码结构C,每个最小编码结构C视为一个局部修复组,则C=D·G,D=[d11,d12,...,dij,...,dtj],dij为第i个局部修复组存储的j个数据块,i表示第i个局部修复组,i≤t,j表示局部修复组内存储的数据块数目,1≤j≤4且为整数,G=[I|P]表示生成C所需的生成矩阵,其中I为单位矩阵,P为子矩阵,

其中g12、g13、g21、g24、g31、g34、g42和g43为Pyramid码的编码系数,且各列之间g线性独立,保证子矩阵P满秩,所述校验块为数据块经过生成矩阵G线性编码生成;

根据Pyramid码编码方式和鲁棒性得到Pyramid码的最小编码结构C,将所述Pyramid码的最小编码结构C作为基本编码结构,把分布式存储系统的存储节点根据Pyramid码的最小编码结构所需存储节点数进行分组。若存储节点个数n刚好能被8整除,则直接在每个局部修复组内采用Pyramid码进行编码;若存储节点个数n不能被8整除,则将最后一组存储节点和不能整除所得余数放在一组并采用MDS码进行编码。

具体地,若t=n/8为整数,所需存储的文件分为4t个数据块并存储在t个局部修复组内,每个局部修复组内包含4个数据块和4个校验块;

若n/8为非整数,则整数部分为t,余数部分记为δ,δ个存储节点内包含ε个数据块,ε≤4且为整数,则所需存储的文件分为4t+ε个数据块,其中前t-1个局部修复组中,每个局部修复组包含8个节点并分别存储4个数据块和4个校验块,第t个局部修复组包含8+δ个节点并存储4+ε个数据块,对第t个局部修复组采用MDS编码方式进行编码。

本发明还提供一种分布式存储系统中存储节点故障修复方法,具体包括以下步骤:

按上述方法对分布式存储系统中n个存储节点进行编码后得到t个局部修复组,设第i个局部修复组内有存储节点出现故障,未出现故障的存储节点为存活存储节点;其中第i个局部修复组内包含四个数据块di1、di2、di3和di4以及四个校验块ci1、ci2、ci3和ci4,其中di1、di2、di3和di4是按照两行两列排列的数据块,ci1为di1和di2经过生成矩阵G线性编码生成,ci2为di3和di4经过生成矩阵G线性编码生成,ci3为di1和di3经过生成矩阵G线性编码生成,ci4为di2和di4经过生成矩阵G线性编码生成;

(1)若第i个局部修复组内出现一个存储节点故障:

若出现故障的存储节点存储的是四个数据块中的任意一个,则通过出现故障的存储节点同行或者同列的存活存储节点进行修复;

若出现故障的存储节点存储的是四个校验块中的任意一个,则通过生成故障的存储节点存储的校验块时对应的存活存储节点进行修复;

(2)若第i个局部修复组内出现两个存储节点故障:

若出现故障的存储节点存储的是两个数据块或两个校验块:若所述两个数据块或两个校验块同行或同列,则分别通过所述两个数据块或两个校验块所在列或行的存活节点进行修复;若所述两个数据块或两个校验块非同行或同列,则通过所述两个数据块中的一个数据块所在列和另一数据块所在行的三个存活节点进行修复;

若出现故障的存储节点存储的是一个数据块和一个校验块,则通过所述一个数据块所在列和所述一个校验块所在行的三个存活节点进行修复,或者通过所述一个数据块所在行和所述一个校验块所在列的三个存活节点进行修复。

所述若局部修复组内出现两个存储节点故障时,也可同时进行两个存储节点故障修复。

本发明具有以下技术效果:

1、考虑到存储系统中存储的数据量大,采用Pyramid码进行编码,将原文件分为若干数据块存储在n个存储节点,保证了存储节点的存储开销,Pyramid码在故障存储节点修复中保证了有限的存活节点参与,较小的修复局部性使故障存储节点修复过程中的修复带宽开销低。

2、本发明构造的基于Pyramid码的局部性修复编码结构中,局部修复组内存储节点的校验块全部由局部修复组内存储的数据块进行线性编码生成,基于此编码结构,当局部修复组中存在单节点和两节点故障时,都只需要通过连接局部修复组内有限的存活节点快速实现局部修复组内故障节点的数据重构,恢复出故障存储节点数据。

附图说明

图1是本发明实施例1对应的基于Pyramid码的局部性修复编码结构图;(a):n个存储节点能被8整除;(b):n个存储节点不能被8整除。

图2是本发明实施例2局部修复组内单节点故障时存储节点修复示意图;

图3是本发明实施例2局部修复组内两节点故障时存储节点修复示意图;(a):两个数据节点故障修复;(b):一个数据节点和一个校验节点故障修复;(c):两个校验节点故障修复;(d):非同行同列存储节点故障修复。

图4是本发明实施例3有8个存储节点时的局部性修复编码结构图。

图5是本发明实施例3中局部修复组内单节点故障修复示意图;

图6是本发明实施例3中局部修复组内两节点故障修复示意图;其中(a):两个数据节点故障修复;(b):一个数据节点和一个校验节点故障修复;(c):两个校验节点故障修复;(d):非同行同列节点故障修复。

下面结合附图和实施例对本发明的方案做进一步详细地解释和说明。

具体实施方式

本发明所指的修复,实际上是解码的过程,因为编码过程为线性编码,C=D·G,G为满秩矩阵,则修复过程即是解码过程,即D=C·G-1。例如,ci1由di1和di2经过生成矩阵G线性编码生成,若di1发生故障,则连接数据节点di2和校验节点ci1,根据生成矩阵G进行解码即可修复di1

考虑到故障存储节点的分布情况,每个局部修复组内三个及三个以上存储节点故障的概率可以忽略,本发明多节点故障指整个存储结构内的故障存储节点的数目。

实施例1:

如图1-3所示,遵从上述技术方案,本实施例提供一种基于Pyramid码的局部性修复编码方法,Pyramid码的最小编码结构指的是能够实现Pyramid码编码方式快速修复并且保证最少节点参与修复过程。

主要包括以下步骤:分布式存储系统中存储节点数目众多,设分布式存储系统中有n个存储节点,每个存储节点存储一个数据块,将每8个存储节点作为一个最小编码结构C,其中C=D·G,D=[d11,d12,...,dij,...,dtj],dij为第i个局部修复组存储的j个数据块,i表示第i个局部修复组,i≤t,j表示局部修复组内存储的数据块数目,1≤j≤4且为整数;一共有t个局部修复组,G=[I|P]表示生成C所需要的生成矩阵,其中I为单位矩阵,P为子矩阵,

g12、g13、g21、g24、g31、g34、g42和g43为Pyramid码的编码系数,各列之间编码系数线性独立,保证子矩阵P满秩,以最小编码结构C作为一个局部修复组,一共有n/8个局部修复组,n/8个局部修复组构成一个存储结构;也就是说,每个局部修复组内有8个存储节点,每个存储节点存储一个数据块,相当于每个局部修复组内有8个数据块,其中4个为数据块,另外4个为校验块。

将上述得到的Pyramid码的最小编码结构作为基本编码结构,把分布式存储系统的存储节点根据Pyramid码的最小编码结构所需节点数进行分组。

存在以下两种情况:

若n/8为整数,记为t,则所需存储的文件系统分为4t个数据块并存储在t个局部修复组内,每个局部修复组内包含4个数据块和4个校验块,校验块为数据块经过生成矩阵G线性编码生成,

若n/8为非整数,整数部分为t,余数部分记为δ,δ个节点内包含ε(ε为自然数,且ε≤4)个数据块,则所需存储文件分为4t+ε个数据块,其中前t-1组每组存储4个数据块和4个校验块,第t组包含8+δ个节点并存储ε+4个数据块并对第t组采用MDS编码方式进行编码。

MDS编码方式是目前比较成熟的一种编码方式,以下仅做简单说明:MDS编码即将大小为M的原文件平均分为k块,每块大小为M/k,然后将这k个文件块编码成w个编码块,并将w个编码块分别存储在w个节点中,每个节点存储一个编码块。然而,其特殊之处在于,用户仅需连接w个节点中的任意k个节点,就可以还原出需要读取的原始文件,即此时系统中的参数满足m=k。同时,将MDS码所满足的性质称为MDS性质,即任意k个编码块均可以还原出原始文件。

实施例2:

本实施例提供一种分布式存储系统中存储节点故障修复方法,包括以下步骤:

步骤一,采用实施例1所述局部性修复编码方法对分布式存储系统中所有n个存储节点进行编码;

步骤二,存储节点故障修复;

设t个局部修复组中的第i个局部修复组内有存储节点出现故障,未出现故障的存储节点为存活存储节点;其中第i个局部修复组内包含四个数据块di1、di2、di3和di4以及四个校验块ci1、ci2、ci3和ci4,其中di1、di2、di3和di4是按照两行两列排列的数据块,ci1为di1和di2经过生成矩阵G线性编码生成,ci2为di3和di4经过生成矩阵G线性编码生成,ci3为di1和di3经过生成矩阵G线性编码生成,ci4为di2和di4经过生成矩阵G线性编码生成;

(1)若局部修复组内出现一个存储节点故障:

若出现故障的存储节点存储的是四个数据块中的任意一个,则通过出现故障的存储节点同行或者同列的存活存储节点进行修复;

若出现故障的存储节点存储的是四个校验块中的任意一个,则通过生成故障的存储节点存储的校验块时对应的存活存储节点进行修复;

(2)若局部修复组内出现两个存储节点故障:

若出现故障的存储节点存储的是两个数据块或两个校验块:若所述两个数据块或两个校验块同行或同列,则分别通过所述两个数据块或两个校验块所在列或行的存活节点进行修复;若所述两个数据块或两个校验块非同行或同列,则通过所述两个数据块中的一个数据块所在列和另一数据块所在行的三个存活节点进行修复;

若出现故障的存储节点存储的是一个数据块和一个校验块,则通过所述一个数据块所在列和所述一个校验块所在行的三个存活节点进行修复,或者通过所述一个数据块所在行和所述一个校验块所在列的三个存活节点进行修复。

步骤(2)所述若局部修复组内出现两个存储节点故障时,则根据Pyramid码在存储节点修复过程的独立性,也可采用步骤(1)所述同时进行两个存储节点故障修复。

实施例3:

如图4,本实施例假定分布式存储系统中有8个存储节点,在最小编码结构为8个存储节点的存储结构中构造Pyramid码,用D=[d1,d2,d3,d4]表示最小编码结构内存储节点存储的数据块,其中d1,d2,d3,d4分别表示单个数据块信息;G=[I|P]表示生成编码数据块C所需要的生成矩阵,其中I为单位矩阵,P为4×4子矩阵。则C记为:C=[d1,d2,d3,d4,c1,c2,c3,c4],

这里生成矩阵

其中变量g12、g13、g21、g24、g31、g34、g42和g43表示Pyramid码的编码系数。由生成矩阵可知校验块的表达式,c1=g12d1+g21d2,c2=g34d3+g43d4,c3=g13d1+g31d3,c4=g24d2+g42d4

如图5(a)所示,若是存储数据块d1的存储节点发生故障,可以通过该故障节点所在行中的存活存储节点中的数据块d2和校验块c1进行修复,也可以选择该故障节点所在列中的存活存储节点中的数据块d3和校验块c3来修复。另外,存储数据块d2、d3和d4的节点故障时也可以通过类似的方法实现快速修复。如图5(b)所示,若是存储校验块c1的存储节点发生故障时,连接对应行存储数据块d1和d2的存储节点即可实现快速修复。

两个存储数据d1和d2的存储节点同时故障,则根据Pyramid码在节点修复过程的独立性,只需分别连接故障节点所在列(或者行)对应的存活节点d3和c3、d4和c4同时进行修复,如图6(a)所示;一个存储数据块的存储节点和一个存储校验块的存储节点同时故障,则只需连接三个存储节点即可修复,如图6(b)所示,d1和c1同时发生故障,首先需要连接d3和c3来修复d1,然后利用d1和d2对c1进行修复;两个同行(或者同列)校验块的存储节点同时故障,则需要连接对应行(或者列)的四个数据块进行修复,如图6(c)所示,c3和c4同时故障,需要连接d1、d2、d3和d4即可实现故障节点修复;若不是同行或者同列的存储节点同时发生故障,则只需要连接三个数据块的存储节点即可,如图6(d)所示,图(1)是对角d1和d4发生故障,则只需要连接d3、c2和c3即可修复,图(2)中c1和d4同时失效,只需连接d1、d2和c4即可修复。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1