发明名称 一种基于网络编码的分布式存储方法及其装置
摘要 一种基于网络编码的分布式存储方法及其装置,属于计算机存储技术领域,解决现有基于网络编码的分布式存储方法所存在的存储节点的磁盘IO过大的问题。本发明的分布式存储方法,适用于分布式存储系统,包括数据编码步骤、数据解码步骤和数据修复步骤;本发明的分布式存储装置,包括数据编码模块、数据解码模块和数据修复模块。本发明在数据节点损坏时,从d个数据节点下载不多于原始文件D大小的数据,修复损坏的数据,有效地减小修复带宽;直接从d个数据节点中下载随机选择的γ个编码数据块,数据块在数据节点内没有进行线性运算,在保证数据高可用性的前提下能够减小存储节点的磁盘IO,有效地提高数据节点的磁盘IO效率。
申请公布号 CN103336785B 申请公布日期 2016.12.28
申请号 CN201310219794.6 申请日期 2013.06.04
申请人 华中科技大学 发明人 冯丹;李白;施展;柳青;焦田丰
分类号 G06F17/30(2006.01)I 主分类号 G06F17/30(2006.01)I
代理机构 华中科技大学专利中心 42201 代理人 方放
主权项 一种基于网络编码的分布式存储方法,适用于分布式存储系统,包括数据编码步骤、数据解码步骤和数据修复步骤,分布式存储系统由一个名字节点NS和P个存储节点{DS<sub>1</sub>,DS<sub>2</sub>,DS<sub>3</sub>...DS<sub>P</sub>}构成,P≥3,其中用于存储文件分块的存储节点称为数据节点,为n个,3≤n≤P;其特征在于:(1)数据编码步骤,包括下述子步骤:(1.1)数据分块:将原始文件D分割为c块等大小的原始数据块D<sub>g</sub>,g=0,1...c‑1,对于不足一块原始数据块大小的剩余原始数据D<sub>B</sub>,先记下D<sub>B</sub>的大小L<sub>B</sub>,再将其使用零填充补足为原始数据块大小,作为原始数据块D<sub>c‑1</sub>;c=k×(d+1+i‑k)‑(i+1)×i/2,其中,k为恢复出原文件所需最少数据节点数目,2≤k&lt;n;d为修复一个损坏节点时可用数据节点的数目,k≤d&lt;n;i为编码冗余参数,0≤i≤k‑1;(1.2)冗余编码:将c个原始数据块D<sub>g</sub>与编码矩阵M<sub>e</sub>进行有限域2<sup>q</sup>内的运算,编码为r个编码数据块C<sub>b</sub>,q=4、8、16、32或64;b=0,1,...r‑1;r=(d+1+i‑k)×n;<maths num="0001"><math><![CDATA[<mrow><msub><mi>C</mi><mi>b</mi></msub><mo>=</mo><msubsup><mi>&Sigma;</mi><mrow><mi>g</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>c</mi><mo>-</mo><mn>1</mn></mrow></msubsup><msub><mi>a</mi><mrow><mi>b</mi><mo>,</mo><mi>g</mi></mrow></msub><msub><mi>D</mi><mi>g</mi></msub><mo>;</mo></mrow>]]></math><img file="FDA0000987379520000011.GIF" wi="508" he="103" /></maths>其中,编码矩阵M<sub>e</sub>中的矩阵元素a<sub>b,g</sub>为属于有限域2<sup>q</sup>的整数,0≤a<sub>b,g</sub>≤2<sup>q</sup>-1,编码矩阵M<sub>e</sub>为一个r行c列的范德蒙矩阵;每个C<sub>b</sub>都是c个原始数据块D<sub>g</sub>的线性组合,其中g=0,1...c‑1,线性组合系数对应为编码矩阵M<sub>e</sub>第b行的行向量V<sub>b</sub>,即每个C<sub>b</sub>对应编码矩阵M<sub>e</sub>第b行的行向量V<sub>b</sub>;(1.3)生成元数据文件D<sub>meta</sub>:将编码矩阵M<sub>e</sub>以及参数n、k、d、i、q和L<sub>B</sub>保存在元数据文件D<sub>meta</sub>中;(1.4)数据存储:将r个编码数据块C<sub>b</sub>存放在n个数据节点d<sub>f</sub>上,f=0,1,...n‑1,每个数据节点存储α=d+1+i‑k个编码数据块,并存储一份D<sub>meta</sub>的副本;数据节点d<sub>f</sub>存储的数据块为C<sub>t</sub>,t=f×α,f×α+1,...(f+1)α‑1;(2)数据解码步骤,包括下述子步骤:(2.1)获取文件元数据信息:下载原始文件D的元数据文件D<sub>meta</sub>,得到编码矩阵M<sub>e</sub>以及参数n、k、d、i、q和L<sub>B</sub>;(2.2)下载可用数据块:判断n个数据节点中可用数据节点数是否小于k个,是则数据读取失败,退出;否则任意选择k个可用数据节点,k个可用数据节点中包含r<sub>k</sub>=k×α=k×(d+1+i‑k)个编码数据块,共对应编码矩阵M<sub>e</sub>中r<sub>k</sub>个行向量:V<sub>b1</sub>,V<sub>b2</sub>...V<sub>brk</sub>;从编码矩阵M<sub>e</sub>这r<sub>k</sub>个行向量中选择c个行向量,要求这c个行向量组成的方阵M<sub>e1</sub>可逆,然后下载这c个行向量所对应的c个编码数据块:C<sub>b0</sub>,C<sub>b1</sub>...C<sub>b(c‑1)</sub>;(2.3)冗余解码:对所述方阵M<sub>e1</sub>矩阵求逆,得到其逆矩阵M<sub>e1</sub><sup>‑1</sup>,逆矩阵M<sub>e1</sub><sup>‑1</sup>中元素记为b<sub>gj</sub>,其中行数g=0,1,...c‑1,列数j=0,1,...c‑1;将逆矩阵M<sub>e1</sub><sup>‑1</sup>与下载的c个编码数据块做有限域2<sup>q</sup>内的运算,得到c个原始数据块D<sub>g</sub>,<img file="FDA0000987379520000021.GIF" wi="406" he="103" />其中g=0,1...c‑1;D<sub>g</sub>为c个编码数据块C<sub>b0</sub>,C<sub>b1</sub>...C<sub>b(c‑1)</sub>的线性组合,线性组合的系数为逆矩阵M<sub>e1</sub><sup>‑1</sup>对应的行向量V<sub>dg</sub>;(2.4)恢复数据:将冗余解码后得到的c个原始数据块D<sub>g</sub>按其下标的顺序D<sub>0</sub>,D<sub>1</sub>...D<sub>c‑1</sub>依次写入到恢复文件DO中,最后一块原始数据块D<sub>c‑1</sub>只写其前L<sub>B</sub>个字节到恢复文件DO中,形成恢复文件DO;(3)数据修复步骤,当一个数据节点d<sub>v</sub>损坏时,v为0、1、...或n‑1,其存储的编码数据块的修复包括下述子步骤:(3.1)获取文件元数据信息:下载原始文件D的元数据文件D<sub>meta</sub>,得到编码矩阵M<sub>e</sub>以及参数n、k、d、i、q和L<sub>B</sub>;设置下载数据块数目变量γ的初值:γ=(2×c×d)/((2×k‑i‑1)×i+2×k×(d‑k+1));(3.2)计算数据块修复信息,包括下述过程:(3.2.1)置循环次数变量N1=0,判断n个数据节点中可用数据节点数是否小于d个,是则数据修复失败,退出;否则进行过程(3.2.2);(3.2.2)从d个可用数据节点中随机选择γ个编码数据块,将它们对应的编码矩阵M<sub>e</sub>的γ个行向量V<sub>h</sub>组合为γ行c列矩阵Vs,h=1,2...γ;置N1=N1+1;(3.2.3)生成一个(d+1+i‑k)行γ列的修复矩阵M<sub>r</sub>=[m<sub>p,h</sub>],其中每个元素m<sub>p,h</sub>从有限域2<sup>q</sup>内随机取值,p=1,2,...(d+1+i‑k),h=1,2,...γ;(3.2.4)建立r行c列的新编码矩阵M<sub>e</sub>’,M<sub>e</sub>’由原有行向量和新行向量V′<sub>p</sub>构成,原有行向量为可用数据节点所包括的编码数据块对应的编码矩阵Me中的行向量,按其在M<sub>e</sub>中原有位置存在于M<sub>e</sub>’中,做有限域2<sup>q</sup>内的矩阵M<sub>r</sub>与矩阵Vs乘法运算,得到新行向量V′<sub>p</sub>:<maths num="0002"><math><![CDATA[<mrow><msubsup><mi>V</mi><mi>p</mi><mo>&prime;</mo></msubsup><mo>=</mo><msubsup><mi>&Sigma;</mi><mrow><mi>h</mi><mo>=</mo><mn>1</mn></mrow><mi>&gamma;</mi></msubsup><msub><mi>m</mi><mrow><mi>p</mi><mo>,</mo><mi>h</mi></mrow></msub><msub><mi>V</mi><mi>h</mi></msub><mo>,</mo></mrow>]]></math><img file="FDA0000987379520000031.GIF" wi="462" he="95" /></maths>用新行向量V′<sub>p</sub>代替编码矩阵M<sub>e</sub>中损坏的数据节点d<sub>v</sub>所存储的α个编码数据块对应的行向量V<sub>z</sub>,其中z=v×α,v×α+1,...(v+1)×α‑1;(3.2.5)检查所述新编码矩阵M<sub>e</sub>’是否满足MDS性质,是则进行子步骤(3.3),否则进行过程(3.2.6);所述MDS性质中文为最大距离可分性质,即n个节点中任意k个节点的数据可以恢复出原文件的数据;(3.2.6)判断是否N1≤L,是则转过程(3.2.2);否则置N1=0,置γ=γ+1,然后转过程(3.2.2),最大循环次数L=1000~3000;(3.3)更新元数据文件:将元数据文件D<sub>meta</sub>中的编码矩阵M<sub>e</sub>替换为新编码矩阵M<sub>e</sub>’,形成更新后的元数据文件D<sub>meta</sub>’,将其拷贝到各个数据节点;(3.4)修复数据块:下载过程(3.2.2)中所随机选择的γ个编码数据块C<sub>e1</sub>,C<sub>e2</sub>,...C<sub>eγ</sub>,做有限域2<sup>q</sup>内矩阵M<sub>r</sub>与γ个编码数据块C<sub>e1</sub>,C<sub>e2</sub>,...C<sub>eγ</sub>的运算,得到修复的数据块C<sub>p</sub>’:<maths num="0003"><math><![CDATA[<mrow><msup><msub><mi>C</mi><mi>p</mi></msub><mo>&prime;</mo></msup><mo>=</mo><msubsup><mi>&Sigma;</mi><mrow><mi>h</mi><mo>=</mo><mn>1</mn></mrow><mi>&gamma;</mi></msubsup><msub><mi>m</mi><mrow><mi>p</mi><mo>,</mo><mi>h</mi></mrow></msub><msub><mi>C</mi><mrow><mi>e</mi><mi>h</mi></mrow></msub><mo>;</mo></mrow>]]></math><img file="FDA0000987379520000041.GIF" wi="470" he="95" /></maths>C<sub>p</sub>’为γ个编码数据块C<sub>e1</sub>,C<sub>e2</sub>,...C<sub>eγ</sub>的线性组合,线性组合的系数为修复矩阵M<sub>r</sub>对应的行向量V<sub>rp</sub>;(3.5)存储数据块:将修复的数据块C<sub>p</sub>’存储到一个新的可用数据节点上。
地址 430074 湖北省武汉市洪山区珞喻路1037号