糾刪碼學習筆記


本Summary以Erasure Codes for Storage Systems Summary的內容為主,補充了部分關於\(GF(2^w)\)域上的計算、RAID系統的分類等相關內容。關於糾刪碼的相關知識概述可參考存儲系統中的糾刪碼-綜述

簡單糾刪碼示例

糾刪碼:與糾錯碼、檢錯碼類似,均為線性分組碼,通過編碼可以在有限損失的前提下恢復丟失的數據。

相關參數

以磁盤做為單位存儲設備的存儲系統中,有以下參數說明:

  • n : 存儲系統中磁盤總數
  • k : 原始數據盤個數或恢復數據需要的磁盤
  • m : 校驗盤個數\(m=n-k\)

編碼策略編碼k個數據盤,得到m個校驗盤,保證丟失若干個磁盤可以恢復出丟失磁盤數據,編碼效率\(R = \frac{k}{m}\)(磁盤可以推廣為數據塊或者任意存儲節點)。

基本操作

屏幕快照 2017-06-05 15.49.51

假設每個磁盤存儲w比特數據,設\(d_0,\cdots,d_{k-1}\)是存儲在k個數據磁盤上的數據,\(c_0,\cdots,c_{m-1}\)是存儲在m個編碼盤上的編碼。編碼定義為數據的線性組合:

\(c_0 = a(0,0)d_0 + \cdots + a(0, k-1)d_{k-1} \)
\(c_1 = a(1,0)d_0 + \cdots +a(1,k-1)d_{k-1}\)
\(\cdots \cdots\)
\(c_{m-1} = a(m-1,0)d_0 + \cdots + a(m-1,k-1)d_{k-1}\)

編碼只需要乘法和加法(\(w=1\)時加法指模2加/異或、乘法指二進制與運算),解碼需要用高斯消除或矩陣求逆求的方法解一組線性方程。

譯碼准則:最小差錯概率譯碼、最大似然譯碼

以上計算建立在\(GF(2^w)\)上,這里的w值一般選取2的冪,較為流行的值有\(w=1\)(計算簡單)\(w=8\)(一個字節)w值越大,糾刪碼越豐富,但隨w值增大,在伽羅瓦域上的計算復雜度不斷提高。

\(GF(2^w)\)擴展域上的計算

加法、減法

假設\(A(x),B(x) \in GF(2^w)\),求和結果為\(C(x)\)。
\[C(x) = A(x) + B(x) = \sum\limits_{i=0}^{w-1}c_i x^i ,\quad c_i \equiv a_i + b_i mod 2 \]

乘法

假設\(A(x),B(x) \in GF(2^w)\),且
\[P(x) = \sum\limits_{i=0}^{w-1}p_i x^i ,\quad p_i \in GF(2)\]
是一個不可約多項式。兩個元素的乘法運算定義為:
\[C(x)=A(x)\cdot B(x) mod P(x)\]

求逆

在乘法中定義的\(P(x)\)基礎上,任一非零元\(A \in GF(2^w)\)的逆元定義為:
\[A^{-1}(x)\cdot A(x) \equiv 1 mod P(x)\]

最大距離可分碼(MDS)

一個\((n, n-r, r+1)\)碼稱為最大距離可分(Maximum Distance Separable, MDS)碼。一個MDS碼是冗余度為r,最小距離等於r+1的線性碼。(實現最佳容錯能力)

數據塊大小和條帶(stripe)

數據塊大小是數據塊進行編碼計算時,數據分塊的大小。在不同的存儲系統中數據塊大小不同,在RAID存儲系統中,常見的分塊大小是4KB~128KB,在分布式存儲系統中數據塊較大,一般為64MB大小。

條帶是糾錯編碼存儲一次性讀入或寫入數據的大小,在系統碼中,一個條帶往往包含了k個原始數據塊和m個校驗塊。
屏幕快照 2017-06-05 15.50.19

上圖左側,其中\(n=4\)個磁盤中的每個磁盤包含相同比例的數據和編碼條帶。
上圖右側,包含\(n=8\)個磁盤,但每個條帶由三條數據條帶和一條編碼條帶組成,條帶的分配是唯一的區別。因此,擦除碼可以與圖的左側相同。(Panasas使用這種方法來允許靈活的塊分配,並允許將額外的磁盤無縫地添加到存儲系統)

RAID

更多內容可以參考RAID技術規范中相關的內容,講解較為詳細。

RAID技術

RAID簡介

冗余磁盤陣列技術最初的研制目的是為了組合小的廉價磁盤來代替大的昂貴磁盤,以降低大批量數據存儲的費用,同時也希望采用冗余信息的方式,使得磁盤失效時不會使對數據的訪問受損失,從而開發出一定水平的數據保護技術,並且能適當的提升數據傳輸速度。

RAID規范

主要包含\(RAID 0~RAID 7\)等數個規范,它們的側重點各不相同,常見的規范有如下幾種:

RAID 0

實現需要至少兩塊磁盤,沒有差錯控制、數據分布於不同磁盤上,數據吞吐能力強。設磁盤數為n,則讀些速度均提高為單個磁盤的n倍。

RAID 1

采用鏡象結構,用n個磁盤形成n份完整備份,安全性高,讀寫速度相對單個磁盤沒有優化,在某個磁盤故障后可從其他磁盤恢復,同時應當及時更新損壞的磁盤。

RAID 2, 3

RAID 2使用漢明碼校驗,具有檢錯、糾錯能力;
RAID 3使用奇偶校驗碼,具有檢錯能力但不可糾錯。

RAID 4, 5

RAID 4和RAID 5使用相同的簡單擦除代碼,但具有不同的條帶布局。在這里,糾刪碼是一種MDS碼,其中\(m = 1\),\(w = 1\),唯一的編碼位被標記為p,它是所有數據位的異或:
\[p = d0⊕d1⊕...⊕dk-1\]
當任何位被擦除時,它可能被解碼為幸存的位異或。
RAID 4構成方式如下所示,每個磁盤身份固定,有一個磁盤p專用於編碼。
屏幕快照 2017-06-05 15.51.42

RAID 5構成方式如下所示,磁盤的身份在各個條帶中輪轉,每個磁盤都保存有數據和編碼,系統更加平衡。
屏幕快照 2017-06-05 15.50.58

RAID 6

添加一個磁盤(Q)到RAID-4/5系統中,該系統使用6個磁盤進行存儲。使用一個(6,2)MDS碼。以\(w=8\)為例,通過以下算法進行計算:

\[p = d_0 \oplus d_1 \oplus \cdots \oplus d_{k-1}\]

\[q = d_0 \oplus 2(d_1)\oplus \cdots \oplus 2^{k-1}(d_{k-1})\]

其中,由於伽羅瓦域中加法相當於異或操作,因此P盤的糾錯碼相當於RAID-4/5,同時由於:
\[q = 2(2(\cdots 2(2d_{k-1}\oplus d_{k-2})\cdots)\oplus d_1)\oplus d_0\]
所以Q盤僅可以使用加法和乘法進行計算。

編碼示例

Reed-Solomon Codes(RS碼)

RS碼是當且僅當\(n \leqslant 2^w\)時存在的MDS碼。例如,存儲系統包含256個或更少的磁盤,可以在\(GF(2^8)\)中定義一種計算。有多種方式來定義\(a(i,j)\)系數。

最簡單是“Cauchy”結構:在\(GF(2^w)\)中選擇n個不同的數字,並將它們分成兩組X和Y,使得X具有m個元素,Y具有k個元素。計算糾刪碼系數:
\[a(i,j) = \frac{1}{x_i \oplus y_j}\]

Array Codes(陣列碼)

  • 避免伽羅瓦域計算
  • 僅通過異或運算實現糾錯碼

編碼字節是數據字節的線性組合。

知名方案:

  • 用於RAID-6的RDP,EVENODD,Blaum-Roth和Liberation-codes。

  • 用於\(m = 3\)的STAR陣列碼;

  • 用於任意\(k\)和\(m\)值的Cauchy Reed-Solomon,通用EVENODD、通用RDP。

RAID 6示例

使用RDP陣列碼的實現中,\(k = 4,m = 2,n = k + m = 6,r = 4,w = 1\)。如下圖所示,灰線描繪了P盤的編碼方程。其他的線描述了Q盤的編碼方程。

屏幕快照 2017-06-05 15.52.09

對存儲系統的改進成果

恢復時減少磁盤I/O消耗

當使用簡單糾刪碼且單個磁盤發生故障時,恢復其內容需要從幸存的磁盤讀取\(k-1\)個條帶,以計算故障磁盤上的每個條帶。

使用陣列代碼,可以顯着減少從幸存的磁盤讀取的數據量。
屏幕快照 2017-06-05 15.52.28

如上圖所示的例子中(使用RDP糾刪碼),磁盤\(D_0\)損壞時,若使用簡單糾刪碼,恢復將等效於僅從P驅動器進行解碼,必須從幸存的磁盤讀取16bit; 但由於RDP的結構,通過從幸存的磁盤讀取12bit來恢復\(D_0\)。這種方法意味着恢復時可以減少25%的磁盤I/O操作。

再生編碼

再生編碼可以在使用糾刪碼的存儲系統中減少其恢復時占用的網絡I/O。當一個或多個存儲節點發生故障時,系統可以使用保存其先前內容的節點或通過糾刪碼保存了等效內容的節點來進行替換。

非MDS糾刪碼

由於非MDS碼不能應對m個節點故障的所有可能情況,所以需要添加額外的存儲設備來滿足m個磁盤損壞時數據恢復的需求。但同時可以帶來顯著的性能改進。是一種利用冗余存儲空間換取恢復性能的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM