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的数据冗余
《Performance Evaluation and Examination of Open-Source Erasure Coding Libraries For Storage》 推荐!!