Erasure Coding

Posted OshynSong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Erasure Coding相关的知识,希望对你有一定的参考价值。

1. 介绍

Erasure Code可以认为是RAID的通式,任何RAID都可以转换为特定的erasure code。在传统的RAID中,仅支持少量的磁盘分布,当系统中存在多个分发点和多节点时,RAID将无法满足需求。比如RAID5只支持一个盘失效,即使是RAID6也仅支持两个盘失效,所以支持多个盘失效的算法也就是erasure code是解决这一问题的办法。(Erasure Code作为可有效提升存储效率、安全性和便捷性的新兴存储技术)

定义:erasure code是一种技术,它可以将n份原始数据,增加m份数据(用来存储erasure编码),并能通过n+m份中的任意n份数据,还原为原始数据。定义中包含了encode和decode两个过程,将原始的n份数据变为n+m份是encode,之后这n+m份数据可存放在不同的device上,如果有任意小于m份的数据失效,仍然能通过剩下的数据还原出来。也就是说,通常n+m的erasure编码,能容m块数据故障的场景,这时候的存储成本是1+m/n,通常m<n。因此,通过erasure编码,我们能够把副本数降到1.x。
存储领域,数据冗余机制其实这几十年来没有太多进展,RAID,副本一直是当仁不让的最终选择。而近几年,尤其是规模较大的应用场景下,纠删码越来越多的出现在选择的视野范围,成为RAID,副本之外的第三种选择,因此也获得了越来越多的关注。

纠删码(Erasure Code)本身是一种编码容错技术,最早是在通信行业解决部分数据在传输中损耗的问题,它的基本原理是把传输的信号分段,加入一定的校验再让各段间发生一定的联系,即使在传输过程中丢失掉部分信号,接收端仍然能通过算法把完整的信息计算出来。

如果严格的区分,实际上按照误码控制的不同功能,可分为检错、纠错和纠删三种类型:

  • 检错码仅具备识别错码功能 而无纠正错码功能
  • 纠错码不仅具备识别错码功能,同时具备纠正错码功能
  • 纠删码则不仅具备识别错码和纠正错码的功能,而且当错码超过纠正范围时,还可把无法纠错的信息删除

2. 应用领域

凡是需要通过冗余来进行高可用的场景。但总体来说,主要运用于存储和数字编码领域。

2.1 阵列

如果磁盘阵列需要使用高级特性,比如需要能够容错两个磁盘失效(RAID6),那么可以用n+2的模式;如果想容错4个磁盘失效,则可使用n+4的模式。

2.2 云存储

erasure code是云存储的核心技术,最初诸如hadoop, GFS,CEPH等都采用的是n-way replication来做冗余,但是这样会带来极大的成本开销,因此几乎各大公司都在用erasure code替代n-way replication,之后我还会简要介绍一下具体他们使用的模式。

2.3 P2P领域

erasure code 的理论起码也有20年的历史了,但真正实践可能也就最近几年的时间,在P2P领域,动态的分布和智能的容错,特别是对短暂失效是非常关键的。以往的算法或多或少都有点山寨的感觉,而借助erasure code之后,将会使P2P的算法更具有数学的严谨性。

2.4 数字编码

erasure code本身就是出自编码理论,所以在这一块具有先天的优势。

纠删码常见的有三类,Reed-Solomen类(RS纠删码),级联低密度纠删码和数字喷泉码。目前在存储行业应用的主要是Reed-Solomen类纠删码。
从纠删码基本的形态来看,它是N个数据+M个校验的结构,其中数据和校验的N和M值都能够按照一定的规则设定。在1~M个数据块(数据或校验都行)损坏的情况下,整体数据仍然可以通过计算剩余数据块上面的数据得出,整体数据不会丢失,存储仍然是可用。

3. 原理

RS codes定义了一个(n + m) * n的分发矩阵(Distribution Matrix) ,如下图。原始数据为D1到D5,分发矩阵B。

编码过程就是上述两个矩阵相乘的结果,如下图:

因此得到了原始数据和编码数据一共n + m份,只要丢失数据份数不超过m,就可以通过矩阵运算求出所有原始数据,并可以继续求出丢失的数据。

4. 关键问题

4.1 编码矩阵选取

由于丢失后需要求解逆矩阵进行解码,因此必须要使用可逆的矩阵与单位矩阵进行构建。

目前开源实现中Jerasure库用的是范德蒙矩阵,Intel EC提供了范德蒙矩阵和柯西矩阵的实现。其中范德蒙矩阵的定义如下:

4.2 开源实现

  1. Jerasure库
    http://jerasure.org/

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

5. 工程实践

  1. 编码
    在创建数据块以及数据块远远未写满的情况下,使用副本策略做数据容错。当若干数据块(比如k个数据块)都基本写满,则禁止对这些数据块做写(包括修改、删除)等操作。此时进行编码,当编码成功时,删除冗余的数据块副本。此时就从副本策略变成纠删码策略。
  2. 解码
    a)一个线程定期扫描数据,比如对数据块和校验块做crc校验,如果发现有数据块或者校验块失效,则启动恢复线程。
    b)恢复线程先根据EC组现有的数据情况,从远程或本地获取必要的数据进行解码,恢复失效数据。

以上是关于Erasure Coding的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop Erasure Coding结构分析

【HDFS】超详细讲解Erasure Coding-- EC架构及图解相关核心代码。

java类型擦除(Java Type Erasure Mechanism)

erasure code

Boost.Type_erasure:成员函数返回_self

Erasure的《If I Could》 歌词