原文地址:http://www.cnblogs.com/pcxie/p/7750074.html
本文譯者水平有限,如發現問題請批評指正
Jerasure 2.0:為方便存儲相關應用開發的一個基於C開發的糾刪碼庫
版本2.0
James S.Plank Kevin M.Greenan
技術報告 UT-EECS-14-721
電氣工程與計算機科學系
田納西大學
諾克斯維爾,田納西大學 37996
http://www.cs.utk.edu/~plank/plank/papers/UT-EECS-14-721.html
源碼: http://web.eecs.utk.edu/~plank/plank/www/software.html
本文描述了2.0版本的源碼
摘要
本文描述了jerasure2.0,一個基於C的支持存儲應用中糾刪碼的類庫。在本文中,我們不僅描述了糾刪碼技術而且描述了算法,並將其抽象為接口寫入源碼。因此,本文充當了一個准教程和編程指南。
如果你使用這個類庫或者文檔
請發送郵件告知我。一個方面是因為本人會被通過本人工作的影響力而評估,另一方面,如果你發現這個類庫或者這個文檔有用,我會感到很高興能夠編寫它。請發送郵件至plank@cs.utk.edu 。
這個類庫受到新的BSD許可證保護。在許可證的規定范圍內,它是免費被使用和修改的。本文中所有的技術實現都沒有申請專利。
找到這個源碼http://jerasure.org/jerasure-2.0/
請下載源碼從:http://web.eecs.utk.edu/~plank/plank/www/software.html
在你編譯之前,你必須先下載,編譯和安裝GF-Complete。這是可用的資源地址:http://web.eecs.utk.edu/~plank/plank/www/software.html.
所有的類庫編譯使用autoconf,這意味着你需要在主目錄執行以下步驟:
UNIX>./configure
UNIX>make
UNIX>sudo make install
示例程序在Examples這個文件夾。源代碼在src文件夾。
Jerasure的發展歷程
這是jerasure的第三個主版本。Jerasure的修訂歷史如下所示:
版本1.0:James S. Plank,2007年九月。
版本1.2:James S. Plank,Scott Simmerman和Catherine D. Schuman,2008年8月。這次修訂向源碼添加了Blaum-Roth和Liber8tion碼,添加了一個示例編碼器和解碼器,並更改了示例。
版本1.2A:除了它使用new BSD許可證替換了Gnu LGPL,其他與版本1.2相同。該版本是可用的作為一個tar文件在http://web.eecs.utk.edu/~plank/plank/papers/Jerasure-1.2A.tar 。
版本2.0:James S. Plank和Kevin Greenan,2014年一月。這個版本將伽羅華域的后端實現更改為GF-Complete,這使得允許jerasure利用SIMD操作獲取超快的編解碼速度。所有的示例都被更新,一部分示例被添加用來演示如何調整底層的伽羅華域去探究GF-Complete的未來特點。
目錄
1 前言
2 庫的模塊
3 基於矩陣的編碼
4 基於二進制矩陣的編碼
4.1 使用schedule代替二進制矩陣
5 MDS最大距離可分碼
6 庫的第一部分:伽羅華域算法
7 庫的第二部分:內核例程
7.1 矩陣/二進制矩陣/Schedule創建例程
7.2 編碼例程
7.3 解碼例程
7.4 點積例程
7.5 基礎矩陣操作
7.6 統計學
7.7 示例程序
8 庫的第三部分:經典RS碼例程
8.1 范德蒙矩陣
8.2 與針對RID6優化的RS編碼相關的程序
8.3 示例程序
9 庫的第四部分:CRS碼例程
9.1 cauchy.c中的程序
9.2 示例程序
9.3 擴展參數空間用於柯西RAID-6矩陣的優化
10 庫的第五部分:最低密度RAID-6編碼
10.1 示例程序
11 編碼器和解碼器的示例
11.1 緩存區大小和包大小的明智選擇
12 更改底層的伽羅華域
1 前言
隨着存儲系統規模和復雜度的增長,糾刪碼對於存儲應用變得越來越重要。本文描述了Jerasure,是一個基於C的支持糾刪碼應用的類庫。Jerasure按照模塊化,快速和靈活被設計。我們希望存儲應用開發人員能夠發現jerasure作為一個方便的工具來為他們的存儲系統添加容錯能力。
Jerasure支持了糾刪碼一個horizontal 模式。我們假設我們有k個設備來存儲設備。為了這個,我們添加了m個設備來存放原始k個設備中數據計算得到的內容。如果糾刪碼是一個最大距離可分碼(MDS),那么整個存儲系統可以容忍m個設備的丟失。
圖1:編碼操作獲取k個數據節點的內容,將其編碼后放在m個編碼設備上。
解碼操作從(k+m)全部的設備上獲取一個子集,並通過他們重新計算出放在原始k個設備上的原始數據。
正如圖一描述的那樣,編碼操作獲取k個數據設備,並從他們計算出m個編碼節點。解碼操作通過獲取一個有擦除的(k+m)設備的集合,並從其中存活的設備重新計算出原始k個數據節點中的內容。
大多數的碼有第三個參數w,稱為字長。這個對於一個碼的描述將每個設備看作有w位數據。數據設備用D0到Dk-1表示,編碼設備用C0到Cm-1表示。每個設備Di或者Cj擁有w位,表示位di,0...diw-1和ci,0...ci,w-1。當然在實際情況當中,每個設備存儲了百萬字節的數據。為了將一個碼的描述與其在實際系統中它的實現相對應,我們做了如下兩件事中的一個:
1. 當w∈{8,16,32},我們能夠分別認為每w位作為一個字節,短字或者字。考慮到當w=8的情況。我們可以認為每個設備容納B字節。每個編碼設備的第一個字節將會通過每個數據設備的第一個字節編碼而來。每個編碼設備的第二個字節將會通過每個數據設備的第二個字節編碼而來。等等。這是標准RS碼的工作方式,當w=16或者w=32時,如何工作也應該是清楚的。
2. 更多其他碼的工作是通過定義每個編碼位ci,j是由一些其他位的子集的按位異或獲得。為了在真實系統中實現這些碼。我們假定每個設備是由相等大小的w個包構成。現在每個包被其他別的包的一些子集按位異或計算獲得。用這種方式,我們能夠充分利用這樣的現實:我們可以對整個計算機的字執行異或運算,而不是在位上。
在圖二舉例說明了這個過程。在這個圖中,我們假設k=4,m=2和w=4。假如一種碼被定義編碼位c1,0是由以下公式生成:c1,0=d0,0⊕d1,1⊕d2,2⊕d3,3.
⊕代表異或操作。圖2展示了編碼包中c1,0是由數據包中的d0,0,d1,1,d2,2,d3,3計算得到。我們把每個包的大小叫做包長packetize,w個包的大小叫做編碼數據塊大小coding block size。很明顯包長packetize一定是計算機字長的整數倍,編碼塊大小將是w * packetize的倍數。
圖·2盡管碼在系統中被描述只有w位,他們在實現中使用的包是更大的。每個包在實現中對應的描述中的一位。這個圖展示了公式c1,0=d0,0⊕d1,1⊕d2,2⊕d3,3的實現。
2 庫的模塊
這個庫被划分為5個模塊,每個模塊由自己的頭文件和C的實現。例如,我們使用一個碼,一個只需要其中的三個模塊:galois, jerasure and 其他的一個。這些模塊如下:
- galois.h/galois.c:這是伽羅華運算的程序,在[Pla07]中描述及實現。
- jerasure.h/jerasure.c:這是內核例程,對大多數糾刪碼是常見的。他們除了galois,不依賴於其他模塊。它們包含了基於矩陣的編解碼,基於二進制矩陣的編解碼,二進制矩陣到schedules的轉換,矩陣和二進制矩陣的求逆。
- reedsol.h/reedsol.c:這些程序是為了創建RS碼的分布矩陣[RS60,Pla97, PD05]。它們也包含在[Anv07]中提到的針對RAID-6優化的RS碼編碼優化。
- cauchy.h/cauchy.c:這些是CRS碼運作的程序[BKK +95, PX06],與RS碼相比,采用了一個不同的矩陣構造。我們不僅為了RAID-6支持創建最優的柯西分布矩陣,而且支持創建了目前發布的最優的分布矩陣。
- liberation.h/liberation.c:這些是使用最小密度MDS碼執行RAID-6編解碼的碼—RAID-6 Liberation codes [Pla08b], Blaum-Roth codes [BR99]和 RAID-6 Liber8tion code [Pla08a]的程序。這些是基於位矩陣的碼,比傳統的類RS碼及EVENODD碼[BBBM95]要好。在某些情況下,它們甚至比目前已知的最優的RAID-6碼RDP [CEG+04]更好。
每一個模塊會在下面的自己的小節中描述。此外,每個模塊都會有使用的示例程序。
3 基於矩陣的編碼
給予矩陣的編碼技術在[Pla97]被詳細地講解。我們在這里給出了概述。
作者的警告:我們正在使用的“distribution matrices分布矩陣”是以前的術語。在標准編碼理論中,分布矩陣被翻譯為生成矩陣(Generator matrix)。在jerasure下個版本的修訂中,我們會更新術語使得與經典的編碼理論中的術語一致。
假設我們有k個數據字(data word)和m個編碼字,每個字由w位組成。我們能夠通過圖3中的矩陣向量乘積來描述一個基於矩陣編碼的系統。圖中叫做的分布矩陣是一個(k*m)*k的矩陣。矩陣中的元素屬於伽羅華域GF(2w) 。這意味着它們是介於0到2w-1之間的整數,它們的運算是使用伽羅華運算:加是對應着XOR異或運算,乘法的實現多種多樣。[Pla07a]中的伽羅華運算類庫已經有實現伽羅華域運算實現的函數。
圖3:使用一個矩陣向量乘積來描述一個編碼系統
圖中分布矩陣的前k行是一個k*k的單位矩陣。剩余的m行是叫做編碼矩陣,其定義的方式多種多樣[Rab89, Pre89, BKK+95, PD05]。分布矩陣乘以一個包含數據字的向量,並產生一個包含數據字和編碼字的向量。因此,為了編碼,我們需要用數據和編碼矩陣進行m次點積運算。
為了解碼,我們注意到每個系統中的每個字都對應着分布矩陣的一行。當設備失效,我們從k個沒有失效的設備的字對應的分布矩陣中的k行構成解碼矩陣。注意到,這個矩陣與原始數據相乘等於我們選擇的k個幸存設備中的數據。如果我們對這個矩陣求逆矩陣然后對方程兩邊乘以這個逆矩陣,那么我們獲得了解碼方程——這個逆矩陣乘以k個幸存設備的行獲得原始數據。
4 基於位矩陣的編碼
基於位矩陣編碼是在最初CRS碼的論文[BKK+95]中提出。為了使用位矩陣進行編解碼運算,我們通過w因子對GF(2w)的分布矩陣進行每個方向的擴展。
一個w(k+m)*wk矩陣我們叫做一個位分布矩陣(BDM)。我們將其與一個wk元素向量相乘,該向量是由每個數據設備中的w位組成。其相乘結果是一個w(k+m)元素向量,這個元素向量是由每個數據設備及編碼設備的w位組成。這個過程在圖4中描述。我們將這些矩陣看作是由w*w的子矩陣(對應圖3中的分布矩陣的每個元素)組成的更加容易理解。
圖4:描述一個帶有位矩陣向量乘積的編碼系統
與GF(2w)中的矩陣向量乘積一樣,結果的每一行都對應着BDM的一行,計算過程是BDM的該行和數據位的點積。因為所有的元素都是位,我們可以通過對位分布矩陣行中為1對應的每個數據位進行XOF異或運算來完成點積運算。換句話說,計算點積我們只使用異或運算而不使用加法和乘法。此外,這個點積的性能與行中1的個數相關。因此,找到含有很少1的矩陣是有必要的。
除了每個設備對應矩陣的w行而不是一行,位矩陣的解碼與GF(2w)域上的矩陣解碼過程是相同的。還需要注意的是描述中的一個位對應着實現中的一個包。
雖然傳統的位矩陣的構造是使用一個GF(2w)的標准分布矩陣,但是可以構造與伽羅華域運算無關的位矩陣,還是仍然要考慮編解碼性能。
4.1 使用schedule代替位矩陣
考慮基於位矩陣的編碼的操作。我們在圖5中給了一個k=3,w=5的例子,我們計算出編碼設備的內容。最直接的編碼方法是為了編碼設備的每五位去計算五次點積, 我們能夠通過遍歷五行中的每一行,在矩陣中為1對應的地方做異或運算。
圖5:一個k=3,w=5位矩陣的超行的例子
因為這個矩陣是稀疏的,所以預先計算編碼操作是比每次編碼去遍歷矩陣更加有效。我們代表編碼的數據結構是一個schedule,它是一個五元組:<op,sd,sb,dd,db>,op是一個操作碼:0代表復制,1代表XOR異或,sd是源設備的id,sb是源設備的位,最后的兩個dd,db是目標設備和位。按照慣例,我們使用0到k+m-1的整數來定義設備。當i<k定義數據設備Di,當i小於等於k定義編碼設備Ci-k。
一個使用圖5中位矩陣進行編碼的schedule如圖6所示。
圖6:圖5中的位矩陣的位矩陣運算schedule。(a)展示了這個schedule,(b)展示了對應schedule每一行的點積方程式。
正如[HDRT05, Pla08]提出,一種可以推導出在點積中使用位矩陣編解碼的schedule 的表達式,因此可以使用更少的XOR運算來計算位矩陣向量積而不是通過簡單的遍歷位矩陣。即使是在BDM的最后w行中有超過kw的1的情況下,RPD編碼采用這種方式獲取最佳性能[CEG+04]。我們把這樣的調度稱為智能調度,並且通過簡單地遍歷矩陣啞調度進行調度。
未完待續。。。好難翻譯,有要一起的朋友可以一起翻譯