前言
在Ceph和RAID存儲領域,RS糾刪碼扮演着重要的角色,糾刪碼是經典的時間換空間的案例,通過更多的CPU計算,降低低頻存儲數據的存儲空間占用。
糾刪碼原理
糾刪碼基於范德蒙德矩陣實現,核心公式如下所示(AD=E)

假設某些數據丟失,右式部分行丟失,變成E',則左式也相應去掉對應行,變成A'。

函數\(Inverse[A']\)代表A'的逆矩陣,I代表單位矩陣
\[Inverse[A']*A'*D=Inverse[A']*E' \]
\[I*D=Inverse[A']*E' \]
\[D=Inverse[A']*E' \]
Python實現
import numpy as np
# 備份數量
backup_up = 2
# 原始數據
data = np.array([1, 0, 0, 8, 6])
# 根據糾刪碼原理生成的數據
vander_data = np.concatenate((np.identity(len(data)), np.vander(data, 3).transpose()[::-1]), axis=0)
storage_data = vander_data.dot(data)
print('生成數據',storage_data)
# 模擬數據丟失
loss_data = np.concatenate((storage_data[0:3], storage_data[5:7]), axis=0)
print('丟失后數據', loss_data)
# 恢復數據
recover_data = np.linalg.inv(np.concatenate((vander_data[0:3], vander_data[5:7]), axis=0)).dot(loss_data)
print('恢復數據',recover_data)
基於Python的Numpy庫可以很容易地模擬糾刪碼數據恢復的流程。效果如下所示

伽羅華域優化
實際上,上述的Python代碼只是糾刪碼的最基礎版本,可以發現校驗數據大於原始數據,這樣就導致校驗數據需要更多的存儲位,並沒有很好的優化存儲空間。
在現實場景中,糾刪碼一般通過自定義的伽羅華域進行運算,保證位數在一定范圍內。伽羅華域\(GF(2^w)\)代表所有運算結果只能在\([0,2^w)\)之間。
伽羅華域的加法和減法為異或運算,乘法和除法需要基於生成多項式計算出gfilog表。\(GF(2^4)\)的gfilog表如下所示。

以8*9為例,計算過程如下所示,需要注意如果值大於\(2^w\),需要模\(2^w\)。
\[8*9=x^8 x^9=x^{17}=x^{17 \text{$\%$15}}=x^2=4 \]
更多優化
范德蒙德矩陣求逆矩陣的時間復雜度為\(O(N^3)\),柯西矩陣求逆矩陣的時間復雜度為\(O(N^2)\),因此可以采用柯西矩陣替代范德蒙德矩陣用於編碼運算。
