Jerasure库简介及使用范例

刚刚写这篇文章之前看了下上一篇博客的时间: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的数据冗余

Jerasure库接口简介及性能测试

《Performance Evaluation and Examination of Open-Source Erasure Coding Libraries For Storage》 推荐!!

 

posted @ 2013-10-12 20:39  YUKI小糖  阅读(9808)  评论(6编辑  收藏  举报