一、背景
- 傳統各大互聯網公司在大規模數據存儲,包括私有云和公有云,技術選型上基本核心都是n-way replication,如典型的1主3備的架構。
- n-way replication技術在帶來高可用性的同時,伴隨著巨大的冗余存儲成本,因此近年來各大公司都在用很多trick減少冗余備份的投入
- EC編碼的理論已經有20多年的歷史了,但知道最近幾年再P2P領域中發揮作用才被大家重視起來
二、EC技術
1、What
erasure code可以認為是RAID的通式,任何RAID都可以轉換為特定的erasure code。在傳統的RAID中,僅支持少量的磁盤分布,當系統中存在多個分發點和多節點時,RAID將無法滿足需求。比如RAID5只支持一個盤失效,即使是RAID6也僅支持兩個盤失效,所以支持多個盤失效的算法也就是erasure code是解決這一問題的辦法。(Erasure Code作為可有效提升存儲效率、安全性和便捷性的新興存儲技術)
定義:erasure code是一種技術,它可以將n份原始數據,增加m份數據(用來存儲erasure編碼),并能通過n+m份中的任意n份數據,還原為原始數據。定義中包含了encode和decode兩個過程,將原始的n份數據變為n+m份是encode,之后這n+m份數據可存放在不同的device上,如果有任意小于m份的數據失效,仍然能通過剩下的數據還原出來。也就是說,通常n+m的erasure編碼,能容m塊數據故障的場景,這時候的存儲成本是1+m/n,通常m<n。因此,通過erasure編碼,我們能夠把副本數降到1.x。
2、Where
凡是需要通過冗余來進行高可用的場景。但總體來說,主要運用于存儲和數字編碼領域。
- 陣列
如果磁盤陣列需要使用高級特性,比如需要能夠容錯兩個磁盤失效(RAID6),那么可以用n+2的模式;如果想容錯4個磁盤失效,則可使用n+4的模式。 - 云存儲
erasure code是云存儲的核心技術,最初諸如hadoop, GFS,CEPH等都采用的是n-way replication來做冗余,但是這樣會帶來極大的成本開銷,因此幾乎各大公司都在用erasure code替代n-way replication,之后我還會簡要介紹一下具體他們使用的模式。 - P2P領域
erasure code 的理論起碼也有20年的歷史了,但真正實踐可能也就最近幾年的時間,在P2P領域,動態的分布和智能的容錯,特別是對短暫失效是非常關鍵的。以往的算法或多或少都有點山寨的感覺,而借助erasure code之后,將會使P2P的算法更具有數學的嚴謹性。 - 數字編碼
erasure code本身就是出自編碼理論,所以在這一塊具有先天的優勢。
3、How
最常見的Erasure Code是Reed Solomon算法,如圖,RS codes定義了一個(n + m) * n的分發矩陣(Distribution Matrix) 。
1) Encode
對每一段的n份數據,我們都可以通過B * D 得到得到對n份數據的Encode結果即n+m分數據。
2) Decode
Decode的過程對應著存在數據受損時,可以由任意n份數據恢復出其他受損數據。這個過程分成2個階段:恢復原始數據、恢復編碼數據。
假設如上圖中的原始數據D1~5對應的編碼后存儲數據中D1, D4, C2 失效
a) 恢復原始數據
Step1: 可以同時從矩陣B和B*D中,去掉相應的行,得到下面的等式:
Step2: 用Survivors數據恢復原始數據D1~5,我們只需簡單的做矩陣乘法:
因為(B')^-1 * B' = I 單位矩陣,所以我們就秋得了原始矩陣D:
b) 恢復編碼數據
矩陣B是已知的,原始數據D已經完成恢復,只需要再做一次Encode的過程即可。因為是矩陣乘法,只取出受損數據對應的行進行矩陣乘即可。
參考文檔[http://blog.csdn.net/sinat_27186785/article/details/52034588]