纠删码数据的快速编解码方法和系统
技术领域
本发明涉及数据编解码技术领域,具体涉及一种纠删码数据的快速编解码方法和系统。
背景技术
计算机数据在传输或者存储时,往往因为噪音或者设备损坏等问题,会造成部分信息丢失。为保持数据的可靠性和有效性,通过在信息编码时加入冗余校验码,可以达到容错和纠错的目的,此类技术通常被称为纠删码(Erasure Codes,简称EC,亦被称为擦除码、纠错码等)技术。在云存储中使用的EC一般有两种,即Reed-Solomon纠删码(简称RS纠删码)和低密度奇偶校验码(Low Density Parity Check Code,简称LDPC纠删码)。其中RS纠删码具有MDS(Maximum Distance Separable,最大距离分割)性质,因此比LDPC码具有更高的编码率。
RS纠删码方法是将原始文件编码后,分为大小相同的n个原始数据分片和m个校验分片,分别进行存储或通讯。对于文件存储或者通讯接收方,只要获得其中任意n个分片,即可通过解码方式恢复原文件或者数据,因此可以抗m个分片损坏或者丢失,大大提高了系统的可靠性。对于计算机文件存储,因m远小于n,其存储空间利用率为n/(m+n),远远高于副本存储方式。因此,RS纠删码通过消耗计算资源换取存储能力,显著降低了存储成本和运维成本。
通常,将n个源数据编码为m+n个数据的RS纠删码一般记作(m+n,n)纠删码。其实现技术关键是寻找一个生成矩阵G,该矩阵中任意n列均线性无关。目前的RS编码技术中,生成矩阵有两种:范德蒙德矩阵和柯西矩阵,使用它们的编码分别被称为范德蒙码(VandermondCode)和柯西码(Cauchy Code)。
以下是范德蒙德矩阵和柯西矩阵的定义(不包括单位阵部分),其中,G1为范德蒙德矩阵,各个ai互不相同且不为0;G2为柯西矩阵,xi+yj≠0,且当i≠j时,xi≠xj和yi≠yj:
利用上述生成矩阵,编码原理是:n个原始数据D[D1,D2,…,Dn]乘以生成矩阵G1或G2,产生n个原始数据D[D1,D2,…,Dn]和m个校验数据P[P1,P2,…,Pm]。解码原理是:在m+n个原始数据和校验数据中任意获得n个数据,组成待解码数据D',例如[D1,…,Di,P1,…,Pj];随后在编码时使用的生成矩阵(含n阶单位阵I)中去掉未出现的m个数据对应的单位阵中那一列,组成一个新的生成矩阵G,然后计算G的逆矩阵G',最后由D'*G'=D得到原始数据。为了使矩阵运算的结果保持在整数域,运算改为限定在伽罗瓦域(Galois Field),在编解码过程中,一般以字节或者双字节为单位进行,则对应的伽罗瓦域为GF(28)或者GF(216)进行。伽罗瓦域中的乘法一般采用双表法(即对数-反对数表法),一个乘法操作需要5个基本操作;伽罗瓦域中的加法则是异或(XOR,运算符为)操作。对于编码而言,计算一个校验码Pi,需要循环做n次伽罗瓦域乘法和n次伽罗瓦域加法,共计6n个操作;计算m个校验码,需要至少6mn个操作。对解码而言,还需要计算逆矩阵G',需要O(n3)的计算量。基于上述分析,在现有技术中,范德蒙德码编码复杂度为O(mn),解码复杂度为O(n3);柯西码编码复杂度为O(mn),解码复杂度为O(n2)。如采用软件方式实现RS编解码,运算速度很慢,现有技术下一般只有50~100MB/秒,极大地限制了RS纠删码的使用。为此,很多应用和云存储系统,不得不使有专用FPGA(现场可编程门阵列)硬件来加速RS运算,但这又提高了系统成本,同样不利于其推广。
发明内容
针对现有技术中存在的上述缺陷,本发明所要解决的技术问题是如何提高纠删码数据的编解码效率。
为解决上述技术问题,一方面,本发明提供一种纠删码数据的快速编码方法,包括步骤:
S11,根据分片数n和冗余数m初始化编码器,通过对范德蒙德矩阵或柯西矩阵的变换,得到第一行和第一列元素均为1的生成矩阵;
S12,初始化编码乘法缓存表;
S13,将待编码数据分为n个原数据,根据所述n个原数据和所述生成矩阵,利用编码乘法缓存表计算出m个校验码;
S14,将所述n个原数据和得到的m个校验码分别存储和/或传输。
优选地,所述编码乘法缓存表中数据为所述生成矩阵中每个元素对0x00、0x01至0x0f以及对0x00、0x10至0xf0的伽罗瓦域乘法结果。
优选地,步骤S13中,根据所述n个原数据和所述生成矩阵计算第j个校验码为:
其中,Di为第i个原数据,Gij为所述生成矩阵第i行第j列元素。
优选地,对于第一个校验码P1,直接计算的异或和;
对于其余m-1个校验码,第一个原数据D1直接用于计算异或和,将参与计算的其他每个原数据Di拆分为高字节部分和低字节部分,分别乘以对应矩阵元素Gij以计算伽罗瓦域乘法,随后再计算对应的异或和以得到校验码;其中,伽罗瓦域乘法结果通过查找所述编码乘法缓存表得到。
优选地,使用SIMD指令计算所述伽罗瓦域乘法和异或和。
优选地,对于云存储系统中较大的文件,先将文件划分为分块,随后对各分块分别进行步骤S11-S14。
另一方面,本发明还同时提供一种纠删码数据的快速解码方法,包括步骤:
S21,根据分片数n和冗余数m初始化编码器,通过对范德蒙德矩阵或柯西矩阵的变换,得到第一行和第一列元素均为1的生成矩阵;
S22,初始化编码乘法缓存表;
S23,获取m+n个纠删码数据中的至少n个作为待解码数据,其中所述待解码数据中有n-k个原数据及k个校验码,根据数据获取情况生成k阶解码矩阵;
S24,根据所述解码矩阵的逆矩阵初始化解码乘法缓存表;
S25,根据所述待解码数据中的k个校验码、n-k个原数据以及所述生成矩阵,利用编码乘法缓存表计算出k个恢复码;
S26,根据所述k个恢复码和所述解码矩阵的逆矩阵,利用解码乘法缓存表计算恢复丢失的k个原数据,将恢复的原数据和所述待解码数据中的n-k个原数据组成解码数据。
优选地,所述编码乘法缓存表中数据为所述生成矩阵中每个元素对0x00、0x01至0x0f以及对0x00、0x10至0xf0的伽罗瓦域乘法结果;所述解码乘法缓存表中数据为所述逆矩阵中每个元素对0x00、0x01至0x0f以及对0x00、0x10至0xf0的伽罗瓦域乘法结果。
优选地,步骤S23中,所述根据数据获取情况生成k阶解码矩阵包括:
在所述生成矩阵中,确定丢失的k个原数据所对应的行和所获取的k个校验码所对应的列,取其交叉点的元素构成所述解码矩阵。
优选地,步骤S25中,根据所述待解码数据中的k个校验码、n-k个原数据以及所述生成矩阵计算第j个恢复码为:
其中,Pj为所述纠删码数据中的第j个校验码,且Pj在已获取的k个校验码中;Di为第i个原数据,且若Di不在已获取的n-k个原数据中,则Di=0;Gij为所述生成矩阵第i行第j列元素。
优选地,对于第一个恢复码P'1,直接计算的异或和;
对于其余的恢复码,第一个原数据D1直接用于计算异或和,将参与计算的其他每个原数据Di拆分为高字节部分和低字节部分,分别乘以对应矩阵元素Gij以计算伽罗瓦域乘法,随后再计算对应的异或和以得到校验码;其中,伽罗瓦域乘法结果通过查找所述编码乘法缓存表得到。
优选地,步骤S26中,根据所述k个恢复码和所述解码矩阵的逆矩阵计算恢复丢失的k个原数据包括:
将每个所述恢复码分别乘以所述逆矩阵以得到对应丢失的原数据包;其中,将参与计算的每个恢复码拆分为高字节部分和低字节部分分别乘以对应矩阵元素以计算伽罗瓦域乘法,随后再计算对应的异或和以得到对应丢失的原数据包;其中,伽罗瓦域乘法结果通过查找所述解码乘法缓存表得到。
优选地,使用SIMD指令计算所述伽罗瓦域乘法和异或和。
优选地,对于云存储系统中较大的文件,先对各文件分块分别进行步骤S21-S26以还原分块,再将各分块组装成原文件数据。
本发明的再一方面,还同时提供一种纠删码数据的快速编码系统,包括:
生成矩阵第一初始化模块,用于根据分片数n和冗余数m初始化编码器,通过对范德蒙德矩阵或柯西矩阵的变换,得到第一行和第一列元素均为1的生成矩阵;
编码缓存表第一初始化模块,用于初始化编码乘法缓存表;
校验码模块,用于将待编码数据分为n个原数据,根据所述n个原数据和所述生成矩阵,利用编码乘法缓存表计算出m个校验码;
分布式模块,用于将所述n个原数据和得到的m个校验码分别存储和/或传输。
本发明的更一方面,还同时提供一种纠删码数据的快速解码系统,包括:
生成矩阵第二初始化模块,用于根据分片数n和冗余数m初始化编码器,通过对范德蒙德矩阵或柯西矩阵的变换,得到第一行和第一列元素均为1的生成矩阵;
编码缓存表第二初始化模块,用于初始化编码乘法缓存表;
解码矩阵模块,用于获取m+n个纠删码数据中的至少n个作为待解码数据,其中所述待解码数据中有n-k个原数据及k个校验码,根据数据获取情况生成k阶解码矩阵;
解码缓存表初始化模块,用于根据所述解码矩阵的逆矩阵初始化解码乘法缓存表;
恢复码模块,用于根据所述待解码数据中的k个校验码、n-k个原数据以及所述生成矩阵,利用编码乘法缓存表计算出k个恢复码;
还原模块,用于根据所述k个恢复码和所述解码矩阵的逆矩阵,利用解码乘法缓存表计算恢复丢失的k个原数据,将恢复的原数据和所述待解码数据中的n-k个原数据组成解码数据。
本发明中提供了一种纠删码数据的快速编解码方法和系统,其技术方案使用的被称为Sun矩阵的生成矩阵不同于现有范德蒙德矩阵和柯西矩阵,其特征为第1行和第1列全为1,这使得无论在编码还是解码时,都能够减少伽罗瓦域乘法运算数量,且兼容副本算法,大幅提高了纠删码数据的处理速度,从而在不牺牲数据处理效率及不增大硬件成本的情况下保证了分布式系统尤其是云存储系统中数据的可靠性和有效性。
附图说明
图1是本发明的一实施例中纠删码数据的快速编码方法的流程示意图;
图2为本发明的另一实施例中纠删码数据的快速解码方法的流程示意图;
图3为本发明的再一优选实施例中纠删码数据的快速编码方法的详细机器处理流程示意图;
图4为本发明的又一优选实施例中纠删码数据的快速解码方法的详细机器处理流程示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例为实施本发明的较佳实施方式,所述描述是以说明本发明的一般原则为目的,并非用以限定本发明的范围。本发明的保护范围应当以权利要求所界定者为准,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
传统范德蒙德码和柯西码的编解码效率主要受伽罗瓦域计算量影响,导致算法复杂度较高。本发明中改进的编解码方式可利用现有通用硬件实现快速高效的纠删码数据存取,大幅提高了海量数据处理系统、尤其是云存储系统的工作效率。
如图1所示,在本发明的一个实施例中,纠删码数据的快速编码方法包括步骤:
S11,根据分片数n和冗余数m初始化编码器,通过对范德蒙德矩阵或柯西矩阵的变换,得到第一行和第一列元素均为1的生成矩阵(或将其称为Sun矩阵);
S12,初始化编码乘法缓存表;
S13,将待编码数据分为n个原数据,根据所述n个原数据和所述生成矩阵,利用编码乘法缓存表计算出m个校验码;
S14,将所述n个原数据和得到的m个校验码分别存储和/或传输。
相应地,如图2所示,在本发明的一个实施例中,与前述编码方法对应的纠删码数据的快速解码方法包括步骤:
S21,根据分片数n和冗余数m初始化编码器,通过对范德蒙德矩阵或柯西矩阵的变换,得到第一行和第一列元素均为1的生成矩阵;
S22,初始化编码乘法缓存表;
S23,获取m+n个纠删码数据中的至少n个作为待解码数据,其中所述待解码数据中有n-k个原数据及k个校验码,根据数据获取情况生成k阶解码矩阵;
S24,根据所述解码矩阵的逆矩阵初始化解码乘法缓存表;
S25,根据所述待解码数据中的k个校验码、n-k个原数据以及所述生成矩阵,利用编码乘法缓存表计算出k个恢复码;
S26,根据所述k个恢复码和所述解码矩阵的逆矩阵,利用解码乘法缓存表计算恢复丢失的k个原数据,将恢复的原数据和所述待解码数据中的n-k个原数据组成解码数据。
实施例1
在本发明的优选实施例中,编码码方法的步骤S11(或编码方法的步骤S21)中,生成矩阵为m×n矩阵。由于任何数乘以1均为它自身,因此在生成矩阵中尽可能多的使用1,可以减少乘法数量。对范德蒙德矩阵变换得到生成矩阵时,只需令第一行元素为1即可,比如对于上文背景技术中的范德蒙德矩阵G1,令a1=1即可得到第一生成矩阵(或将其称为Vandermond-Sun矩阵):
其中各个ai互不相同且不为0,一个典型的示例如
对柯西矩阵变换得到生成矩阵时,要对柯西矩阵进行两次行和列的变换,使得第一行和第一列均为1:第一次行列变换,对所有行乘以该行第一列元素的倒数;第二次行列变换,对所有列乘以该列第一行元素的倒数。以背景技术中的柯西矩阵G2为例,具体变换方法如下所示:
第一次变换,各行元素对应乘以(xi+y1),得到
第二次变换,各行元素对应乘以(x1+yj)/(x1+y1),得到
;为进一步简化,可以令x1+y1=1,得到第二生成矩阵G4(或将其称为Cauchy-Sun矩阵):
;其中,xi+yj≠0,且当i≠j时,xi≠xj和yi≠yj;一个典型的示例如
步骤S12(或步骤S22)中,针对生成矩阵中每个元素Gij(第i行第j列元素),计算出它对0x00至0x0f的伽罗瓦域乘法结果,存放在连续内存中,共计16字节;再计算它对0x00、0x10、0x20、…、0xf0的伽罗瓦域乘法结果,存放在后续16字节内存。于是对于整个m×n的生成矩阵,共需m×n×32字节内存,该块内存称为编码乘法缓存表。编码乘法缓存表(以及解码时使用的解码乘法缓存表)是用来加快后续的伽罗瓦域乘法计算速度。
步骤S13中,假定待编码数据D被分为n个原数据D1到Dn,即有D[D1,D2,…,Dn]。在本发明的优选实施例中,当应用于云存储系统文件编码时,一般云存储系统的文件以分块(Chunk)为单位,一个Chunk通常为64MB,将其除以n,得到n个小的数据块(block),例如n=8时,每个block大小为8MB。对于分块无法整除n的最后的block需要补0。
利用n个原数据和生成矩阵计算第j个校验码的公式为:其中,Gij为本发明中生成矩阵(第一生成矩阵G3或第二生成矩阵G4均可)第i行第j列元素。
由于本发明中生成矩阵的第一行和第一列元素均为1,对于第一个校验码P1的计算,无需伽罗瓦域乘法操作,直接计算的异或和即可,因而首先就可省略一部分的伽罗瓦域乘法操作的消耗。
对于其余m-1个校验码,第一个原数据D1直接用于计算异或和(因其对应系数G1j总为1,可省略乘法计算),利用编码乘法缓存表计算时,将参与计算的其他每个原数据Di拆分为高字节部分和低字节部分,分别乘以对应矩阵元素Gij以计算伽罗瓦域乘法,随后再计算对应的异或和以得到校验码。其中,所述伽罗瓦域乘法数据存放在所述编码乘法缓存表中。
举例来说,在编码方法中,对于每个字节数据X,可看成是由高字节4位hi和低字节4位low组成,即:
X=hi XOR low;
当计算X与某个值Y的伽罗瓦域乘法时,根据乘法分配率有:
X*Y=(hi XOR low)*Y=(hi*Y)XOR(low*Y);亦即其结果为高字节部分和低字节部分分别计算伽罗瓦域乘法后的异或和。
对于每个原数据Di的block,在做伽罗瓦域乘法时,例如计算校验数据Pj(j>1)时,Di中的所有数据总是和Gij相乘,在j确定时,对Di而言,Gij也是生成矩阵中确定的值。因此,当计算某个原数据Di乘以Gij时,只要把其block中的高字节部分和低字节部分分别计算出来,再计算异或(XOR)和即可。
在本发明的实施例中,高字节部分和低字节部分分别乘以Gij的伽罗瓦域乘法结果可以通过查找前述编码乘法缓存表得到,该方式可以进一步减少系统的实时运算需求,从而加快编码速度。
其中,使用SIMD(Single Instruction Multiple Data,单指令多数据流)指令可以实现伽罗瓦域乘法和异或和的并行计算。比如Intel SSE或AVX指令集提供了基于128位的并行查表计算伽罗瓦域乘法功能。以下是SSE指令集示例代码:
movups xmm4,xmm0;寄存器xmm4复制xmm0内容
pand xmm0,xmm1;获取16字节的全部low部分放在xmm0
pshufb xmm2,xmm0;获取16字节的low乘法结果放在xmm2
psraw xmm4,4;所有数据右移4位,高4位到低4位
pand xmm4,xmm1;获取16字节hi部分放在xmm4
pshufb xmm3,xmm4;获取16字节的hi乘法结果放在xmm3
pxor xmm3,xmm2;获取最后乘法结果到xmm3
其中寄存器xmm0存放16字节Di数据,寄存器xmm1存放16字节0x0f数据(即0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f),寄存器xmm2存放Gij对0x00至0x0f的低字节乘法结果,寄存器xmm3存放Gij对0x00至0xf0的高字节乘法结果。
通过采用以上的7个指令,即可计算出16个字节的伽罗瓦域乘法。计算出所有Di*Gij的值后,原有Di的block就变成了Di*Gij的block,随后对其进行XOR获得最后的Pj结果。
在本发明的优选实施例中,当以字节为单位进行编码,即伽罗瓦域为GF(28)时,可采用SSE指令集中的xorps或pxor指令。该指令一次可完成128位寄存器之间的异或,即一个指令完成16个字节的XOR。
对于P1的计算,使用指令“xorps xmm0,xmm1”或“pxor xmm0,xmm1”计算的异或和,其中的xmm0,xmm1为128位寄存器,xmm0存放P1地址,xmm1依次存放D2~Dn数据。D1可在初始化时直接复制到xmm0。
如果处理器支持AVX指令集,可采用AVX指令集中的vxorps指令,即指令“vxorpsymm0,ymm1,ymm2”,该指令为三寄存器命令,把256位(32字节)的寄存器ymm1和ymm2异或后,结果给寄存器ymm0。ymm0存放P1的地址,D1数据复制到P1,ymm1和ymm2依次存放D2至Dn数据。如果最后数据不足,ymm2用0填充。和SSE指令集的命令相比,AVX指令集的vxorps指令不仅字长大一倍,而且一个指令完成两个数据的XOR,因此速度比SSE快4倍。
对于P2至Pm的计算,可以在上面的基础上进行并行XOR。
实施例2
在解码时,如果丢失了不超过校验码冗余数m的原数据分片,可使用校验码block参与解码,获得丢失的那些原数据block。传统Reed-Solomon解码方法需要解n×n阶方阵的逆矩阵,需要O(n3)的计算量(应用高斯消元法,其中n为原数据分片数)。
本发明的解码方法不需要计算n×n阶方阵的逆矩阵,只需要计算k×k阶方阵解码矩阵Glittle的逆矩阵,其中k为解码时使用的校验码block数量,有0<k≤m(k为0时表示原数据block均已收到,直接组成解码数据即可,无需再使用解码矩阵)。由于k总是小于等于原数据分片数n(因m≤n),因此可以节约解码时矩阵求逆的难度和时间。
在该优选实施例中,解码方法的步骤S23时使用k个校验码block(获取到的n个数据block中包括k个校验码和n-k个原数据,即有k个原数据丢失),则k阶解码矩阵Glittle的确定方式为:在原有生成矩阵(生成矩阵的构造方式同实施例1的描述,不再赘述)中,确定丢失的k个原数据所对应的行和所使用的k个校验码block所对应的列,取其交叉点的元素构成解码矩阵Glittle。
以实施例1中示例的第二生成矩阵G4为例,其中n=8,m=3,如果丢失了D3和D5,使用了校验码P1和P3,则解码矩阵为:
该解码矩阵是由原第二生成矩阵G4的第3和第5行的第1和第3列的元素组成。通过传统高斯消元法可求出其逆矩阵G'little。
同时,在该优选实施例中,步骤S24中为了加快后面的乘法运算,也对该逆矩阵中的每个元素用与前述实施例1中同样原理准备解码乘法缓存表,共需要k×k×32字节的内存。
步骤S25中,利用k个校验码、n-k个原数据以及生成矩阵计算恢复码P′j的通项公式为:其中,如果某个Di不在已获取的n-k个原数据中(即其为丢失数据),则认为该Di=0。
若校验码中存在P1,因生成矩阵第一列元素均为1,P'1的计算简化为P1与各Di的异或和(同上,未获取到的Di为0,可直接忽略),无需伽罗瓦域乘法操作,因而首先就可省略一部分的伽罗瓦域乘法操作的消耗。由此也可见,在解码时应尽可能使用第一个校验码P1参与计算恢复码,以便减少计算恢复码时的总乘法数量。
对于其他恢复码,也采用上述实施例1中的方式来加快伽罗瓦域乘法操作和XOR操作的速度。亦即,第一个原数据D1直接用于计算异或和,将参与计算的其他每个原数据Di拆分为高字节部分和低字节部分,分别乘以对应矩阵元素Gij以计算伽罗瓦域乘法(同上,未获取到的Di为0,相关计算可直接忽略),所述伽罗瓦域乘法数据存放在所述编码乘法缓存表中。计算时使用SIMD指令计算所述伽罗瓦域乘法和异或和,比如使用SSE或AVX指令集可并行查表计算伽罗瓦域乘法;随后采用SSE指令集中的xorps或pxor指令、或采用AVX指令集中的vxorps指令,在伽罗瓦域乘法结果的基础上进行并行XOR。
继续前述的示例,目前待解码数据包括6个原数据block(D1、D2、D4、D6、D7、D8)和2个校验码block(P1、P3)以及解码矩阵的逆矩阵G'little。
下面要准备恢复码矩阵P'[P'1,P'3],计算公式为:
由于本发明的生成矩阵中第一行和第一列元素均为1,以上公式化简为:
可见,采用本发明的生成矩阵,可以减少伽罗瓦域乘法次数,尤其是尽可能使用第一个校验码P1的情况下。
通过以上方式,获得k个恢复码P'j(下标与解码使用的k个校验码Pj对应)后,随后步骤S26中乘以解码矩阵的逆矩阵G'little,即可获得丢失的k个原数据。然后将解码恢复出的原数据(k个)和已获取的原数据(n-k个)统一组装成文件或者Chunk。步骤S26中矩阵乘法的计算也借助上述方式加快运算速度,字节拆分、并行查表及并行XOR方式相似,在此不再赘述。
此外,因本发明的生成矩阵中第一行元素全为1,其编解码方法还兼容了副本算法。只要令分片数n=1,就是1+m的多副本算法。解码时只需要有任意一个副本存在即可,逆矩阵是一阶单位阵[1]。
实施例3
参见附图3,本发明的再一个优选实施例中,以计算机详细数据处理流程的方式进一步描述了编码方法的过程:
步骤S102:根据分片数n和冗余数m初始化编码器,准备生成矩阵。此处选用Sun矩阵作为生成矩阵,其特征是矩阵的第1行和第1列均为1。所述生成矩阵可以选择由范德蒙德矩阵或柯西矩阵变换而来。比如由柯西矩阵变换的示例,使用Gij=(i×j)/(i+j-1)形式的矩阵,其中i,j分别代表矩阵的行和列。
再根据Sun矩阵的m×n个元素,准备m×n×32字节的编码乘法缓存表,存放Sun矩阵中每个元素Gij的伽罗瓦域乘法数据。对于每个元素,使用32字节,前16字节存放该元素对0x00、0x01、…0x0f(即0到15)的乘法数据,后16字节存放该元素对0x00、0x10、…0xf0(即0×16到15×16)的乘法数据。可以认为该编码乘法缓存表是一个[n][m][32]的数组。
步骤S104:将待编码文件F,按照分布式文件系统(或云存储系统)的Chunk大小,分为若干个Chunk(若最后一个Chunk不足则补零)。具体的划分过程,可能需要分布式文件系统的元数据服务器的支持。默认的Chunk一般为64MB。
步骤S106:读取一整块Chunk数据,按照分片数n,将整块Chunk数据顺序分为n个block,计为D1、D2、…、Dn。每个block长度为16倍数(使用SSE指令集时)或32倍数(使用AVX指令集时),最后一个block不足时要补零。此处block长度设置为16字节或者32字节的整数倍,是为了方便并行XOR和并行乘法运算。
步骤S108:将D1、D2、…、Dn的各个block数据保存到分布式文件系统中。每个Di位于独立的磁盘或者存储节点中。这可能需要分布式文件系统元数据服务器的支持。
步骤S110:开始编码校验码block。首先判断是否是计算第一个校验码P1;如果结果为真,转到步骤S112,否则,转步骤S118。
步骤S112:当确认要编码第一个校验码P1时进入本步骤,将D1的block直接复制给P1的block。
步骤S114:循环执行n-1次,每次使用SSE指令集的16字节的异或执行 该步骤的目的是将所有Di的block从头到尾进行异或,并将异或和赋值给P1,这样就能够获得校验码P1。
步骤S116:将P1的block数据保存到分布式文件系统中。P1存储位置和Di不同,这可能需要分布式文件系统元数据服务器的支持。之后跳转到步骤S110。
步骤S118:对除第一个校验码P1以外的其它校验码进行编码,设置j=2。
步骤S120:判断是否满足j>m的条件,如果是,表明校验码数据编码结束,跳转到步骤S130;否则,跳转到步骤S122。
步骤S122:将D1的block直接复制给Pj的block(因为其对应的系数为1,因此不需要进行乘法)。
步骤S124:循环执行n-1次,对所有Di的block从头到尾,使用SSE指令集的16字节异或指令和16字节乘法查表算法执行通过执行本步骤能够计算出Pj这个block。
步骤S126:将Pj的block保存到分布式文件系统中。具体保存位置应该和已有的Di和Px均不相同。这可能需要分布式文件系统的元数据服务器来参与。
步骤S128:设置j=j+1,准备计算下一个校验码block,之后跳转到步骤S120。
步骤S130:所有校验码均已计算完毕。通知分布式文件系统关闭该Chunk和所有block文件,将所有原数据Di和校验码Pi保存到n+m个不同的存储节点或者存储服务器后,结束该Chunk的编码。
使用上述编码方法,如果一个文件F有多个Chunk,则只需要重复执行步骤S106到S130的Chunk编码过程即可。
本实施例3中使用伽罗瓦域GF(28)和Intel的SSE指令集。
实施例4
参见附图4,本发明的再一个优选实施例中,以计算机详细数据处理流程的方式进一步描述了解码方法的过程:
步骤S202:该步骤与编码方法中的步骤S102相对应,根据分片数n和冗余数m初始化编码器,准备生成矩阵,此处选用Sun矩阵作为生成矩阵,其特征是矩阵的第1行和第1列均为1。解码时,必须使用和编码时相同的Sun矩阵。根据该矩阵的m×n个元素,准备m×n×32字节的编码乘法缓存表,用于存放矩阵中每个元素Gij的伽罗瓦域乘法数据。
步骤S204:开始按Chunk解码。获取文件F的一个Chunk的编码后数据。该Chunk编码时生成了n个原数据block(即各个Di)和m个校验码block(即各个Pj)。须获取其中至少任意n个block才能解码。如果获取不到n个,则需等待继续获取结果;如果超时则报告解码失败。
步骤S206:如果获取的数据中,包括全部n个原数据Di的block,则直接将其原样组装起来,就是原来的Chunk,解码成功;如原Chunk补过零,则进一步将用于补位的零去除。若n个block中包括k个校验码block和n-k个原数据block,则根据其编号情况,从生成矩阵中生成解码矩阵Glittle。其中,Glittle矩阵生成方式为:在原有Sun生成矩阵中,确定丢失的k个原数据所对应的行和使用的k个校验码所对应的列,取其交叉点的元素构成解码矩阵Glittle。
步骤S208:计算解码矩阵Glittle的逆矩阵G'little。根据该逆矩阵中的元素,准备k×k×32字节的解码乘法缓存表,其生成原理与编码乘法缓存表相同,所述解码乘法缓存表用于存放G'little矩阵中每个元素的伽罗瓦域乘法数据。对于每个元素使用32字节,前16字节存放该元素对0x00、0x01、…0x0f的乘法数据,后16字节存放该元素对0x00、0x10、…0xf0的乘法数据。此处可以认为解码乘法缓存表是一个[k][k][32]的数组。
步骤S210:开始解码计算。判断是否有第一个校验块P1,如果有,跳转到步骤S212,否则跳转到步骤S218。
步骤S212:将P1的block直接复制给P'1,并设置校验块使用计数器Count=1。
步骤S214:循环执行n次判断Di的block是否丢失,如果Di丢失,则继续循环判定下
一Di(即令i=i+1);若未丢失,则使用SSE指令集的16字节XOR指令执行
步骤S216:判断Count是否大于等于k,如果是,表示恢复码的数据准备结束,跳转到步骤S230;否则,跳转到步骤S218,继续准备数据。
步骤S218:设置j=2,准备处理第二个校验码。
步骤S220:判断是否满足Count>k,如果是,表明恢复码的数据准备结束,跳转到步骤S230;否则,跳转到步骤S222。
步骤S222:判断校验码Pj是否存在,如果存在Pj则跳转到步骤S224,否则跳转到步骤S228。
步骤S224:直接将Pj的block复制给P'j。
步骤S226:循环执行n次判断Di是否丢失,如果Di丢失,则继续循环判定下一Di(即令i=i+1);若未丢失,则使用16字节异或和16字节乘法查表算法执行循环完毕后对Count加1,即Count++。
步骤S228:设置j加1,即j=j+1,以便处理下一个校验码,跳转到步骤S220。
步骤S230:所有k个校验码均处理完毕,将获得的k个恢复码P'j,组成矩阵P',计算P'*G'little,即可获得丢失的k个原数据Di。计算时仍然使用SSE指令集的16字节并行XOR和并行乘法算法。保存计算得出的丢失的原数据Di的block。
步骤S232:将已有的n-k个原数据的block和计算出来的丢失的k个原数据的block,按原有顺序组成整个Chunk。如有补零,将末尾用于补位的零去除。
步骤S234:关闭该Chunk和所有block文件,结束对该Chunk的解码。
以上介绍了对单个Chunk的解码过程。对于包含多个Chunk的文件,只要重复多次S204至S234过程,即可解出所有Chunk,并最终组成原文件。
本实施例使用伽罗瓦域GF(28)和Intel的SSE指令集。
关于本发明技术方案的效果说明:下方表是在编码时本发明和现有Reed-Solomon编码算法的操作数量对比。
从表中数据比较可以看出:
照现有编码方式,做乘法时采用双表法,一个乘法操作为5个基本操作,总数量为6mn;
采用本发明的方法,使用SSE指令集,由于第一行第一列不需要做乘法,且采用128位(16字节)的乘法,1个乘法可看成7个指令,因此乘法总数为7(m-1)(n-1)/16;
采用AVX指令时,乘法不变,加法因字长为32字节,且一次可以完成2个数据的加法,总数量降低为mn/64。
最终,采用本发明的方法,编码速度可以提高到原来的12倍以上,当冗余数m较小时速度还要高。例如,当n=8,m=2和3时,采用本发明(AVX)的编码速度是原有速度的29倍和22倍。
下表是解码时的操作数量(不包括矩阵求逆)对比。解码时使用k个校验码,其中包括第一个校验码P1,但丢失数据不包括D1。和编码时相比,第一列多了k个乘法操作。如果D1丢失了,则第一行需要加k个乘法操作。
解码时,总操作数在编码操作数的基础上,再加上矩阵求逆操作。现有技术需要求n×n矩阵的逆矩阵,本发明改为求k×k阶解码矩阵的逆,0<k≤m。因为k不超过n,因此矩阵求逆操作可大幅度减少,且逆矩阵和分片数n无关,只和使用的校验码数量k有关,因此分片数n可以适当增加,系统存储率n/(n+m)也会提高,可进一步降低存储成本。
在实际测试中,使用Intel I7四核处理器、7200转SATA硬盘的PC机,在本地对448MB的文件的编解码测试结果如下表。测试中使用的文件为压缩文件,其长度是64MB的整数倍以方便测试。编解码时间均包括了磁盘文件读写时间,解码时使用全部m个校验码。
从以上测试数据看,分片数n和冗余数n的数量配置为8+2和10+2时,编码速度均接近每秒1GB。解码时因为需要计算逆矩阵和构造解码乘法缓存表,比编码性能稍慢,也有800MB/s。该速度远远超过了现有技术的性能,与预期符合得很好。该结果也远远超过了常规的7200转SATA盘的磁盘读写时间(不超过150MB/s),表明磁盘IO缓存被充分使用。此外,本发明的方法所占用的内存消耗特别小,在分片数n不超过100时,只需要几KB到几十KB的内存,方便多线程编解码。
本领域相关技术人员应能理解,与本发明的方法相对应的,本发明还同时包括一种纠删码数据的快速编码系统,与上述编码方法步骤一一对应地,该编码系统包括:
生成矩阵第一初始化模块,用于根据分片数n和冗余数m初始化编码器,通过对范德蒙德矩阵或柯西矩阵的变换,得到第一行和第一列元素均为1的生成矩阵;
编码缓存表第一初始化模块,用于初始化编码乘法缓存表;
校验码模块,用于将待编码数据分为n个原数据,根据所述n个原数据和所述生成矩阵,利用编码乘法缓存表计算出m个校验码;
分布式模块,用于将所述n个原数据和得到的m个校验码分别存储和/或传输。
另一方面,本发明还同时包括一种对应上述编码系统的纠删码数据的快速解码系统,与上述解码方法步骤一一对应地,该解码系统包括:
生成矩阵第二初始化模块,用于根据分片数n和冗余数m初始化编码器,通过对范德蒙德矩阵或柯西矩阵的变换,得到第一行和第一列元素均为1的生成矩阵;
编码缓存表第二初始化模块,用于初始化编码乘法缓存表;
解码矩阵模块,用于获取m+n个纠删码数据中的至少n个作为待解码数据,其中所述待解码数据中有n-k个原数据及k个校验码,根据数据获取情况生成k阶解码矩阵;
解码缓存表初始化模块,用于根据所述解码矩阵的逆矩阵初始化解码乘法缓存表;
恢复码模块,用于根据所述待解码数据中的k个校验码、n-k个原数据以及所述生成矩阵,利用编码乘法缓存表计算出k个恢复码;
还原模块,用于根据所述k个恢复码和所述解码矩阵的逆矩阵,利用解码乘法缓存表计算恢复丢失的k个原数据,将恢复的原数据和所述待解码数据中的n-k个原数据组成解码数据。
本发明中提供了一种纠删码数据的快速编解码方法和系统,其技术方案使用的被称为Sun矩阵的生成矩阵不同于现有范德蒙德矩阵和柯西矩阵,其特征为第1行和第1列全为1,这使得无论在编码还是解码时,都能够减少伽罗瓦域乘法运算数量,且兼容副本算法。对于非1元素的伽罗瓦域乘法,本发明可采用X86平台的SSE或AVX指令集,以128位或256位为单位,通过内存查表方式一次实现16字节或者32字节的伽罗瓦域乘法,这比现有基于1或2字节的双表法快几十倍。本发明可采用纯软件实现,编解码速度超过现有算法一个数量级以上,大大提高了Reed-Solomon的编解码效率,并能充分发挥其在云存储方面的价值。本领域的技术人员应该明白,本发明并不限于现有的具体SSE或AVX指令,而是一整套的利用SIMD指令减少计算量的算法实现。将来如果有512位或更长字节的指令集指令,本发明的算法依然可以采用,只需要替换现有的用于计算伽罗瓦域乘法和异或和的SSE或AVX指令即可,且计算效率会更高。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明。对于本领域的技术人员来说,本发明可以有各种更改和变化,例如将软件部分固化在硬件中等。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。