Erasure Coding(纠删码)深入分析 转

时间:2022-08-30 13:30:14

1.前言

Swift升级到2.0大版本后宣称开始支持纠删码,这其实是一个很有意义的特性,主要是能够在一定程度上解决3副本空间浪费太多的问题。因为3副本这一点是swift推广的最大障碍之一,成本的增加吓退了不少潜在客户。这次的改进有望消除客户顾虑,拓展更多用户

http://www.openstack.org/blog/2014/07/openstack-swift-2-0-released-and-storage-policies-have-arrived/

而回到存储领域来看,数据冗余机制其实这几十年来没有太多进展,RAID,副本一直是当仁不让的最终选择。而近几年,尤其是规模较大的应用场景下,纠删码越来越多的出现在选择的视野范围,成为RAID,副本之外的第三种选择,因此也获得了越来越多的关注。

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

如果严格的区分,实际上按照误码控制的不同功能,可分为检错、纠错和纠删三种类型。检错码仅具备识别错码功能 而无纠正错码功能;纠错码不仅具备识别错码功能,同时具备纠正错码功能;纠删码则不仅具备识别错码和纠正错码的功能,而且当错码超过纠正范围时,还可把无法纠错的信息删除。

前面曾提到过适用场景通常是大规模部署,这是有其缘由的。从传统情况来看,RAID通常用在企业级环境里较多,在几台和十几台存储设备规模的IT系统中,一向是使用稳定可靠历经数十年磨砺的RAID技术。而在数据中心级的大规模部署中,RAID不再受欢迎,大部分的分布式系统都偏好副本模式,看重的是其高可靠性和读性能优化的特点(关于副本的讨论我之前写过一篇:为啥大家都喜欢3副本,是拍脑袋的吗?http://blog.sina.com.cn/s/blog_57f61b490101a8ca.html)。然而副本带来的成本压力实在是有些吃不消,这时候Erasure Code适时出现,以更低成本和更高技术含量提供近似可靠性这几点,就吸引到了众多分布式存储/云存储的厂商和用户。

2. 纠删码理论分析

纠删码常见的有三类,Reed-Solomen类,级联低密度纠删码和数字喷泉码,后面两种的实现原理细节和优劣这里就不深入了,这里只简单介绍下目前在存储行业应用的Reed-Solomen类纠删码。

从纠删码基本的形态来看,它是N个数据+M个校验的结构,其中数据和校验的N和M值都能够按照一定的规则设定。在1~M个数据块(数据或校验都行)损坏的情况下,整体数据仍然可以通过计算剩余数据块上面的数据得出,整体数据不会丢失,存储仍然是可用。

下面是纠删码的结构示意图。

Erasure Coding(纠删码)深入分析 转

从图中其实可以看出,纠删码和大家熟悉的RAID技术看起来是有些类似的,一个条带(Stripe)是由多个数据块(strip)构成,分为数据块和校验块。但与RAID5/RAID6不同的是,纠删码功能上来看最大的区分特点是校验和数据的比例按N+M可调整,并且校验块数量不再受限于两个,典型的如12+4,6+3等等。

校验块和数据之间是如何建立关系的呢?通信理论(鄙人专业)告诉我们纠删码是属于分组线性编码,编码过程用到的数学理论并不高深,数学关系其实是是矩阵乘法。具体来说是用编码矩阵和分块数据做乘法从而得到校验块,如下:

Erasure Coding(纠删码)深入分析 转

在建立完关联后,由于矩阵运算是可逆,系统就具备了容忍最大M个失效的能力。

(微软曾在一次演示中用两数之和等于第三个数来解释,但仅是为了方便理解,在真正实践的多校验情况下,还是使用编码矩阵的。)

https://www.usenix.org/conference/atc12/technical-sessions/presentation/huang

3. 纠删码的演化,RS->LRC

纠删码通过技术含量较高的算法,提供和副本近似的可靠性,同时减小了额外所需冗余设备的数量,从而提高了存储设备的利用率。但纠删码所带来的额外负担主要是计算量和数倍的网络负载,优缺点都相当明显。尤其是在出现硬盘故障后,重建数据非常耗CPU,而且计算一个数据块需要通过网络读出N倍的数据并传输,所以网络负载也有数倍甚至10数倍的增加。

整体来看,若采用纠删码技术,你能够得到了希望的容错能力和存储资源利用率,但是需要接受一定的数据重建代价,两者间做一个平衡。

难道事情就这个样子了吗?有没有优化改善的空间呢?答案是“有”。

如果仔细分析故障出现的情况,你将很容易发现两个特征:

特征一:所有的故障都将导致同样的重建代价,无论是一个盘,还是M个盘

特征二:单个磁盘故障的几率远远大于多个磁盘同时故障的几率,通常在90%以上

因此,优化的思路自然聚集到更容易出现的单个磁盘故障上来,如何更有效的处理这种概率较大的事件呢,直接出现的对策就是分组,把单个磁盘故障影响范围缩小到各个组内部,出坏盘故障时,该组内部解决,在恢复过程中读组内更少的盘,跑更少的网络流量,从而减小对全局的影响。

LRCLocally Repairable Codes,我理解为局部校验编码,其核心思想为:将校验块(parity block)分为全局校验块(global parity)、局部校验块(local reconstruction parity),故障恢复时分组计算。

Erasure Coding(纠删码)深入分析 转

微软Azure的云存储(Windows Azure Storage)实现为例,它采用LRC(12,2,2)编码,将12个数据块为一组编码,并进一步将这12个数据块平均分为2个本地组, 每个本地组包括6个数据块,并分别计算出一个local parity,之后把所有12个数据块计算出2个global parities。

当发生任何一个数据块错误时,只需用本地组内的数据和校验块用于计算,即可恢复出原始数据。而恢复代价(通过网络传输的数据块数量)就由传统RS(12,4)编码的12,变为6,恢复过程的网络I/O开销减半,同时空间冗余率保持不变,仍为(12+2+2)/12 = 1.33

微软在介绍中有过一张图来对RS和LRC进行对比,我觉得描述的非常清楚,这里借用一下
Erasure Coding(纠删码)深入分析 转

图中,蓝色是LRC,红色是RS,可以很清楚的看到,使用LRC的编码方式后,虽然空间利用率(横轴)并没有提高,但是重建代价(纵轴)却有明显的改善。考虑到分布式系统里故障是一个常态,重建代价的降低和局部化就是非常有价值的一个技术改进了。

另外,有一点要特别注意,LRC并不是100%不丢数据的,4个块坏掉的情况下,只有86%的几率能找回数据,从可靠性排序来说,RS12+4 》 LRC12+2+2 》RS6+3。

但综合来说,LRC还是很有竞争力的技术,目前,Microsoft、Google、Facebook、Amazon、淘宝(TFS)都已经在自己的产品中采用了Erasure Code,并且大多都从经典RS转向LRC。虽然具体实现,但基本原理都是LRC的组内校验+全局校验。

4. 纠删码的实际案例

我们可以具体来看看在业界,各家优化版纠删码的实现是怎么样的。

Google RS(6,3) in GFS II (Colossus),

Google在04年发布GFS的经典论文后,09年开始开发第二代GFS(Colossus),它采用了最基本的RS(6,3)编码,将一个待编码数据单元(Data Unit)分为6个数据块, 再添加3个parity block,最多可容包括parity blocks在内的任意3个数据块错误。

Erasure Coding(纠删码)深入分析 转

数据恢复的网络I/O开销为:恢复任何一个数据块需要6次I/O,通过网络传输6个数据block,存储的空间冗余率 为(6+3)/6 = 1.5

由于Google的信息能查阅到的有限,我没找到近两年的情况介绍,但相信Google这样一家技术型的公司,应当也有类似的演进后的纠删码技术,不会止步于5年前的RS标准码。

Facebook:从RS(10,4)LRC10,6,5

Facebook早期在HDFS RAID中采用的编码方式RS(10,4)

Erasure Coding(纠删码)深入分析 转

如上图所示。将每个待编码的数据均分为10个数据块, 后面添加4个校验的parity校验块。这种RS编码方式的空间冗余率为(10+4)/10 = 1.4x,发生任何一个数据块错误的恢复代价为10,即发生任意一个块错误需要10次I/O操作,从网络传输的数据量为10个数据块。

同样为减少数据恢复的网络I/O代价, FaceBook在13年和加州大学共同发表了论文, XORing Elephants: Novel Erasure Code for Big Data,并把这一成果用在“进阶版HDFS”上

其LRC编码方法如下:

Erasure Coding(纠删码)深入分析 转

除了在原先的10个数据块之后添加4个校验块外,还将10个数据块均分为2组,每组单独计算出一个局部校验块(Parity),将数据恢复代价由原来的10降低为5.即恢复任何一个数据块错误只需要进行5次网络I/O,从网络传输5个数据块。此种编码方式的空间冗余率 为(10+4+2)/10 = 1.6。

4. 结论

相对副本而言,纠删码(erasure code)的编码技术无疑对存储空间利用率带来很大提升,但由于引入额外的编码、解码运算,对分布式系统的计算能力和网络都有一定额外的要求,简单的理解就是硬件性能要升级,网络环境也得要升级,升级的代价在目前阶段还是一笔不小的预算。

而由于性能损失的原因,用在本身压力已经很大,很“热”的在线存储系统明显不是很合适,所以目前大多数系统还是把erasure code用于冷数据的离线处理阶段。

LRC编码由于减少了网络I/O传输的数据量,参与数据恢复运算的数据量和重建时间都基本上能够缩短一倍,但却是以可靠性和空间利用率的一定牺牲为代价的。如何更加有效的实现还是要结合实际项目需求,综合考量,有更多的实际工作要做。

Erasure Coding(纠删码)深入分析 转的更多相关文章

  1. 应用AI芯片加速 Hadoop 3.0 纠删码的计算性能

    本文由云+社区发表 做为大数据生态系统中最重要的底层存储文件系统HDFS,为了保证系统的可靠性,HDFS通过多副本的冗余来防止数据的丢失.通常,HDFS中每一份数据都设置两个副本,这也使得存储利用率仅 ...

  2. Erasure Coding(纠删码)深入分析

    http://blog.sina.com.cn/s/blog_57f61b490102viq9.html 1.前言 Swift升级到2.0大版本后宣称开始支持纠删码,这其实是一个很有意义的特性,主要是 ...

  3. Hadoop hdfs副本存储和纠删码(Erasure Coding)存储优缺点

    body { margin: 0 auto; font: 13px / 1 Helvetica, Arial, sans-serif; color: rgba(68, 68, 68, 1); padd ...

  4. [转]Reed Solomon纠删码

    [转]Reed Solomon纠删码    http://peterylh.blog.163.com/blog/static/12033201371375050233/     纠删码是存储领域常用的 ...

  5. ceph之纠删码

    转自:http://m.blog.csdn.net/blog/skdkjxy/45695355 一.概述 按照误码控制的不同功能,可分为检错码.纠错码和纠删码等. 检错码仅具备识别错码功能 而无纠正错 ...

  6. MICS:副本和纠删码混合存储系统

    摘要 云存储系统的三个指标: 高可靠性,低存储开销,高读写性能. 这三个指标是没有办法同一时候满足的,许多时候须要进行tradeoff. 副本系统和纠删码是两种在存储系统中广泛使用的策略,它们在保证高 ...

  7. 浅谈Ceph纠删码

    目  录第1章 引言 1.1 文档说明 1.2 参考文档 第2章 纠删码概念和原理 2.1 概念 2.2 原理 第3章 CEPH纠删码介绍 3.1 CEPH纠删码用途 3.2 CEPH纠删码库 3.3 ...

  8. Ceph的正确玩法之Ceph纠删码理论与实践

    http://blog.itpub.net/31545808/viewspace-2637083/ 注意空格,有的命令少空格 随着云计算业务的快速发展,国内外云计算企业的专利之争也愈发激烈.在云计算这 ...

  9. 详解Hadoop3.x新特性功能-HDFS纠删码

    文章首发于微信公众号:五分钟学大数据 EC介绍 ​Erasure Coding 简称EC,中文名:纠删码 EC(纠删码)是一种编码技术,在HDFS之前,这种编码技术在廉价磁盘冗余阵列(RAID)中应用 ...

随机推荐

  1. 把文件打成zip或然rar下载 (详询请加qq:2085920154)

    //文件打包下载 public static HttpServletResponse downLoadFiles(List<File> files, HttpServletRequest ...

  2. socket&period;io,环境搭建 &amp&semi; Hello world

    原文:http://www.cnblogs.com/xiezhengcai/p/3955827.html socket.io 一个与服务器实时通信的工具,它与原生的webSocket相比,具有更可靠. ...

  3. 使用Netty绑定一个端口如何分辨出多种类型的DTU的注册包

    一.  背景 项目需要使用Netty和DTU(无线数据传输模块)通信,需要接入多种类型的DTU,每种dtu连接上来之后都首先会发送一个注册报文.需要解析该注册报文来实现: 1. 分辨出是哪种类型的dt ...

  4. uitabbarcontroller中 在设置tab bar item的image属性后不显示问题

    开始使用ios中的UITabBarController,在给Tab Bar Item设置自定义图片的时候,遇到了问题 按照如下配置: 出来的结果确是: 实际上test24.png应该是: 纠结了很久, ...

  5. BZOJ 2393 Cirno的完美算数教室

    就是爆搜嘛. 先从大到小排个序能减去dfs树上很大的一部分.这个技巧要掌握. #include<iostream> #include<cstdio> #include<c ...

  6. net windows Kafka

    net windows Kafka 安装与使用入门(入门笔记) 完整解决方案请参考: Setting Up and Running Apache Kafka on Windows OS   在环境搭建 ...

  7. 【vue】vue &plus;element 搭建项目,vuex中的store使用

    概述: 每一个 Vuex 应用的核心就是 store(仓库).“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state).Vuex 和单纯的全局对象有以下两点不同: Vuex 的 ...

  8. oldriver

    功能: 1:数据详情:统计商家所关联邮箱的商家店铺的当天或者最近一周,最近一个月的订单情况,sku,order,value,回评率数据在具体哪个国家的销售情况. 增强版提供更丰富的数据详情和自定义功能 ...

  9. 3ds max学习笔记(九)-- 实例操作&lpar;路径阵列&rpar;

    栅栏 路径阵列也叫间隔工具,将选择的物体沿指定的路径进行复制.实现物体在路径上的饿均匀分布. 选择需要分布的物体对象,在视图中绘制二维图形做为路径线条. 1.选择线条,制作路径 2.选择需要分布的物体 ...

  10. python&lowbar;paramiko

    目录: paramiko模块介绍 paramiko模块安装 paramiko模块使用 一.paramiko模块介绍 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件 ...