今日头条
随着计算机技术和存储技术的发展,数据正以爆炸式的速度增长,海量数据对存储系统提出了巨大的挑战。为了保障存储系统的CAP,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),对于可用性来说常见的2种技术是多副本和纠删码,多副本就是把数据复制多份分别存储到不同地方以实现冗余备份,这种方法容错性能较好但存储利用率低,比较典型的3副本磁盘利用率仅33.33%,当系统数据量很大时,多副本带来巨大的额外存储空间消耗,导致TCO居高不下。纠删码技术以牺牲CPU计算量和网络负载为代价,提高存储空间利用率,同时提供近似副本的可靠性。
纠删码(Erasure Coding, EC)算法起源于1960年,最早应用于通信系统领域。最著名的是范德蒙RS编码Reed-Solomon。随着时间的推移,出现了一些变种算法,例如柯西RS编码等。目前,纠删码技术在分布式存储系统中的应用主要有三类,阵列纠删码(Array Code: RAID5、RAID6等)、RS(Reed-Solomon)里德-所罗门类纠删码和LDPC(LowDensity Parity Check Code)低密度奇偶校验纠删码。纠删码首先对原始数据进行分片,然后基于分片编码生成备份数据,最后将原始数据和备份数据分别写入不同的存储介质。数据恢复是编码的逆运算(为了能够进行数据恢复,要求编码采用的方法(函数)一定可逆),因此也称为解码。
目前一些主流的云存储厂商都采用EC编码方式。
Reed-Solomon实现原理
假设存储系统由n块磁盘组成,我们将它分为k个磁盘来保存数据,这样m=n-k个磁盘保存编码信息,分别对数据进行编码,允许最多m个磁盘出现故障(可以是数据盘也可以是编码盘)。编码和解码行为如图1所示。通过编码,k个数据盘的内容被用来计算m个编码盘的内容。当m个磁盘出现故障,利用现有的磁盘数据通过解码算法可以还原得到所有丢失的数据内容,从而实现恢复。
图1 纠删码基本原理图
编码原理
RS编码以word为编码和解码单位,大的数据块拆分到字长为w(取值一般为8或者16位)的word,然后对word进行编解码。数据块的编码原理与word编码原理相同,后文中一word为例说明,变量Di, Ci将代表一个word。
把输入数据视为向量D=(D1,D2,…, Dn), 编码后数据视为向量(D1, D2,…, Dn, C1, C2,…, Cm),RS编码可视为如下图所示矩阵运算。
图2 编码数据
图2最左边是编码矩阵(或称为生成矩阵、分布矩阵,Distribution Matrix),编码矩阵需要满足任意n*n子矩阵可逆。
为方便数据存储,编码矩阵上部是单位阵(n行n列),下部是m行n列矩阵。下部矩阵可以选择范德蒙德矩阵或柯西矩阵。
解码原理
RS最多能容忍m个数据块被删除。数据恢复的过程如下:
(1)假设D1、D4、C2丢失,从编码矩阵中删掉丢失的数据块/编码块对应的行。
图3 丢失m块
根据图2所示RS编码运算等式,可以得到如下B’ 以及等式。
图4 vandermode矩阵
(2)求出B’的逆矩阵。
图5 B’逆矩阵
(3)由于B’ 是可逆的,记B’的逆矩阵为 (B’^-1),则B’ * (B’^-1) = I 单位矩阵。两边左乘B’ 逆矩阵。
图6 两边乘上B’逆矩阵
(4)得到如下原始数据D的计算公式
图7 单位矩阵
即恢复原始数据D:
图8 解码完成
(5)对D重新编码,可得到丢失的数据
以典型的读写过程来描述纠删码在ceph中的实现。假设使用RS(10,3)的方式,客户端要写入一个对象:副本池(3副本为例):OSD会将数据复制3份分别存放到3块不同的磁盘上(OSD1,OSD2,OSD3)纠删池(RS(10,3)为例)将原始数据按照顺序切分为若干相同大小的块,示例切分为10块;将对象基于纠删码算法进行编码,得到编码块数据,示例得到3块大小相同的数据;将编码后的数据块及编码块分别存放到13块不同的磁盘上(OSD1-OSD13)。
客户端要读取一个对象:副本池,由于3副本存放的数据均相同,客户端直接从主OSD读取后返回。
纠删池
如果数据块未丢失,那么需要从存放了多个数据块的不同磁盘上读取并按照顺序拼接,如果读的过程中检测到数据块丢失,那么除了需要从那些幸存的OSD上读取数据之外,还需要通过纠删码算法解码还原,最后按照顺序拼接后返回给客户端。
纠删码在AWCloud中的应用
在Ceph中纠删码相对于多副本而言,读取数据需要同时访问更多的磁盘,由算法本身带来的额外网络消耗,以及磁盘故障时额外CPU消耗,导致纠删码性能比多副本要差,因此仅适合于存储大量对时延不敏感的冷数据(如备份数据)。
AWCloud利用FPGA高效的计算能力,将原本使用CPU计算的纠删码算法offload到FPGA硬件上,通过PCI-e方式完成数据在CPU和FPGA硬件之间的交换,最终达到降低CPU消耗的方式来提升集群性能,寻求成本与性能之间的平衡。
fqj
全部0条评论
快来发表一下你的评论吧 !