原文:《Erasure Coding in Windows Azure Storage.pdf》,地址:https://www.usenix.org/system/files/conference/atc12/atc12-final181_0.pdf前端
WAS: (LRC, Local Reconstruction Codes)算法
(1) Extent緩存
當extent的大小達到必定值,extent就被sealed. Sealed的extent不能再被修改,做爲編碼的候選。WAS 在後臺lazily地編碼這個extent,一旦extent被編碼成功,extent原始的3備份要被刪除。網絡
(2) LRU架構
A (k, l, r), k個數據段(data fragments),分紅l個組,每一個組生成一個本地編碼塊(local parity fragments),全部數據段,生成r個全局編碼塊。(6, 2, 2)dom
(3) Checking Decodability異步
swap local parity and data fragment , 而後檢查刪除的數據段和全局編碼段的個數是否是小於全局編碼段的個數,若是是,代表可解碼。性能
(4) RS (10, 4) is used in HDFS-RAID in Facebook and RS (6, 3) in GFS II in Google.優化
(5) 其它編碼技術:Weaver codes, Hover codes and Stepped Combination codes編碼
(6) LRC和其餘編碼方案在重建讀成本和存儲複製兩個維度的比較
(7) LRC爲了提供客戶端讀過程的重建需求,優化數據段重建,而非編碼段。在編碼段重建,modern codes更有效。在(12,6)的狀況下,Stepped Combination code只須要3個數據段就能夠重建編碼段,LRC則須要12個數據段。
(8) WAS爲了不關聯錯誤,將同一個編碼組的數據段放在不一樣的fault domain
(9) WAS從架構上分爲三層:前端層、分區對象層、流複製(replication)層
編碼存儲放在流複製層
(1) 流層的架構:基於paxos的流管理器(Stream Managers, SM), Extent Nodes(EN)
(2) Extent, block, EN
每個extent含有一系列的block(最大5M),每一個block是CRC校驗的,block是分區對象層讀寫數據的最小粒度。
每一個extent在多個EN上覆制。每一個寫操做在回覆消息給客戶端時,以菊花鏈的方式提交到一個複製集合的多個EN上
(3) Sealed
對應一個流的寫操做持續追加到一個extent上,除非extent達到最大的大小(1G-3G),或者在複製集合中出現錯誤。不管哪一種狀況,一個新的extent會被建立,以前的extent被sealed。當extent被sealed(標記),數據就不能改變(immutable),而且成爲編碼存儲的備選。
編碼存儲是徹底的異步和脫離客戶端的寫路徑的。SM週期性掃描標記的extent,根據流策略和系統負載,安排一個子集用於編碼。
We configure the system to automatically erasure code extents storing Blob data, but also have the option to erasure code Table extents too
過程:
(1) SM根據編碼的參數(12,2,2),在一個集合的EN上建立fragment。SM從EN中選擇一個協調者(coordinator),而且向它發生複製集合的元數據,從這開始,協調者負責編碼的完成。
(2) coordinator EN選擇編碼的extent: 全部fragments的邊界都在extent上。EN根據追加block的界限劃分extent到fragment,而不是隨意的劃分。這確認讀一個block不會跨越多個fragments
(3) coordinator EN開始編碼過程,持續發送編碼fragment給指定的EN。全部EN跟蹤進度,並存儲相應信息到新的fragment。當有錯誤發生,另一個EN根據fragment中的進度信息,接手剩餘工做
(4) 當整個extent都被編碼了,協調者EN通知SM用fragment的界限和完成標記更新extent元數據。而後SM安排全備份的EN刪除不須要的extent.
(1) 讀過程的重建
客戶端進行讀的時候,若是對應的EN不存活,或是一個熱點,能夠聯繫任何一個擁有extent的fragment的EN,開始一個重建讀,EN完成重建讀後會緩存相應的fragment.
(2) EN或磁盤丟失重建
由SM啓動在另一個EN進行重建,過程同上
存放位置考慮的因素:
(1)負載,傾向於更空閒、更小負載的EN;
(2)可靠性,避免將同一個編碼組的兩個fragments放在相關聯的域中。Fault domain(rack)、upgrade domain.
示例:
一個典型的WAS有20個機架,10個升級域(每次升級,有10%的存儲資源不在線)。
LRU(10,2,2),分紅2個本地組,而後每組選一個,一塊兒放入一個升級域,一共要6個升級域。2個本地編碼塊,放入一個升級域,而後2個全局編碼塊放入2個升級域。一共須要9個升級域。這樣在任何一個域的升級,每一個數據fragment均可以獲取到,或直接讀取,或經過重建。
每個EN監控網絡、每一個獨立磁盤的負載,決定接受、拒絕、delay IO
相似的,SM監控EN上的複製負載,來決定啓動複製、編碼、刪除extent和其它系統維護操做,爲了對其它IO操做的公平的性能。同時,也是爲了確保編碼的速度能遇上從用戶進來的數據速率。
重建預讀和cache:
重建fragment時以unit大小(大於block的大小)進行,減小磁盤和網絡的IO數。預讀的數據緩存在內存中(最大256M)。
Checksum和parity。每一個block的同步都有一個crc,讀寫的時候檢查。
在每個編碼操做後,不少解碼的集合都在coordinator EN的內存中被嘗試,以檢查是否能成功的恢復。這樣作的目的是爲了確保編碼的算法自己沒有引入數據不一致。
LRC(12,2,2)在容許編碼完成前,將嘗試下列的解碼驗證:
(1)隨機選擇一個數據fragment,local group內重建;
(2)隨機選擇一個數據fragment,用其中一個全局parity重建;
(3)隨機選擇一個數據fragment,用另一個全局parity重建;
(4)隨機選擇兩個數據fragment,重建;
(5)隨機選擇3個數據fragment,重建;
(6)隨機選擇4個數據段(只是一個本地組要有一個),重建。
對於每種狀況解碼出來的數據,和實際的數據比較CRC
最後coordinator EN執行一個全部數據段的CRC,和extent的原始的CRC進行比較。若是這些檢查都經過了,編碼段纔會被持久化到存儲磁盤中。若是在這個過程,任何一個錯誤發生了,編碼操做會被終止,保留extent的數據不變。SM過段時間在另外一EN再開始調度編碼。
Galois Field arithmetic。使用預計算、加法、乘法表,根據編解碼矩陣的形式來排序XOR操做,這樣能夠減小冗餘的操做和限制實際編碼過程當中對編碼矩陣的重複檢查