Jerasure库简介及使用范例

刚刚写这篇文章以前看了下上一篇博客的时间:2013年7月19日。竟然已通过了3个月了!好快!感叹时间的同时不禁的又感叹了下本身的懒惰,其实仔细想一想,这段时间本身也作了不少事情:php

  • 完成了一篇副本同步相关的专利撰写
  • 参与朋友创业项目的初期开发
  • 实现了一个比较粗糙的Swift监控平台
  • Erasure Code相关内容的学习、论文阅读,主要是用在分布式存储领域

只不过事情多了就有些嘈杂,没有静下心来深刻的思考、整理。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的数据冗余

Jerasure库接口简介及性能测试

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

相关文章
相关标签/搜索