把一個文件放進磁盤很難嗎?不難,放進去就是了。算法
那麼若是是特別重要的文件呢?也不難,多放幾份就是了。spa
還記得怎麼對待畢業論文的嗎,電腦裏存一份,U盤裏存一份,網盤裏再存一份,甚至好幾個網盤裏都存一份。心裏戰戰兢兢,生怕幾個月的努力(並無。。。)付諸東流。這,就是副本存儲。code
假設咱們的存儲是以三副本方式進行的話,咱們能夠計算出實際利用率是一個很低很低的值,33.3%。那麼有沒有什麼更好的辦法呢,有,就是糾刪碼的方案。數學
利用糾刪碼儲存文件,一共分三步:原理
把一個文件均分爲K個數據塊擴展
將這K個數據塊經過必定的方式聯繫起來生成M個校驗塊方法
當某幾個數據塊丟失時,利用校驗塊從新計算出丟失的數據塊im
以K,M取值爲五、3爲例,能夠得出糾刪碼方案的利用率達到了5/8,62.5。在一樣能夠容忍丟失三個數據塊的狀況下,糾刪碼方案比副本方案容量利用率高出了近一倍!d3
能夠看到重點就在於,如何計算出校驗塊以及如何利用其進行數據恢復,接下來就講重點介紹這兩部分,這,也就是EC的原理。總結
注意:這裏的文件並非指真實的文件,好比一首歌曲或者一部電影,而是由存儲系統對真實文件進行條帶化後生成的更小的文件。
能夠丟失一個數據的EC算法
一部電影太大了,咱們不妨以一個很簡單的例子入手,好比存幾個整數,
若是怕d1,d2,d3的某一個數據可能會丟失,那麼咱們就須要利用這三個數據經過計算來生成一個新的校驗數據。說白了,一個最簡單的方式就是,
直接保存一個三者相加的值,那麼當其中一個數據丟失,就能夠經過c1減去另外兩個數據來進行恢復。
到此,一個最簡單的能夠容許一個數據丟失的EC算法就構形成功了。
能夠丟失兩個數據的EC算法
與丟失一個數據相似,咱們會很容易想到,直接再構造一個校驗塊,好比,
可是這樣真的能夠嗎,仔細想來,這是個很是蠢的作法,若是真的丟失了兩個數據,這兩個如出一轍的方程根本沒法解出兩個未知數,由於有兩個未知數但只有一個有效的方程。那麼這兩個方程的係數向量有什麼關係呢,這裏引入一個線性代數的定義,它們線性相關。也就是說其中一個能夠被另一個線性表示。
知識點:線性相關。還不懂的同窗本身回爐~
因而,咱們能夠改變c2
方程的係數,隨便取一個,讓它和另外一個線性無關,好比:
顯然,咱們能夠用初中一年級學到的解二元一次方程的方法輕易地將丟失的兩份數據恢復(就是解出來了那倆值)。
EC算法推廣
若是,咱們把上面的方程寫成矩陣乘法的形式,以下,
經過上文的分析,咱們能夠用很是樸素(low)的數學思想總結,當生成矩陣(就是校驗公式的係數矩陣)的行向量兩兩不相關時,生成的校驗數據能夠在丟失數據時將其恢復。此時,若是咱們回憶下大一的線性代數的知識,其實這就是要求生成矩陣可逆。
知識點:逆矩陣。
兩個矩陣相乘等於單位矩陣,就稱它們互爲逆矩陣。
剛纔我隨便取了c2的係數爲7 6 3(實際上是個人UM賬號後綴。。。),它恰巧是可行的,可是在有多個的狀況下,須要有一個規律性的生成矩陣的取值,且保證這個矩陣可逆。好比,咱們能夠用下面這個規律,
這,就是傳說中的範德蒙德矩陣。之因此用這個矩陣最重要的一點是它保證了矩陣的可逆性,也就是保證了求解的惟一性。
上文中,咱們知識討論了校驗數據塊的生成,那麼,若是在丟失了某個或者某幾個數據後,如何經過矩陣計算來進行數據恢復呢?
如今咱們把上文的生成矩陣進行一下擴展,在其上面加一個單位矩陣,這樣讓數據塊和校驗塊作一個統一,
不妨,咱們舉個具體的例子,還以咱們最開始講的KM比例5/3來算,
其中,5,2,8,7,0
爲數據塊,22, 61, 197
爲範德蒙矩陣生成的校驗塊。如今咱們來看下,22, 61, 197
這三個校驗塊到底能不能在丟失數據塊的時候將數據恢復出來。
若是非要糾結數據塊數字的意義的話,它是個人分機號碼。。
假設在一個極端狀況下,五個數據塊丟失了三個,也就是能夠容忍的最大數量,好比,丟失了
5,2,8
,此時把丟失的數據塊和其對應的聲稱矩陣的行去掉,而後用生成矩陣的逆矩陣乘以校驗塊和剩餘的數據塊組成的矩陣。
F = [0,0,0,1,0;0,0,0,0,1;1,1,1,1,1;1,2,3,4,5;1,4,9,16,25]; F_INV = inv(F); %求F的逆矩陣 C = [7;0;22;61;197]; D = F_INV*C; D = 5.0000 2.0000 8.0000 7.0000 0
能夠看到,丟失的數據獲得了完美的還原。