副本机制的利弊
HDFS是一个高吞吐、高容错的分布式文件系统,但是 HDFS 在保证高容错的同时也带来了高昂的存储成本,比如有 5T的数据存储在 HDFS 上,按照 HDFS 的默认 3 副本机制,将会占用 15T 的存储空间。
那么有没有一种能达到和副本机制相同的容错能力,但是能大幅度降低存储成本的机制呢?那就是在 HDFS 3.x 版本引入的纠删码机制。
纠删码(Erasure Coding 简称 EC)简介
EC(纠删码)是一种编码技术,在 HDFS 之前,这种编码技术在廉价磁盘冗余阵列(RAID)中应用最广泛,RAID 通过条带化技术实现 EC,条带化技术就是一种自动将 I/O 的负载均衡到多个物理磁盘上的技术,原理就是将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去,这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突(当多个进程同时访问一个磁盘时,可能会出现磁盘冲突),而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能。
纠删码(EC)在 HDFS 中的工作机制
在HDFS中,把连续的数据分成很多的小部分称为条带化单元,对于原始数据单元的每个条带单元,都会计算并存储一定数量的奇偶检验单元,计算的过程称为编码,可以通过基于剩余数据和奇偶校验单元的解码计算来恢复任何条带化单元上的错误。
HDFS 数据冗余存储策略
HDFS的存储策略是副本机制,这种存储方式使得数据存储的安全性得到提高,但同时也带来了额外的开销,HDFS默认的 3 副本方案在存储空间和其他资源(如网络带宽)上有200%的额外开销,但是对于I/O活动相对较低的数据,在正常期间很少访问其他块副本,但是仍然消耗与第一个副本相同的资源量。
因此,HDFS 3.x 版本一个重大改进就是使用纠删码(EC)代替副本机制,纠删码技术提供了与副本机制相同的容错能力,而存储空间却少得多。在典型的纠删码(EC)设置中,存储开销不超过50%。
EC 算法实现原理
EC 的实现算法有很多种,较为常见的一种算法是Reed-Solomon(RS),它有两个参数,记为RS(k,m)
,k 表示数据块,m 表示校验块,有多少个校验块就最多可容忍多少个块(包括数据块和校验块)丢失,具体原理通过如下例子解释:
我们使用RS(3,2)
,表示使用 3 个原始数据块,2 个校验块。
例:由RS(3,2)
可求出它的生成矩阵 GT,和 7、8、9 三个原始数据块 Data,通过矩阵乘法,计算出来两个校验数据块 50、122。这时原始数据加上校验数据,一共五个数据块:7、8、9、50、122,可以任意丢两个,然后通过算法进行恢复,矩阵乘法如下图所示:
GT 是生成矩阵,RS(k,m) 的生成矩阵就是 m 行 k 列的矩阵;
Data 代表原始数据,7,8,9代表原始数据块;
Parity 代表校验数据,50,122代表校验数据块。
所以3个原始数据块,如果使用2个校验块,EC编码总共占用5个数据块的磁盘空间,与2副本机制占用6个数据块的磁盘空间容错能力相当。
纠删码的应用场景
将 EC 技术集成进 HDFS 可以提高存储效率,同时仍提供与传统的基于副本的HDFS部署类似的数据持久性。例如,一个具有6个块的3副本文件将消耗 6 * 3 = 18 个磁盘空间。但是,使用EC(6个数据,3个校验)部署时,它将仅消耗9个磁盘空间块。
但是 EC 在编码过程及数据重建期间会大量的使用 CPU 资源,并且数据大部分是执行远程读取,所以还会有大量的网络开销。
所以,对于CPU资源紧张且存储成本较低的情况下,可以采用副本机制存储数据,对于CPU资源有剩余且存储成本较高的情况下,可以采用EC机制存储数据。
EC在HDFS的架构
HDFS 是直接使用 Online EC
(以EC格式写入数据),避免了转换阶段并节省了存储空间。Online EC
还通过并行利用多个磁盘主轴来增强顺序I/O
性能。在具有高端网络的群集中,这尤其理想。其次,它自然地将一个小文件分发到多个DataNode,而无需将多个文件捆绑到一个编码组中。这极大地简化了文件操作,例如删除,磁盘配额以及namespaces之间的迁移。
在一般 HDFS 集群中,小文件可占总存储消耗的 3/4 以上,为了更好的支持小文件,HDFS 目前支持条形布局(Striping Layout)的EC方案,而 HDFS 连续布局(Contiguous Layout)方案正在开发中。
条形布局
优点:
- 客户端缓存数据较少;
- 无论文件大小都适用。
缺点:
- 会影响一些位置敏感任务的性能,因为原先在一个节点上的块被分散到了多个不同的节点上;
- 和多副本存储策略转换比较麻烦。
连续布局
优点:
- 容易实现;
- 方便和多副本存储策略进行转换。
缺点:
- 需要客户端缓存足够的数据块;
- 不适合存储小文件。
传统模式下 HDFS 中文件的基本构成单位是block
,而 EC 模式下文件的基本构成单位是block group
。以RS(3,2)为例,每个block group
包含3个数据块,2个校验块。