剛剛寫這篇文章之前看了下上一篇博客的時間:2013年7月19日。居然已經過了3個月了!好快!感嘆時間的同時不由的又感嘆了下自己的懶惰,其實仔細想想,這段時間自己也做了很多事情:
- 完成了一篇副本同步相關的專利撰寫
- 參與朋友創業項目的初期開發
- 實現了一個比較粗糙的Swift監控平台
- Erasure Code相關內容的學習、論文閱讀,主要是用在分布式存儲領域
只不過事情多了就有些嘈雜,沒有靜下心來深入的思考、整理。
好啦,反思到此,接下來有時間好好整理。進入正題,也就是最近的工作內容:Erasure Code在存儲系統中數據備份的應用。
===================================進入Erasure Code===================================
目前,采用副本機制(一般為3個副本)對數據進行備份是很多流行的分布式存儲系統慣用的、保證數據可靠性的方法。副本機制不僅可以提高數據的可靠性,用於某一份數據丟失時的恢復,而且有很好的負載均衡的作用。然而,這種方法帶來的代價也很明顯:成本高。一個擁有10P數據的雲存儲系統,在采用3副本機制保證數據可靠性的情況下,將會真正存儲30P的數據,考慮存儲硬件、機房消耗、電費等一系列問題,將會帶來比原本數據高出至少2倍的存儲成本。且隨着數據存儲量的不斷增大,這個問題也愈加突出。
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庫====================================
Jerasure 是多種Erasure Coding算法的一個開源庫,采用C/C++實現,活躍很高,且使用廣泛。Jerasure庫提供了RS coding, Cauchy RS coding, general Generator matrix 和 bit-matrix coding, 以及Minimal Density RAID-6 coding的實現。
主頁: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》 推薦!!