通过本文可以获得如下知识:
① XOR码、RS码的基本原理和恢复过程实例。
② 图解HDFS EC中block group(块组)的概念、图解striped layout(条带布局)和连续布局,以及它们的优缺点比较。用一个实例一步一步分析divideByteRangeIntoStripes方法生成的cells、ranges、striped数组。
③ HDFS EC的核心源码流程。
④ HDFS EC优势与劣势。
一、准备工作
在存储系统中,纠删码技术主要是通过利用纠删码算法将原始的数据进行编码得到校验,并将数据和校验一并存储起来,以达到容错的目的。
1.1 几个专业术语
Legacy coder: 遗留版本的Java RS码,起源于Facebook的HDFS-RAID项目。
ISA-L: 实现RS算法的英特尔存储加速库,为Intel指令集如SSE、AVX、AVX2和AVX-512提供性能优化。
ISA-L coder: 利用Intel ISA-L库的本地(native)RS编码器。
New Java coder: Reed-Solomon算法的纯Java实现(适用于没有所需CPU型号的系统)。这个编码器与ISA-L编码器兼容,还利用了JVM的自动向量化特性。
1.2 XOR码(异或码)
异或运算:相同为0,不同为1。
满足如下两个运算律:
交换律: B1⊕ B2 = B2⊕ B1
结合律: B1⊕ [B2⊕ B3] = [B1⊕ B2]⊕ B3
例如:
1 ⊕ 1 = 0;
0 ⊕ 0 = 0;
1 ⊕ 0 = 1;
0 ⊕ 1 = 1;
0 ⊕ 1 ⊕ 1 = 0;
现在我们假设下面式子中某一位丢失了。比如第一位0数据丢失了
0 ⊕ 1 ⊕ 1 = 0;
丢失后变成:
? ⊕ 1 ⊕ 1 = 0;
我们怎么恢复0这个数据呢?这时候可以利用异或的结合律了。
? ⊕ 1 ⊕ 1 = ? ⊕ (1 ⊕ 1) = ? ⊕ 0 = 0
因此缺失的数据为0。
但是异或码过于简单了,存在可容忍错误过少的问题。例如如果我们丢失了2位的数据,那就没法恢复了。而在实际的场景下,肯定会发生多个数据丢失的问题的,因此需要引入其他的纠删码来帮助我们解决这个问题。比如后面正文会介绍到的RS码等。
二、Reed Solomon Encoding(RS码)
RS码,中文名称里德所罗门编码。是EC编码中一种。本小节先介绍RS码的基本思想,然后通过一个运算实例帮助理解RS的工作原理。
RS码是存储系统较为常用的一种纠删码,它有两个参数 k和 m,记为RS(k,m)。k代表的是data cell数据块的数量,m代表的是parity cell块的数量,parity cell可理解为校验块,因为它是由数据块进行编码运算后产生的。
RS码的基本思想:
- 将k块原始的数据元素通过一定的编码计算,得到 m 块校验元素;
- 对于这k+m块元素,当其中任意的m块元素出错(包括数据和校验出错),均可以通过对应的重构算法恢复出原来的k块数据;
- 生成校验的过程被成为编码(encoding),恢复丢失数据块的过程被称为解码(decoding)。
如上图所示:
- k个数据块组成一个向量被乘上一个生成矩阵(Generator Matrix)GT(G的转置矩阵)从而得到一个码字(codeword)向量,该向量由k个数据块和m个校验块构成;
- 如果一个数据块丢失,可以用(GT)-1(G的转置矩阵的逆矩阵,这个需要一些线性代数的知识。两边同时左乘这个逆矩阵,就能将GT消掉)乘以码字向量来恢复出丢失的数据块;
- RS(k,m)最多可容忍m 个块(包括数据块和校验块)丢失。
RS码数据恢复实例:
我们以RS(5,3)为例来计算:
其中,1,5,7,5,5为数据块,23,77,289为范德蒙矩阵(可百度一下这个矩阵)生成的校验块。现在我们来看下,23, 77, 289这三个校验块到底能不能在丢失数据块的时候将数据恢复出来。
假设在一个极端情况下,五个数据块丢失了三个,也就是可以容忍的最大数量,比如,丢失了数据块的前三个数:1,5,7。此时把丢失的数据块和其对应的生成矩阵的行去掉,然后用生成矩阵的逆矩阵乘以校验块和剩余的数据块组成的矩阵。