前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >分布式系统下的纠删码技术(一) — Erasure Code (EC)

分布式系统下的纠删码技术(一) — Erasure Code (EC)

作者头像
全栈程序员站长
发布于 2022-11-17 08:33:32
发布于 2022-11-17 08:33:32
3.4K0
举报

近几个月主要参与一个分布式存储系统的纠删码部分(用于数据容错),纠删码在学术界出现比较早,现在ceph,微软的存储系统,Hadoop 3.0等都用了EC。文章会分为多篇,主要将Erasure Code,LRC, 以及相关的数学基础,作为学习总结。

一、纠删码简介

分布式系统需要在硬件失效等故障发生后仍然能继续提供服务。就数据而言,HDFS采用每份数据3副本的方式,保证某些数据损失之后仍能继续使用。

数据的容错除了副本还有另一种做法,就是把丢失的数据计算出来。这就是纠删码的思想了。(PS: Spark的数据也可以通过计算恢复,详见spark论文)。

与副本相比,纠删码的优点在于节省存储空间(见下文解释),缺点在于有计算开销而且修复需要一定时间,而副本损失只要复制出来损失的数据,未损失的数据可以继续提供服务。

二、Erasure Codes(EC)原理

1、朴素的解释

有下列6个方程组成的方程组

(1)x1 = 1

(2)x2 = 2

(3)x3 = 3

(4)x1 + x2 + x3= 6

(5)x1 + 2*x2 +4*x3 = 17

(6)x1 + 3*x2 +9*x3 = 34

要知道x1,x2,x3三个数的值,只需要上面任意三个方程即可解出来。假设有上面4个方程,有趣的地方出现了,如果丢了一个方程,那么仍然可以用其他三个方程求出x1,x2, x3的值。相当于只多了一个方程就能解决x1,x2,x3任何一个数的值丢失的问题。

把上面的方程(1)(2)(3)看做是分布式系统的数据,(4)(5)(6)看做是code,那么只要一个code,即使丢了(1)(2)(3)中的任何一个数据都是可以恢复的, 达到这样的效果只需要存储4个方程。 如果采取副本策略,要达到(1)(2)(3)丢失任何一个数据都能恢复的话,只要把(1)(2)(3)三个方程都存储两份,也就是存储了6个方程。于是纠删码比副本策略在存储效率上的优势就体现出来,4/6的比值,节省1/3的空间。实际根据code的多少,存储效率会不一样。

2、存储系统中的符号约定

k:数据块的个数

m:校验块的个数(就是code)

n:k+m,也就是数据块和校验块的个数总和。

编码效率:r = k/m

上面的解释是参照Jerasure库的代码解释的,IntelEC库符号表示不同,但是意义一样,不再赘述。

3、现有的EC库

(1)Jerasure库

http://jerasure.org/

(2)Intel EC库

http://www.intel.com/content/www/us/en/storage/erasure-code-isa-l-solution-video.html

实际实验发现,(1)线程不安全,(2)线程安全(本人简单看过一部分代码+1000线程并发测试

尚未面世的Hadoop 3.0据说要使用EC编码。查资料发现用的应该也是英特尔库。本人近日工作是基于英特尔的EC库封装LRC库, 也就是线程安全的LRC(见后文)。

三、模拟EC编码、解码(恢复)的例子

假设4个data块,2个Code块。

1、编码

通用的编码矩阵:

4个data块,2个Code块情况下,编码过程如下:

(a)

Code块是:

C0=D0+D1+D2+D3

C1=D0+2*D1+4*D2+8*D3

图1 EC编码过程

编码矩阵如上图,Di表示数据块,Ci表示校验块。编码矩阵(encodematrix)组成有两部分,上面是k*k的单位矩阵,下面是m*k的编码矩阵,如图是范德蒙矩阵,Jerasure库用的是范德蒙矩阵,Intel EC提供了范德蒙矩阵和柯西矩阵的实现,奇怪的是Intel EC说范德蒙不一定可逆,柯西一定可逆,所以本人在用Intel EC的时候一直用柯西矩阵。(为什么需要可逆见下文:解码)。

2、解码

解码粗浅理解就是未损失的数据块和校验块乘以编码矩阵的逆矩阵可以得到原来的数据。大部分博客感觉也就是能让人有这种粗浅的感觉,所以本文写得更详细一点。

以4个data块,2个Code块的情况的解码来解释,当code的块数为2时,最多坏掉两块数据块(按照解方程就是四元一次方程,至少4个才能解出来四个元的值)。此处假设一个数据块D1和一个code块C0丢失

解码过程分为两步:

(1)根据已有的数据求解出所有的Data块, D0 ~ D3

更具体而言,顺序遍历编码矩阵的前n行,顺序选取没有损坏的前k行(意思是该行对应的数据块或者校验块没有损坏)。生成k*k的矩阵 M。本例中M矩阵如下:

编码encode的时候这几行发生了下面的事情:

(b)

(注:等号右边应该是D0 D2 D3 C1,因为我们假定D1和C0坏掉了)

所以解码的时候,有D0 D2 D3 C1 以及M,很显然可以通过求M的逆矩阵来求出D0D1 D2D3 :

(c)

(2)求出损失的数据

(1)中已经求出来了所有的数据块的内容,而且编码矩阵是知道的,因此可以求出所有的数据,对于本例子,其实是在(c)式子两边同时乘以一个矩阵来求出C0,矩阵很简单,就是相应的编码矩阵的部分:

于是就求出来了丢失的数据D1和Code C0

结合Intel EC的源码简单再讲下decode生成解码矩阵decodematrix的过程:

(1)顺序遍历编码矩阵的前n行,顺序选取没有损坏的前k行(意思是该行对应的数据块或者校验块没有损坏)。生成k*k的矩阵 M。 (2)求M的逆矩阵 M_inv (后续文章讲怎么求) (3)求解码矩阵decode matrix,解码矩阵构成: a) 损失的数据块:损失的数据所在的行对应的M_inv的行复制到decode matric b)直接上代码…

Decode matrix的构成的代码:

nsrcerrs就是数据块的损失的个数;

nerrs是总的(数据块加上校验块)损失的个数;

invert_matrix就是上面说的M_inv ;

src_err_list是失效的数据块对应的行的下标(idx);

Gf_mul以及下面的异或符号,简单说下就是EC的矩阵运算都是在有限域进行的。 直接把异或理解成加法, 把gf_mul理解成乘法,然后下面的循环看成矩阵运算很容易明白了…

for (i = 0; i < nsrcerrs; i++) { for (j = 0; j < k; j++) { decode_matrix[k * i + j] = invert_matrix[k * src_err_list[i] + j]; } } /* src_err_list from encode_matrix * invert of b for parity decoding */ for (p = nsrcerrs; p < nerrs; p++) { for (i = 0; i < k; i++) { s = 0; for (j = 0; j < k; j++) s ^= gf_mul(invert_matrix[j * k + i], encode_matrix[k * src_err_list[p] + j]); decode_matrix[k * p + i] = s; } }

3、编码矩阵需要满足的性质

从上面的过程可以看出,编码矩阵必须可逆,否则无法解码,也就无法恢复数据。

k*k的范德蒙矩阵可逆的简单证明(保研狗,就大一学过线代,如果出错的话求指教):

(1) 范德蒙的性质之一是有求行列式的式子: 式子来源: (https://zh.wikipedia.org/wiki/%E8%8C%83%E5%BE%B7%E8%92%99%E7%9F%A9%E9%99%A3) (2) 对于我们用的范德蒙矩阵,ai=i (i = 1,2,3…) 所以任意两行ai和aj一定不一样,也就是det(V) 不为0 (3)行列式的值不为0等价于矩阵可逆。 证毕。(略羞耻,因为(1)直接用的人家的结论。也可以从满秩的角度很容易证明)

所以当数据损失之后,选取k*k的矩阵,一定可逆,也就可以继续解码。

四、编码类型

1、编码方式

(1)横式编码(horizontalcodes)

这种编码方式下,code数据块单独uoweie数据块,而不是和data块放在一起。例如EVENODD编码,RDP编码都是横式编码。

(2)纵式编码(verticalcodes)

code存储在数据所在的磁盘,某些块既有数据又有code。如X-code编码。

2、RS编码

RS编码是唯一可以满足任意的数据磁盘数目(n)和冗余磁盘数目(m)的MDS(maximum distance separable)的编码方法。解码重构的原理推到中,有一个重要的条件,就是未出错的信息所对应的残余生成矩阵在GF(2w)上满足可逆。

(1) 范德蒙RS编码

范德蒙矩阵满足上述的“可逆”的条件。

(2) 柯西RS编码

柯西矩阵满足上述的“可逆”的条件。

与范德蒙RS编码区别就在于用柯西矩阵代替范德蒙行列式,并且有位运算的方法可以对柯西RS编码中的乘法进行改进,转化为二进制乘法,整个RS编码的运算可以转化为只包含异或的简单运算。(此部分待补充)

五、分布式系统的工程实现

1、简单实现方案

(1)编码

在创建数据块以及数据块远远未写满的情况下,使用副本策略做数据容错。当若干数据块(比如k个数据块)都基本写满,则禁止对这些数据块做写(包括修改、删除)等操作。此时进行编码,当编码成功时,删除冗余的数据块副本。此时就从副本策略变成纠删码策略。

(2)解码

a)一个线程定期扫描数据,比如对数据块和校验块做crc校验,如果发现有数据块或者校验块失效,则启动恢复线程。

b)恢复线程先根据EC组现有的数据情况,从远程或本地获取必要的数据进行解码,恢复失效数据。

2、EC的一些优化策略

本人参与的项目遇到了这种情况。最初在解码前未损失的数据都拉到本地,然后恢复数据。后来发现这样是多余的。于是只顺序拉去必要的数据块。实际如果肯修改相应的EC库的代码,还可以有其他选择策略,比如选择同一机房,同一机器不同磁盘的数据用于恢复(这个时候构造的解码矩阵也有一定变化,需要做相应修改,详见本文的解码矩阵的生成过程)。

参考及相关资料:

Hadoop EC的一个实现:

https://sourceforge.net/projects/hadoop-ec/

http://blog.cloudera.com/blog/2016/02/progress-report-bringing-erasure-coding-to-apache-hadoop/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/222905.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
分布式存储系统纠删码技术分享
海云捷迅云课堂专题,旨在秉承开源理念,为大家提供OpenStack技术原理与实践经验,该专题文章均由海云捷迅工程师理论与实践相结合总结而成,如大家有其他想要了解的信息,可留言给我们,我们会根据问题酌情回复。
海云捷迅
2020/07/08
4.1K0
分布式存储系统纠删码技术分享
RS 纠删码为什么可以提高分布式存储可靠性?| 原力计划
Erasure Code(EC),即纠删码,是一种前向错误纠正技术(Forward Error Correction,FEC,说明见后附录)。目前很多用在分布式存储来提高存储的可靠性。相比于多副本技术而言,纠删码以最小的数据冗余度获得更高的数据可靠性,但是它的编码方式比较复杂。
区块链大本营
2020/03/24
1.6K0
RS 纠删码为什么可以提高分布式存储可靠性?| 原力计划
​纠删码理论基础
纠删码数据容错原理 纠删码是一种前向纠删码。过程分为编码和解码。编码过程是将文件分割为固定大小的文件块,针对这些被分割的文件块编码为k个块(k个块中包括了k1个数据块和k2个校验块)。解码过程是将编码后的多个子块作为输入,经过解码可以恢复任何一个块的数据(不管是数据块还是校验块)。 采用纠删码技术来做数据容错,当磁盘出现故障,失效数据可以通过纠删码的校验链的构建机制来恢复数据,而不是纠正数据自身的错误,一般(k+r,k)纠删码存储开校门为r/k,相对副本纠删码具有低存储开销,但是纠删码涉及到的编解码
用户4700054
2022/08/17
1.5K0
​纠删码理论基础
有趣的纠删码(erasure code)
RAID 是 "Redundant Array of Independent Disk" 的缩写,中文意思是独立冗余磁盘阵列 是一种古老的磁盘冗余备份技术,也许你从未了解其中的原理,但肯定也听说过它的大名。简单地解释,就是将N台硬盘通过RAID Controller(分Hardware,Software)结合成虚拟单台大容量的硬盘使用,其特色是N台硬盘同时读取速度加快及提供容错性.
王磊-字节跳动
2021/05/30
12.3K0
Hadoop3.0时代,怎么能不懂EC纠删码技术?
根据云存储服务商Backblaze发布的2021年硬盘“质量报告”,现有存储硬件设备的可靠性无法完全保证,我们需要在软件层面通过一些机制来实现可靠存储。一个分布式软件的常用设计原则就是面向失效的设计。
个推
2022/05/27
1.5K0
Hadoop3.0时代,怎么能不懂EC纠删码技术?
Erasure-Code-擦除码-1-原理篇
本文链接: [https://blog.openacid.com/storage/ec-1/] 下载pdf: [Erasure-Code-擦除码-1-原理篇.pdf]
drdrxp
2022/04/28
5920
Erasure-Code-擦除码-1-原理篇
应用AI芯片加速 Hadoop 3.0 纠删码的计算性能
在保证可靠性的前提下如何提高存储利用率已成为当前 DFS 应用的主要问题之一。
ethanzhang
2018/12/30
10.5K1
应用AI芯片加速 Hadoop 3.0 纠删码的计算性能
Reed-Solomon纠删码简析
Reed-Solomon编码(又叫RS编码、里德-所罗门编码)作为一种前向纠错编码,是一种很常见的数据冗余技术,也就是通过对数据增加冗余部分来保证当数据丢失时能够在一定程度上进行恢复。最典型的应用就是在现在最流行的QR二维码的编码设计中。
mythsman
2022/11/14
2.1K0
纯干货 | 深入剖析 HDFS 3.x 新特性-纠删码
HDFS是一个高吞吐、高容错的分布式文件系统,但是HDFS在保证高容错的同时也带来了高昂的存储成本,比如有5T的数据存储在HDFS上,按照HDFS的默认3副本机制,将会占用15T的存储空间。那么有没有一种能达到和副本机制相同的容错能力但是能大幅度降低存储成本的机制呢,有,就是在HDFS 3.x 版本引入的纠删码机制。
五分钟学大数据
2021/04/01
1.8K0
什么是HDFS的纠删码
Fayson在前面的文章中介绍过CDH6,参考《Cloudera Enterprise 6正式发布》和《如何在Redhat7.4安装CDH6.0》。CDH6主要集成打包了Hadoop3,包括Hadoop3的一些新特性的官方支持,比如NameNode联邦,纠删码等。纠删码可以将HDFS的存储开销降低约50%,同时与三分本策略一样,还可以保证数据的可用性。本文Fayson主要介绍纠删码的工作原理。
Fayson
2018/11/16
5.6K0
详解HDFS3.x新特性-纠删码
EC(纠删码)是一种编码技术,在HDFS之前,这种编码技术在廉价磁盘冗余阵列(RAID)中应用最广泛(RAID介绍:大数据预备知识-存储磁盘、磁盘冗余阵列RAID介绍),RAID通过条带化技术实现EC,条带化技术就是一种自动将 I/O 的负载均衡到多个物理磁盘上的技术,原理就是将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去,这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突(当多个进程同时访问一个磁盘时,可能会出现磁盘冲突),而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能。在HDFS中,把连续的数据分成很多的小部分称为条带化单元,对于原始数据单元的每个条带单元,都会计算并存储一定数量的奇偶检验单元,计算的过程称为编码,可以通过基于剩余数据和奇偶校验单元的解码计算来恢复任何条带化单元上的错误。
五分钟学大数据
2021/01/15
1.7K0
纠删码优势分析
纠删码概述 存储节点或者存储介质失效已经成为经常的事情,提高存储可靠性以及保障数据可用性已经变得非常重要,纠删码具有高存储效率和高容错能力。在体量非常大的存储中纠删码存储方式相比副本方式存在编码开销,又由于其特有的IO访问路径,其改进空间比较大 保障数据可用性的常用方法就是数据冗余,传统的数据冗余方式就是副本和纠删码方式,副本是将每个原始数据分块都镜像复制到其他设备上来保证原始数据丢失或者失效时有副本可恢复;副本方式不涉及数据变换,而纠删码会对数据进行变换和运算,得到支持数据冗余的编码数据,比如k+r(k个
用户4700054
2022/08/17
1.7K0
纠删码优势分析
FEC 的介绍
根据文章内容,总结为:在容灾存储领域,Reed-Solomon码是一种经常使用的编码方式,其基本思想是将数据分割成若干份,对每一部分分别进行编码,并将编码后的结果合并起来。在容灾存储中,数据的丢失往往是不可避免的,因此,如何将数据在丢失后重新获取回来,是一个非常重要的问题。Reed-Solomon码是一种能够将数据在丢失后重新获取回来的编码方式,它具有纠错能力,能够在数据丢失后自动进行纠错,从而保证数据的正确性。在容灾存储中,Reed-Solomon码的应用非常广泛,其编码和解码速度都非常快,能够大大提高容灾存储系统的性能和可靠性。
serena
2017/08/29
4.7K0
FEC 的介绍
顶会论文:纠删码存储系统中的投机性部分写技术
本文已被USENIX'17年度技术大会录用,此处为中文简译版。 阅读英文论文完整版请点击:Speculative Partial Writes in Erasure-Coded Systems 。 前言 多副本和纠删码(EC,Erasure Code)是存储系统中常见的两种数据可靠性方法。与多副本冗余不同,EC将m个原始数据块编码生成k个检验块,形成一个EC组,之后系统可最多容忍任意k个原始数据块或校验块损坏,都不会产生数据丢失。纠删码可将数据存储的冗余度降低50%以上,大大降低了存储成本,在许多大规模分
美团技术团队
2018/03/13
2.5K0
顶会论文:纠删码存储系统中的投机性部分写技术
如何在CDH6.0中使用纠删码
Fayson在前面的文章中介绍过《什么是HDFS的纠删码》,当时详细介绍了什么是纠删码,纠删码的实现原理,以及一些Benchmark的结果比较。
Fayson
2018/11/16
4.3K0
Erasure-Code-擦除码-3-极限篇
本文链接: [https://blog.openacid.com/storage/ec-3/]
drdrxp
2022/04/28
8090
Erasure-Code-擦除码-3-极限篇
OPPO数据湖统一存储技术实践
OPPO是一家智能终端制造公司,有着数亿的终端用户,每天产生了大量文本、图片、音视频等非结构化数据。在保障数据连通性、实时性以及数据安全治理要求的前提下,如何低成本、高效率地充分挖掘数据价值,成为了拥有海量数据的公司的一大难题。目前业界的流行解决方案是数据湖,本文介绍的OPPO自研的数据湖存储CBFS在很大程度上可解决目前的痛点。
从大数据到人工智能
2022/04/23
7070
OPPO数据湖统一存储技术实践
技术解码 | RSFEC原理分析
作者 | 蒋刚 审校 | 刘连响 ---- 今天向大家介绍下RSFEC的原理,它通过生成冗余数据来恢复丢失的信息,首先介绍下背景,之后重点介绍RSFEC如何计算冗余和恢复数据的,分为异或方式和矩阵方式,异或方式可以认为是矩阵方式的特殊形式,最后做下总结。 - 背景介绍 - RSFEC广泛应用于存储、通信、二维码等领域,比如RAID利用它生成冗余盘提升容错性,视频通话中利用它生成冗余数据对抗网络丢包,太空中远距离传输数据时也用到它,第三张图片是旅行者一号应用RSFEC将太空中拍摄的照片传回地
腾讯云音视频
2021/06/25
3.4K0
Erasure-Code-擦除码-2-实现篇
本文链接: [https://blog.openacid.com/storage/ec-2/]
drdrxp
2022/04/28
7390
Erasure-Code-擦除码-2-实现篇
世界最优秀的分布式文件系统架构演进之路
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
玄姐谈AGI
2020/02/13
8000
世界最优秀的分布式文件系统架构演进之路
相关推荐
分布式存储系统纠删码技术分享
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档