刚刚写这篇文章以前看了下上一篇博客的时间:2013年7月19日。竟然已通过了3个月了!好快!感叹时间的同时不禁的又感叹了下本身的懒惰,其实仔细想一想,这段时间本身也作了不少事情:php
只不过事情多了就有些嘈杂,没有静下心来深刻的思考、整理。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的数据冗余
《Performance Evaluation and Examination of Open-Source Erasure Coding Libraries For Storage》 推荐!!