剛剛寫這篇文章以前看了下上一篇博客的時間:2013年7月19日。竟然已通過了3個月了!好快!感嘆時間的同時不禁的又感嘆了下本身的懶惰,其實仔細想一想,這段時間本身也作了不少事情:php
只不過事情多了就有些嘈雜,沒有靜下心來深刻的思考、整理。html
好啦,反思到此,接下來有時間好好整理。進入正題,也就是最近的工做內容:Erasure Code在存儲系統中數據備份的應用。git
===================================進入Erasure Code===================================github
目前,採用副本機制(通常爲3個副本)對數據進行備份是不少流行的分佈式存儲系統慣用的、保證數據可靠性的方法。副本機制不只能夠提升數據的可靠性,用於某一份數據丟失時的恢復,並且有很好的負載均衡的做用。然而,這種方法帶來的代價也很明顯:成本高。一個擁有10P數據的雲存儲系統,在採用3副本機制保證數據可靠性的狀況下,將會真正存儲30P的數據,考慮存儲硬件、機房消耗、電費等一系列問題,將會帶來比本來數據高出至少2倍的存儲成本。且隨着數據存儲量的不斷增大,這個問題也越發突出。web
Erasure Code(糾刪碼)就是在不下降存儲可靠性的前提降低低存儲副本數目的一種方法。因爲本文的重點不在於介紹Erasure Code在存儲系統中的應用,故在此再也不繼續贅述,相關內容可Google關鍵字「Erasure Code」,會冒出一大堆資料,當前該方向也很熱,Facebook的HDSF-RAID/HDFS-XORing、Google的GFS II、微軟的Windows Azure Stroage都採用了Erasure Code機制來改進副本機制。此外,SwiftStack也在博客中宣佈將在下個版本中爲Swift加入Erasure Code副本機制。算法
====================================進入Jerasure庫====================================swift
Jerasure 是多種Erasure Coding算法的一個開源庫,採用C/C++實現,活躍很高,且使用普遍。Jerasure庫提供了RS coding, Cauchy RS coding, general Generator matrix 和 bit-matrix coding, 以及Minimal Density RAID-6 coding的實現。app
主頁:http://web.eecs.utk.edu/~plank/plank/papers/CS-08-627.html負載均衡
Github:https://github.com/tsuraan/Jerasure分佈式
如下爲我我的使用中的一些記錄,能夠方便初次接觸Jerasure庫的盆友們更快上手。
運行環境:Ubuntu 11.04 desktop
代碼版本:Jerasure 1.2
使用過程
1. 解包
代碼下載下來後,使用 tar xvf Jerasure-1.2.tar 命令對代碼解包,產生一個Jerasure-1.2文件夾,其中包含源碼和Examples。
2. 編譯
分別進入Jerasure-1.2和Jerausre-1.2/Examples文件夾,執行make命令,makefile文件已經寫好了,因此直接執行make命令便可,系統會默認查找到Makefile文件的。
3. 運行
爲了有個快速的體驗,咱們能夠直接進入Examples文件夾,執行make後的可執行文件,並附加相應的參數:./filename [args]
Encode範例
在這裏,咱們使用Jerasure庫中RS算法範得蒙德實現來進行演示。
1. encoder使用方法
./encoder 'inputfile' k m 'coding_technique' w (packetsize) (buffersize)
inputfile:須要被編碼的文件。在這個例子中,咱們在Examples文件夾下建立了一個data文件夾,其中有一個圖片文件「40kb-image.jpg」,可愛的櫻桃小丸子哈!~
k:將文件劃分的數據塊的數量
m:根據數據塊生成的校驗塊的數量
coding_technique:使用的編碼算法。可選的有"reed_sol_van", "reed_sol_r6_op", "cauchy_orig", "cauchy_good", "liberation", "blaum_roth", "liber8tion", "no_coding",在這裏咱們使用"reed_sol_van"
w:bit-word size。範得蒙德算法的w只能從{8, 16, 32}中選取,這裏咱們選擇8
packet size:就是packet size -。-,這裏咱們選擇8
buffer size:每次處理的數據大小,這裏咱們選擇1024
2. 執行
root@fs-13:~/Jerasure-1.2/Examples# ./encoder 'data/40kb-image.jpg' 4 2 'reed_sol_van' 8 8 1024
按照上述說明執行命令後,咱們會發如今Examples文件夾中建立了一個Coding文件夾,顧名思義,這裏存放着編碼好的數據塊和編碼塊,以及一個meta文件,存放文件的編碼信息。每一個數據塊文件都會被命名爲"_k#"(數據塊)和"_m#"(校驗塊)而後跟着源文件的擴展名。例如 40kb-image.jpg 就會生成一個 40kb-image_k1.jpg。
執行結果以下圖所示,40kb-image_meta.txt是此次encoding的相關參數,這些參數將會用於decoding過程。
Decode範例
如今,咱們隨便刪掉兩個數據(校驗)塊文件,如 40kb-image_k3.jpg 和 40kb-image_m1.jpg,而後試圖decode從新得到咱們的小丸子圖片^o^.
1. decoder使用方法
./decoder 'inputfile'
在decoder中再也不進行參數校驗,由於在encoder中已經作過這個事情了,而且將參數保存在了meta文件中。固然,這只是Jerasure爲咱們實現的一個範例encoder/decoder的作法,具體處理方式能夠由你本身經過調用接口來從新決定。
2. 執行
root@fs-13:~/Jerasure-1.2/Examples# ./decoder '40kb-image.jpg'
decoder會到Coding文件夾中查找前綴爲40kb-image_k#.jpg、40kb-image_m#.jpg 和 40kb-image_meta.txt 的文件來進行數據恢復的工做。
下圖能夠看到,咱們的小丸子圖片已經在Coding文件夾下被建立出來咯!而丟失的那兩個文件依然仍是丟失的狀態。
好啦,以上就是一個很簡單很簡單的使用過程了,同理其餘的Erasure Coding實現的調用也很相似,重點在於參數的選擇(m、k、w、packet size)。關於參數的問題,筒子們能夠仔細瞭解各個算法來精心選擇,固然也能夠經過閱讀源碼中的實現來選擇。
相關閱讀
《Jerasure A Library in C-C++ Facilitating Erasure Coding for Storage Applications》 主頁上的文檔,有點兒長哈
HDFS-RAID使用Erasure Code來實現HDFS的數據冗餘
《Performance Evaluation and Examination of Open-Source Erasure Coding Libraries For Storage》 推薦!!