码-再生码
目录:
1.再生码的来历
1.1 网络编码
1.2 最大流最小割
1.3 推理得到最小的修复带宽不等式
2.再生码的分类
2.1 单节点修复
2.2 多节点修复
3. 面向分布式存储系统的纠删码
1.再生码的来历
1.1 网络编码
再生码是网络编码,针对分布式存储系统的数据冗余方法,主要有3种:复制、纠删码、网络编码(再生码和局部修复码)。
复制不用多讲,纠删码就是利用经典的策略来完成数据冗余,依据编码方式不同,可以分为RS码,奇偶校验阵列码,低密度奇偶校验码等等。
为了进一步解决降低分布式存储系统中存储和带宽资源的消耗,Dimakis等人,将网络编码应用到了分布式存储系统中,提出了再生码的编码策略,与纠删码的主要区别是:利用网络及节点的优势,降低带宽和存储。
那么这个过程是怎么来的呢?首先要了解蝴蝶网络编码,如下图所示,可以看到如果采用该网络编码方法,可以提高信息传输效率,尤其是在3到4的这个节点,之前a和b因为网络带宽问题,只能以此通过,那么现在经过网络编码以后,可以传输a+b,然后到节点4再进行解码,提高了传输效率。
然后再将网络编码应用到分布式存储系统当中,核心理念就是利用网络编码理论对存储系统中失效节点的修复问题进行建模,如下:原始文件所在节点视为源节点(上图中的S即为源节点,也是原始文件所在节点),将原始文件通过输出信道发送到各个存储节点上,存储节点可以看作中间节点(上图中的1,2,3,4都是中间节点,也即存储节点);存储节点失效以后,系统重新选择一个新节点,新节点通过存活节点的数据进行修复,修复过程可以看作是中间节点将数据传送到新节点(上图中的4分别传输给R1 和 R2),中间节点传输的数据已经重新进行了编码(上图中的4传输的数据不是a和b,而是a+b,其实就是编码后的数据),新节点对接收到的数据进行解码(R1和R2分别对a+b进行解码,得到的就是b和a),就得到了失效节点的数据。所以可将失效节点的修复过程抽象成为通信网络中常见的单源多播问题。
1.2 最大流最小割
接着,要想理解上图得出的结论,需要先讨论图论中的最大流最小割问题:
最小割:
观察上图,是一个有向有权图,4个顶点和5条边,从源点s到终点t一共有几条线路呢?3条,分别是sat,sbt,sabt,现在要求剪断图中的某些边,使得不存在s到t的路径,且要求剪掉的边的权重和最小,我们该怎么剪呢?
稍微分析一下:a和b都是中继节点,且at和bt都是3,所以at和bt先放一边;sa,sab,sb这三条线,权重最小的是ab=1,接着是sa=2,sb=6不考虑,现在假设ab剪断,还存在sat和sbt,sa=2,bt=3,总的和为1+2+3 = 6,剪掉的边的权重和为6;假设sa剪断,通路只剩bt=3,剪掉bt,剪掉的边的权重和为2+3 = 5;综上,剪掉sa,bt,是该图的最小割。
最大流:
还是上图,假设源点s不断有水流出来,边的权重代表了水管的粗细(允许流过的水流量),那么终点t流入的水流量最大是多少?
我们来分析一下,一共有三条水管,分别是sat,sbt,sabt,其中sat的水流量由sa决定,等于2;sbt的水流量由bt决定,等于3;sabt的水流量已经被之前sat中的sa占用了,所以不作数;综上,终点t流入的最大水流量 = 5。
综上,该图的最小割和最大流都=5,通过数学证明可以得知,最大流=最小割。
2. 再生码的分类
2.1 单节点的修复
具体来说(应对单节点失效):当任意一个节点失效时,系统马上选择另一个新节点,这个新节点要可以连接剩下n-1个存活节点的任意d(d ≥ k)个,从每一个存活节点下载β大小的数据,k表示能够恢复原始信息的节点数。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
插播:干扰对齐技术(IA:Interference Alignment)
1G:1978年,主要采用模拟和频分多址技术,“仅能满足一般质量模拟话音的通信要求”,模拟信号,非数字信号;
2G:数字移动通信,无线蜂窝网络经历了支持9.6Kb/s的低速语音服务;
3G:码分多址技术(码域资源的引入带来了第三代移动通信系统);3G-LTE(Long Term Evolution)。
4G:空域资源和频域资源的充分利用。
频谱资源是无线通信中的稀缺资源,为了最大化的利用频谱资源,在现有标准体系中倾向于使用频率复用系数为 1,换句话说,频谱会一直复用,但是各个小区(各个通信基站,信号塔)之间会产生干扰,例如我们人在a和b基站的边缘,既会收到a发来的,也会收到b发来的同一频谱的信号,那么该怎么解决呢?
1.将干扰作为噪声:什么是噪声,无用的声音,我们直接丢弃噪声就好,这种方法适用于干扰较小时;换句话说,你听a讲话,但是b一直在你耳朵旁边叭叭,b的声音就是噪声,如果b的声音小,那么可以忽略,如果b拿一个喇叭一直喊,那就忽略不了了。
2.正交复用技术:有时分复用,频分复用,以时分复用为例子,将时间划分为很多子时间(时分复用帧),然后在不同的子时间(时分复用帧)发送信号;频分复用也是相同的原理,只是划分频率波段;这种技术用于干扰相当的情况下,你既要听a讲,也要听b讲,不让他们同时讲,让他们一个一个讲,a讲1句,b讲1句。
3.解调:你想听a说话,但是b说话比a大的多,那不如把b说的话分析一下,如果有用,那就听进去,没用就不听。
4.干扰对齐:基本原理,通过在发射机构造发射预编码向量,将接收机收到的干扰信号对齐到较少的空间中,从而每对接收机有更多的维度用来传输期望信号。可以分成两类,信号空间干扰对齐和信号尺度干扰对齐。信号空间干扰对齐可以利用多载波或者多天线等构成的多维度来构造算法,此方法获得了广泛的研究,这是由于基于信号空间进行算法设计易于在实际系统中实现。()
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.面向分布式存储系统的纠删码
3.1 条带
以RS码为例子来说,参数k代表了数据块的个数,m代表了冗余块的个数,总块数n=k+m个块组成了一个条带,怎么理解条带呢?它是独立构成一个纠删码算法的信息集合。如下图所示,原始数据文件大小为M,基于(k,m)RS码的分布式存储系统,首先将数据分成k个块,并将其编码成n个块,这n个块分别存放于不同的存储节点上,并且每一个块存储的数据量大小是M/k(数据量只和文件大小与数据块个数有关,和冗余块个数无关,可以取极端情况,假设冗余块个数无限大,也不影响每一个块存储的数据量大小),MDS性质保证了一个条带中只要失效的节点个数不超过m,数据则不会丢失;在分布式存储系统中,在每一个条带上执行的修复操作是独立的,所以单个节点的恢复可以被看作多个条带上单个块的同时恢复。
(冗余块=校验块,下同)
3.2 具体的修复过程
纠删码中,每一个校验片段 Pi,j(第i个校验块 Pi 中的第 j 个片段)(0 ≤ i <m)(0 ≤ j <α)(α是每一个块被分成片段的个数,默认α = 1)(上图中的灰色块即为校验块,彩色块为数据块) 都可以用一组函数表述,该函数可以视为条带上的数据片段之间的一种线性组合。如果把每一个校验片段对应的一组函数表示为生成矩阵F中的一行,而用单位向量来表示数据块D和校验块P,那么生成矩阵F与D和P的结构关系如下:
该怎么理解呢?F是一个m·α 行 k·α 列的矩阵(行m·α的理解:根据上面的描述,“如果把每一个校验片段对应的一组函数表示为生成矩阵F中的一行”,那么有多少行呢?校验片段的个数 = 行数,有多少校验片段呢?校验片段的个数 = 校验块的个数 × 每一个校验块中的片段数,即为m·α)(列k·α的理解:列是对应的一组函数,其实就是被动的这样子,与第二个矩阵相结合得到的),而每一个子矩阵Fx对应的是校验块Px与所有数据块之间的函数关系,生成矩阵中的元素则是他们线性组合的组合系数,取值于有限域。
再详细一点,如下图所示,(3,2)RS码的数据块及校验块和生成矩阵的关系实例。
3.3 修复类型的划分依据
有统计研究表明,在存在着各种各样失效情况的分布式存储系统中,超过 98% 的失效都可以视为单点失效,即一个条带上仅有一个块发生故障。所以按照数据修复时访问节点的个数分类,可以分为 k < d ≤ n−1 类纠删码和 0 < d < k 类纠删码 :
再生码:之前的论文讲解中我们提到过,为什么再生码的编码方案中的d都是k ≤ d ≤ n − 1(d代表什么含义?代表参与修复节点的个数),因为首先要满足数据收集(DC)的功能,即至少要有k个节点,才能得到全部的数据,所以参与修复的节点个数至少要为k个,即k ≤ d;为什么小于n-1,因为n个节点失败1个节点剩余n-1个有效节点可以用,所以d ≤ n − 1,这个思想就是再生码的思想。
从一个角度来说,该怎么“进化”再生码呢?(总的来说,问题都比较多,但是也是切入研究的好方向)
①只保证数据节点的精确修复,但是冗余节点的修复不用精确修复,修复失效的冗余节点是通过构造一个全新的冗余节点来替换该失效部分,因此在修复后保留的数据与原始校验信息不一致。(2010)
②NCCloud 是非系统码,即所有节点存储的都是校验信息,在数据读请求发生时,需要通过计算才能得到原始的数据信息,显然读和写的开销太大。(2014)
③ZigZag码和GZ码解决了②的问题,但是每一个块需要被分为α = mk−1 个片段,并且它们的校验块修复开销依旧很高。(2013)
④为了达到MSR的数据块最优访问性能,数据分片的最低下限为α ≥ m(k−1)/m ,而如果达到全节点最优访问,数据分片下限是α ≥ m(k+m−1)/m,Ye在2017年提供了一个分片α = m⌈n/m⌉ 的 YeBarg 再生码构建,这种方法有最优访问性质,且分片数量显著降低。缺点是:文章提出的方法会导致编码后全是校验信息,原始数据被覆盖,且这种方法都是局限于理论,实际的应用及测试是一个难题。(!我可不可以从这里入手做呢?先搞懂这种方法,然后想办法看如何测试或者应用!)
⑤HashTag Codes(HTEC)则是已有的最小存储再生码中较为实用的再生码,它具有清晰、统一的构造方法,并且已通过实现和实验评估、证明了其性能优势。该方法可以在较低的分片情形下最优恢复数据块,但修复校验块则依然保持着高开销。 (可以利用HTEC码的方法,来尝试着解决④面临的问题)
从另一个角度来看,最小存储再生码面临的问题是相似的:并没有一个分片数量低、构造与修复方法清晰且通用、参数配置灵活且所有节点的修复开销为最优的再生码。MSR 类编码需要细粒度地将每个块划分为多个片段。过多的片段数目会导致编解码期间数据局部性变差、磁盘数据访问性能降低等问题。
①MSR 中最优的网络开销并不能总是转换为最佳的修复性能。虽然有些编码结构中的分片数量已经趋近于理论上的最优值,但当参数 k 和 m 数值较大时,分片情况依旧较为严重,从而使得修复性能的优化并不显著。针对这一缺点,ZigZag 提供了通过增加修复开销的方式减少分片数量的方法,一定程度上降低了分片数量对修复性能的负面影响,但 ZigZag 码仅为数据块最优修复 MSR 码,校验块的修复开销依旧很高。
②现有的再生码的大多构造出来的结构都是基于 d = n − 1 的,即在修复时需要访问除失效节点外其他所有节点来获得修复数据。在这种情况下,单节点修复开销达到最低值。系统的不稳定和偶然出现的网络波动可能导致某个或多个节点在参与修复过程中响应较慢,而 d = n − 1 的 MSR 码在该情形下需要等待所有节点的数据传输完成,因此修复请求的响应可能会被拖累。基于此,一些学者研究出来参与修复的节点个数 d 可以在 k 到 n − 1 间进行选择的 MSR 结构来适应这种场景。但这些编码结构还并不够完善,它们有的需要细粒度的分片,有的在编码之后保留的数据全是校验信息,还有的仅适用于有限的参数设置,例如文献《Explicit MSR Codes with Optimal Access, Optimal SubPacketization and Small Field Size for d = k+1, k+2, k+3.》中的条件为 d = k + 1; k + 2; k + 3。更为重要的是,这些方法都没有给出清晰且通用的构造方法,因此他们的研究仅局限于理论方面。
局部修复码:而 0 < d < k 类纠删码的基本思想是通过将数据块划分为多个组,每个组内使用局部校验块来存储局部校验信息,全局上通过编码所有的数据块得到的校验块来维持系统的可靠性,当组内的块失效时,修复过程只需要组内其他未失效块参与,从而完成修复,这样做的好处是修复带宽低,缺点是没办法利用MDS码的优良性质。
局部再生码:结合最小存储再生码的最优修复开销特性和局部修复码的数据分组构思,在每个组内通过最小存储再生码编码出多个局部校验块来实现组内失效的快速修复,这一类局部修复码又可以被称作为局部再生码(Local Regeneration Codes)。文献《Codes With Local Regeneration and Erasure Correction》仅通过理论证明了这类纠删码的存在,文献[80]则 理论证明了存在局部修复码转换为最小存储再生码的方法,但这两篇文献都并未给 出清晰的相关纠删码编解码结构。文献《Optimal Locally Repairable and Secure Codes for Distributed Storage Systems》给出了清晰的局部再生码构造,但组内的校验块修复并不满足最优修复性质,开销依然很高,并且,编码时需要进行多次运算操作,使得计算复杂且低效。此外,上述局部再生码的全局校验块修复都是需要访问所有数据块内容,因此具有相当大的修复开销。