总结:在分布式存储系统中保障数据的可靠性

1.多副本和RS纠删码

随着数据规模的增加,数据中心的节点故障数量急剧增加。为了保障数据的可靠性,大型数据存储企业通常采用3副本的方式对数据进行备份,然而3副本的开销巨大,并不是一种经济的方式。为此最典型的方法是采用纠删码来保证系统的可靠性。纠删码(erasure coding,EC)是一种数据保护方法,它将数据分割成片段,把冗余数据块扩展、编码,并将其存储在不同的位置,比如磁盘、存储节点或者其它地理位置。总数据块 = 原始数据块 + 校验块, 常见表示为,n = k + m。Reed-Solomon(RS)码是存储系统较为常用的一种纠删码,它有两个参数n和k,记为RS-(n,k)。k个数据块组成一个向量D乘上一个生成矩阵B从而得到一个数据向量,该向量由k个数据块和m个校验块构成。RS(n,k)最多可容忍m个块(包括数据块和校验块)丢失。下面用图解对RS-(8,5)纠删码进行一个简要的介绍:
编码
上图中生成的编码字也叫做一个条带(strip),分别存储在不同的结点当中。假设有3块发生故障,如下图所示:
故障块
下面对故障块进行修复,首先标记好哪些块故障,并去掉生成矩阵对应的行,由于生成矩阵是一个Vandermonde矩阵,保障它的任意k行k列矩阵可逆。因此可以通过矩阵求逆以及矩阵的乘法求解出故障块。下图是求解的过程:
解码
下面对多副本和RS纠删码两种方法进行一个对比:

存储冗余度修复带宽
3副本41
RS-(8,5)1.65

存储冗余度是指存储的总数据量除以原始数据,对于RS-(n,k)而言就是n/k。修复带宽是指修复一个故障块所需块的数量,RS编码需要k个数据块才能把故障块恢复,而多副本只需传输一个故障块的备份即可。因此,RS纠删码虽然可以减少存储冗余,但计算开销以及修复带宽过大,所以需要一些更高效的修复策略或者新的高效修复的编码。针对计算开销可以对编码矩阵进行优化比如采用Cauchy编码矩阵来使矩阵相乘相加的操作简化为异或操作。
生成矩阵优化

下面章节将分别介绍一下高效的编码以及高效的修复策略。

2.LRC码

LRC码是微软公司首次提出并运用到存储系统上面的。由于RS码的修复开销过大,因此设想把数据块进行分组,为每个分组添加一个局部校验块。下面详细介绍一下LRC码,LRC-(k,l,r),其中k是数据块的数量,l是局部组的数量,r是全局校验块的数量。下图是一个(6,2,2)的LRC码。
LRC码
LRC码具有如下性质:
①局部校验块数量为r,任何单个数据块故障需要同组k/l个块解码。
②LRC实现最优局部修复时,能够容忍任意r+1个块故障,并且能够达到信息论可解码l+r个块故障。
判断是否信息论可解码:对于每个本地组,如果本地校验块可用,而至少一个数据块被擦除,我们将校验块与一个已擦除的数据块交换。交换操作将数据快标记为可用,将校验块标记为擦除。如果此时擦除数据块的总数不超过全局校验块的数量,则该算法在理论上声明故障模式信息是可解码的。下图中的两种情况,都是信息论可解码:
信息论可解码
下面对RS纠删码和LRC纠删码两种方法进行一个对比:

存储冗余度修复带宽
RS-(n,k)n/kk
LRC-(n,k,r)n/kr

表格中的LRC参数和上面描述的有稍许不同是为了和RS码保持统一,这里的r代表的是一个局部组里面数据块的数量。由于LRC引入了局部校验块,因此存储冗余度要高于RS码但是修复带宽要比RS码小的多。所以LRC利用局部校验块的额外存储开销进行高效的块恢复,在存储开销和块修复间做出了一个权衡。

3.Clay码

Clay码是MSR码的一种,是目前最有效的MSR码,MSR全称最小存储再生码,Clay码实现了最小存储开销和低修复带宽。Clay主要采用了分层耦合的思想来最小化修复带宽,每次修复都只需要部分子块参与就行。下面简要介绍一下Clay-(4,2)的编码和修复过程。
编码过程:
Clay编码
PFT(pairwise forward transform):是一个耦合操作。
MDS是一个MDS码的编码过程,比如RS纠删码。
PRT (pairwise reverse transform):是一个解耦合操作。
解码过程:Clay解码
上图是一个Clay编码的解码过程,假设一个结点发生故障,也就是四棱柱的一条棱消失,现在要对其进行恢复。图中选定第二和第四层进行解码:
①PRT解耦合;
②MDS解码操作;
③利用②操作解出的U,联合C解出C*。
从图中我们可以看出Clay解码只需要6个子块参与修复运算,相对于RS码需要2个块进行修复,节省了修复带宽。
Clay子块化使修复开销减少,下图是一个RS-(14,10),α=4子块,β=1子块。
子块化

4.修复策略

上面介绍的都是编码层面的优化来实现低修复带宽,接下来是对编码使用流水线和并行化技术加快故障修复。主要包括两种类型的修复:单块修复和全节点修复。
传统修复
上图是一个传统修复的过程。将修复过程划分为时隙,这样在每个时隙的网络链路上只能传输一个块,需要k个timeslots去修复一个故障块。对于一个条带上的多块故障f≤n-k,需要k+f-1个timeslots。缺点:传统修复带宽利用不均匀,修复时间长。
流水线修复
上图是一个流水线修复的过程。流水线方式将一个块划分为s个切片,对每个切片流水线式修复。单块修复时间为1+(k-1)/s个timeslots,当s很大时,修复时间趋向于1timeslots。修复性能趋近多副本的修复时间。
多块故障流水线修复
上图是一个多块故障流水线修复的过程。f代表故障块数,对f个切片流水线式修复。与f次单块修复不同,多块流水线中k个helper块只完整的读取一次。多块修复时间为f+f*(k-1)/s个timeslots,当s很大时,修复时间趋向于f个timeslots,刚好对应故障块的块数。优于传统的修复k+f-1个timeslots。
全节点修复,对于多个条带故障,且每个条带一个块故障的情况,可以并行化多个单条带修复操作。但是会有一个问题,helper结点可能被多个条带修复选择,它将过载,减缓整体修复性能。对策:采用最近最少使用的结点作为helper结点,减少冲突。
然而流水线技术只适用于线性码如RS码等,对于编码过程不是简单的相乘相加码使用不了流水线技术如Clay码,但可以通过并行化子块操作来提高修复效率。
以Clay-(4,2)为例,将每个块分为4个小子块。利用有向无环图来抽象子块并行化操作。
Clay码修复过程
ECDAG
pECDAG
利用pECDAG使结点修复带宽和最大修复负载都尽可能小。
修复带宽:所有节点的传入子块的总数或者传出子块的总数。
最大修复负载:所有节点上节点的传入或传出子块的最大数量。如上图修复带宽=7,最大修复负载=5。有关pECDAG更多细节参考会议论文FAST’23 paraRC

5.总结

对于分布式存储系统可靠性问题,目前主要是从两种角度出发:
①实现新的编码提高存储系统应对故障的性能,往往需要花大量的时间来检验效果才能部署到真实的存储系统上去。
②在原有编码基础上提出一系列新的修复策略,相对来说更易实现。

6.附录:Jerasure

Jerasure是由James S. Plank开源的一个纠删码库,里面含有多种纠删码的实现。有关Jerasure库的部署可以参考文章
下面有一个RS纠删码的编码和解码的简单示例:
./encoder ‘inputfile’ k m ‘coding_technique’ w (packetsize) (buffersize)
inputfile:需要被编码的文件。在这个例子中,我们在Examples文件夹下创建了一个data文件夹,其中有一个图片文件“Figure_1.png”。
K:将文件划分的数据块的数量。这里选择4。
m:根据数据块生成的校验块的数量。这里选择2。
coding_technique:使用的编码算法。可选的有"reed_sol_van", “reed_sol_r6_op”, “cauchy_orig”, “cauchy_good”, “liberation”, “blaum_roth”, “liber8tion”, “no_coding”,在这里我们使用"reed_sol_van"。
w:bit-word size。范得蒙德算法的w只能从{8, 16, 32}中选取,这里我们选择8
packet size:就是包大小。这里选择8。
buffer size:每次处理的数据大小,这里选择1024。

./encoder ‘data/Figure_1.png’ 4 2 ‘reed_sol_van’ 8 8 1024

在这里插入图片描述
去除K1块后,输入解码命令:

./decoder 'data/Figure_1.png'

在这里插入图片描述
通过diff命令可以判断解码后的图片和原图片一致。
在这里插入图片描述

  • 47
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值