在海量分散式儲存系統(如 AWS S3、Google Cloud Storage、Ceph、HDFS 3.0 與 MinIO)的世界中,資料的持久性(Durability)與硬體成本之間始終存在著一場劇烈的博弈。

在早期分散式檔案系統(如 HDFS 1.x/2.x)中,最直觀的容錯策略是多副本機制(Multi-way Replication),通常採用 3 副本策略。然而,3 副本意味著系統需要承擔高達 200% 的額外儲存成本膨脹(儲存開銷為 300%)。當資料規模來到 Exabyte(EB)級別時,多出 100% 的硬體與機房能耗支出便意味著數億美元的成本差距。

糾刪碼(Erasure Coding,簡稱 EC) 透過高等代數中的矩陣運算,將儲存開銷大幅壓縮至 120%~150%,同時提供遠高於 3 副本的極致容錯能力(高達 99.999999999% 的 11 個 9 持久性)。

本文將從數學本質、編解碼矩陣、故障重構、修復頻寬瓶頸到現代 LRC(Local Reconstruction Codes)演進,完整拆解 Erasure Coding 的分散式架構底層機制。


Erasure Coding 全鏈路架構全景圖

以下是基於 Reed-Solomon RS(4, 2) 配置的糾刪碼編碼、分散式分發與節點損壞重構全流程:

Erasure Coding (RS Code) 分散式儲存架構原理展示原始資料分塊 (k=4)、范德蒙矩陣編碼、同位校驗塊 (m=2)、分散式節點分發以及任選 k 塊解碼重構的完整流程。1. 原始物件與分塊Data Chunking原始檔案 (Object)例如:100 MB 檔案D1: Data Chunk 125 MB (Offset: 0~25M)D2: Data Chunk 225 MB (Offset: 25~50M)D3: Data Chunk 325 MB (Offset: 50~75M)D4: Data Chunk 425 MB (Offset: 75~100M)2. RS 矩陣編碼器RS(k=4, m=2) EncodingVandermonde Generator[ 1 0 0 0 ] (Identity D1)[ 0 1 0 0 ] (Identity D2)[ 0 0 1 0 ] (Identity D3)[ 0 0 0 1 ] (Identity D4)[ a b c d ] (Parity P1 in GF)[ e f g h ] (Parity P2 in GF)同位校驗生成 (Parity)P1 = a·D1 + b·D2 + c·D3 + d·D4P2 = e·D1 + f·D2 + g·D3 + h·D4儲存膨脹率對比• 3 副本: 300% (200% 膨脹)• RS(4,2): 150% (僅 50% 膨脹)3. 分散式節點儲存Fault Domain ShardingNode 1: Data Chunk D1Rack 1 / Zone A (25 MB)Node 2: Data Chunk D2Rack 2 / Zone A (25 MB)Node 3: ❌ 故障離線 (D3)磁區毀損 / 網路斷線Node 4: Data Chunk D4Rack 4 / Zone B (25 MB)Node 5: Parity P1Rack 5 / Zone C (25 MB)Node 6: Parity P2Rack 6 / Zone C (25 MB)4. 逆矩陣重構與解碼Data Reconstruction採集存活 k=4 塊• 讀取: D1, D2, D4, P1• 忽略毀損 Node 3• 構建 4x4 子矩陣 M'• 計算逆矩陣 (M')^-1• 求解還原 D3 數據降級讀取 (Degraded)• 即時在線即解即傳• 客戶端無感透明讀取• 後台異步修復寫入新節點容錯能力上限• 最多允許任意 m 塊故障• RS(4,2) 允許 2 台同時壞Erasure Coding (RS Code) 流程簡圖分塊 D1~D4 ➔ RS(4,2) 編碼生成 P1,P2 ➔ 6 個節點分散儲存 ➔ 任意 4 塊逆矩陣重構。1. 資料分塊與 RS(4,2) 編碼• 原始物件切分為 D1, D2, D3, D4 (k=4)• Vandermonde 矩陣計算同位塊 P1, P2 (m=2)• 總儲存開銷僅 150%(傳統 3 副本為 300%)• 節省 50% 儲存成本2. 分散式故障域分發• 6 個區塊分佈於不同機架 / 可用區• Node 1 (D1), Node 2 (D2), Node 4 (D4)• Node 5 (P1), Node 6 (P2)• Node 3 (D3) ❌ 節點硬碟損壞離線• 系統進入降級讀取(Degraded Read)模式3. 逆矩陣求逆解碼重構• 從存活節點並行讀取任意 k=4 塊• 讀取 D1, D2, D4, P1 (共 100 MB 網路頻寬)• 構造 4x4 子矩陣並求逆• 完美還原丟失的 D3 資料塊• 異步寫入新替換節點 Node 3'4. 修復頻寬與 LRC 局部優化• 缺點:修復 1 塊需讀取 k 塊(頻寬放大)• LRC (Local Reconstruction Codes) 引入局部校驗• 單節點故障僅需讀取 2~3 塊即可重構• 大幅降低跨交換機與跨 AZ 重建流量• AWS S3 / Azure 核心儲存標準演算法
圖 1:Erasure Coding (RS Code) 分散式儲存架構 — 范德蒙矩陣編碼、節點容錯與逆矩陣重構流程

1. 3 副本機制的極限與成本危機

在深入糾刪碼之前,我們必須先釐清傳統 3 副本機制的瓶頸所在。

1.1 儲存開銷與利用率

假設叢集需要儲存 10 PB 的原始資料:

  • 3 副本機制:實際需要採購 10 × 3 = 30 PB 的硬碟空間,儲存利用率僅有 33.3%。
  • RS(8, 4) 糾刪碼:將資料切為 8 個資料塊並生成 4 個校驗塊,總空間為 10 × (12 / 8) = 15 PB,儲存利用率高達 66.7%。
  • RS(10, 4) 糾刪碼:總空間僅需 14 PB,儲存利用率提升至 71.4%。
機制儲存開銷 (Storage)容錯上限 (Fault)儲存利用率
3-Way Replication300% (200% 額外)允許任意 2 台故障33.3%
RS(4, 2) EC150% (50% 額外)允許任意 2 台故障66.7%
RS(8, 4) EC150% (50% 額外)允許任意 4 台故障66.7%
RS(10, 4) EC140% (40% 額外)允許任意 4 台故障71.4%

1.2 持久性對比

在 3 副本架構下,若恰好同一個 Block 的 3 個複本所在的節點同時損壞,資料便永久丟失。而在 RS(10, 4) 架構中,系統可以容忍任意 4 個節點同時離線而保證資料零丟失,其資料持久性顯著優於 3 副本。


2. Reed-Solomon (RS) 碼核心數學原理

Erasure Coding 最普遍採用的演算法是 Reed-Solomon (RS) 碼。其核心理念可以抽象為:k 個元數據塊通過生成矩陣 G,計算出 m 個校驗塊,組成總共 n = k + m 個區塊;任選其中任意 k 個存活區塊,皆可透過逆矩陣運算精確還原全部原始資料。

2.1 范德蒙矩陣(Vandermonde Matrix)編碼

編碼過程使用一個 (k + m) × k 的生成矩陣 G。為了簡化讀取,通常將前 k 行設為單位矩陣(Identity Matrix I_k),後 m 行設為范德蒙矩陣或柯西矩陣(Cauchy Matrix):

Reed-Solomon RS(4, 2) 系統生成矩陣編碼示意圖展示 6x4 生成矩陣(前4行為單位矩陣,後2行為范德蒙係數)與原始資料向量相乘生成 D1-D4 原始塊與 P1-P2 校驗塊。生成矩陣 G (6 × 4)[ 1 0 0 0 ][ 0 1 0 0 ][ 0 0 1 0 ] / [ 0 0 0 1 ]單位矩陣 I_4 (Systematic Code)[ a b c d ] (Parity 1)[ e f g h ] (Parity 2)×[ D1 ][ D2 ][ D3 ][ D4 ]=編碼後 6 區塊輸出 (Output)[ D1, D2, D3, D4 ] ➔ 原始數據塊 (讀取零開銷)[ P1 ] = a·D1 + b·D2 + c·D3 + d·D4[ P2 ] = e·D1 + f·D2 + g·D3 + h·D4任選存活 4 塊皆可透過逆矩陣還原全量資料!

因為前 k 行是單位矩陣,所以輸出的前 k 個區塊直接就是原始資料塊(稱為 Systematic Code),客戶端在正常讀取時完全不需要進行解碼運算,直接讀取原始 Data Block 即可,CPU 消耗為零。

後續的 m 個校驗塊則由加權線性組合生成:

  • P1 = a · D1 + b · D2 + c · D3 + d · D4
  • P2 = e · D1 + f · D2 + g · D3 + h · D4

2.2 有限域(Galois Field,GF(2^8))運算

在計算機中,如果使用一般實數進行乘法和除法,會產生浮點數精度損失與數值溢出。RS 碼將所有加減乘除運算定義在有限伽羅瓦域(Galois Field,通常為 GF(2^8),即 1 個 Byte 0~255):

  • 加法與減法:在 GF(2^8) 中,加法與減法等價於位元異或運算(XOR)。
  • 乘法與除法:透過不可約多項式(如 x^8 + x^4 + x^3 + x^2 + 1)構建的指數表(Exp Table)與對數表(Log Table)進行查表計算,現代 CPU 則直接使用 Intel AVX-512 / ARM NEON 指令集進行硬體 SIMD 向量化加速。

3. 故障重構與逆矩陣求解

假設節點 3 發生硬體損壞,資料塊 D3 丟失。系統如何還原?

3.1 構建 k × k 存活子矩陣

客戶端或修復 Worker 從剩餘存活節點中任意選取 k = 4 個區塊,例如選取 D1, D2, D4, P1。

將生成矩陣 G 中對應這 4 個區塊的列取出,組成一個全新的 4 × 4 矩陣 G’:

[ G' ] * [ D1, D2, D3, D4 ]^T = [ D1, D2, D4, P1 ]^T

3.2 逆矩陣求解

由於范德蒙矩陣的任何 k × k 子矩陣都是滿秩(Full Rank)且非奇異的,因此 G’ 必定存在逆矩陣 (G’)^-1。

兩邊同時左乘 (G’)^-1:

[ D1, D2, D3, D4 ]^T = (G')^-1 * [ D1, D2, D4, P1 ]^T

透過高斯消去法或伴隨矩陣求出 (G’)^-1 後,將存活的 4 塊資料代入乘法運算,即可精準算出丟失的 D3。


4. 糾刪碼的核心挑戰:修復頻寬風暴(Repair Network Amplification)

儘管 Erasure Coding 大幅降低了儲存成本,但它在傳統架構下帶來了致命的副作用:網路修復放大效應(Network Traffic Amplification)。

4.1 修復 1 個 Block 的代價

  • 3 副本架構:當節點損壞丟失 1 個 100 MB 的 Block 時,修復節點只需從存活的另一個節點複製 100 MB 的資料,修復流量為 100 MB(1x)。
  • RS(10, 4) 糾刪碼:當丟失 1 個 100 MB 的 Block 時,修復節點必須跨網路從其他 10 個節點各拉取 100 MB 資料(共 1000 MB),在記憶體中解碼後再寫出 100 MB,修復網路頻寬放大了 10 倍(10x)!

在擁有數萬台伺服器的大型資料中心中,硬碟損壞是常態。如果每天有數百塊硬碟損毀,跨交換機(Top-of-Rack Switch)的修復流量會迅速塞滿機房骨幹網路,影響正常的業務讀寫。


5. 現代工業級優化:LRC 與降級讀取

為了解決 RS 碼的修復頻寬風暴,現代超大規模儲存系統引入了兩大關鍵優化:

5.1 Local Reconstruction Codes (LRC 局部修復碼)

微軟 Azure 與 AWS 在其底層儲存中廣泛採用了 LRC(局部修復碼) 技術。

LRC 在全域校驗塊(Global Parity)的基礎上,引入了局部校驗塊(Local Parity):

  • 例如 LRC(12, 2, 2):將 12 個資料塊分為 2 組(每組 6 塊),每組計算 1 個局部校驗塊 L1, L2,最後再對 12 塊計算 2 個全域校驗塊 G1, G2。
  • 單節點損毀:單一資料塊損壞時,只需在同組內讀取 6 個 Data Block + 1 個 Local Parity 即可完成修復,修復頻寬從 12x 降為 6x。
  • 多節點同時損毀:當同組內有多個節點損壞時,再退回使用全域校驗塊 G1, G2 進行完整解碼重構。

5.2 降級讀取(Degraded Read)與非同步重建分離

當用戶讀取請求命中損壞節點時,系統面臨兩種策略:

  1. 即時降級讀(On-demand Degraded Read):由接入閘道即時並行讀取 k 個存活塊,在記憶體中快速解碼後回傳給客戶端(延遲略有上升,約增加 10~30ms)。
  2. 非同步批次重建(Async Batch Reconstruction):後台 Worker 監控故障事件,排入低優先級隊列,利用離峰頻寬重建丟失區塊並寫入新節點,避免衝擊在線請求。

6. 工業級分散式儲存選型與實踐

儲存系統支援的 EC 模式核心特點
Ceph (RADOS)Jerasure / ISA-L (RS, LRC)CRUSH 演算法故障域感知映射
MinIOReed-Solomon (AVX-512 加速)每個 Object 獨立 EC 封裝
Apache HDFS 3.0RS(6,3), RS(10,4), XORStriped Block 條帶化儲存
AWS S3 / Azure Blob自研 LRC 矩陣優化跨 AZ 故障域隔離,11 個 9

6.1 實踐關鍵原則

  1. 小檔案不要做 EC:對於小於 1MB 的小檔案,切分為 k 塊會導致嚴重的中繼資料(Metadata)膨脹與小 I/O 隨機讀寫問題。通常對小檔案維持多副本,大於 64MB 的物件才啟用 EC。
  2. 故障域感知(Rack / Zone Awareness):k + m 個區塊必須嚴格分配在不同的機架(Rack)或不同的可用區(Availability Zone),防止單一機櫃斷電或交換機故障導致超過 m 個區塊同時失聯。
  3. 硬體 SIMD 指令加速:在軟體層面必須啟用 Intel ISA-L(Storage Acceleration Library)或 ARM NEON 組合語言優化,將矩陣乘法運算開銷降低到 CPU 總負載的 2% 以下。

總結

Erasure Coding 是現代分散式儲存架構跨越 PB 到 EB 規模的基石。它透過優雅的代數矩陣理論,打破了傳統 3 副本「高可靠必須付出 200% 儲存成本」的物理限制。

在架構設計中,理解 RS 碼的編解碼開銷、修復網路放大與 LRC 優化路徑,是打造高吞吐、低成本、極致可靠分散式儲存底座的核心能力。