通過本文可以獲得如下知識:
① 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。此時把丟失的數據塊和其對應的生成矩陣的行去掉,然后用生成矩陣的逆矩陣乘以校驗塊和剩余的數據塊組成的矩陣。