
Destor[1]是HUST Min Fu博士开发的重复数据删除系统评估平台,随作者的综述文章[2]在第十三届USENIX文件与存储技术会议上发布。Destor整合了文章发布前常见的、有关重复数据数据删除技术的算法,并以模块化的方式构建了一套评估平台。
近期我们使用了这个平台对某些去重算法进行评估。在使用的过程中,我们发现网络上关于此平台的文档较少,在大多数情况我们只能通过阅读源码了解Destor的机制并在此平台实现算法。在近期工作完成后,我们决定撰写一系列有关此评估平台的解析文档,旨在为打算使用该评估平台的有关人士提供一点帮助,并加深我们对该评估平台的理解。
如无意外,本系列解析文档将由如下几个文档构成:
- 功能及平台搭建。包含本文章接下来的功能介绍及平台搭建部分,重点描述如何搭建开发Destor的环境。
- 文件大纲与辅助文件详解。包含对所有源码文件功能的概要叙述以及非算法文件代码的解析。
- 文件读入、全模拟、计算散列阶段解析。包含文件读取、Trace以及分块后对数据块进行散列计算阶段代码的解析。
- 分块算法解析。对Destor原生使用的分块算法进行解析。
- 去重代码解析(上)。对去重阶段的基础代码、指纹索引表存储结构进行解析。
- 去重代码解析(下)。对相似性去重、指纹预取等代码进行解析。
- 重写算法解析。对重写阶段使用的算法进行解析。
- 恢复算法解析。对Destor使用的恢复算法进行解析。
功能介绍
模拟
Destor支持四个级别的模拟,模拟模式下所做的备份和恢复操作不会写入硬盘,在某些情况下可以提升评估速度。
模拟级别由小到大排序如下:
- SIMULATION_NO:关闭模拟模式。在此模式下,备份会从硬盘读取真实文件,归档和恢复也会向硬盘写入数据。
- SIMULATION_RESTORE:恢复模拟。在此模式下,备份、归档会操作硬盘,但恢复操作不会写入硬盘,只统计恢复操作各类性能指标。
- SIMULATION_APPEND:归档模拟。在此模式下,只有备份会从硬盘读取数据,归档、恢复操作不会写入硬盘。
- SIMULATION_ALL:全模拟。在此模式下,备份操作不会读取真实文件,归档和恢复操作也不会写入硬盘。因此要求用户提供Trace以供模拟。
对于两个连续的备份版本,在满足要求情况下,可以使用两个不同模拟模式运行:
- 若前一个版本模拟模式为SIMULATION_APPEND或SIMULATION_ALL,后一个版本的模拟级别不能为SIMULATION_RESTORE或SIMULATION_NO。
原因显而易见,若前一个版本为这两个模式,则无法给后一版本提供用于恢复真实文件的归档数据,并且归档数据库内容会不正确。
- 若前一个版本模拟模式为SIMULATION_RESTORE或SIMULATION_NO,后一个版本的模拟级别不能为SIMULATION_APPEND或SIMULATION_ALL。
由于Destor要求备份的连续性,若进行这种模式的备份,在后期若要重新使用SIMULATION_RESTORE或SIMULATION_NO级别的备份,会出现无法访问某些备份版本的情况,从而使归档失败。因此若第一次备份时选择将真实文件归档的模拟模式————即SIMULATION_RESTORE或SIMULATION_NO————则后面每次备份都需要有真实文件的归档。
环境搭建
经测试,原版Destor的编译配置文件无法正常编译,主要原因是GLib的库文件和头文件位置无法查找以及libssl中函数名称与程序不符。作者针对前者的解决方式是手动移动头文件并为库文件建立链接。在此我们提供一种不需要移动任何文件的方法,以保证包管理器能正常维护这些包,此方法需要修改Destor的Autotools文件。
- 需要安装Autotools系列工具:
- autoscan
- aclocal
- autoconf
- autoheader
- automake
- 安装GLib和libssl的开发文件以及pkg-config工具:
- libglib2.0-dev
- libssl-dev
- pkg-config
- 编辑
configure.ac
文件:
- 删除文件内有关glib的命令,包括两个对GLib导出函数查找的
AC_CHECK_LIB
命令以及查找GLib头文件的AC_CHECK_HEADERS
命令。 - 修改crypto库中查找
SHA_Update
函数为SHA1_Update
,因为新版本的OpenSSL中该函数已经更名。 - 添加新的命令,使用pkg-config查找GLib,并拼接编译参数以确保相应的头文件被引入:
1
2
3
4
5
6PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.32], [found_glib=yes],[found-glib=no])
if test "$found_glib" = "no"; then
AC_MSG_ERROR([*** glib-2.0 not found ***])
fi
CFLAGS+=" "
CFLAGS+=$GLIB_CFLAGS
修改
configure.ac
所在目录的Makefile.am
文件,将链接的库由glib
修改为glib-2.0
。修改
src/hash_phase.c
文件,修改如下函数:
SHA_Init
->SHA1_Init
SHA_Update
->SHA1_Update
SHA_Final
->SHA1_Final
运行如下代码生成Autotools配置文件:
1
2
3aclocal
autoconf
automake --add-missing生成Makefile并编译:
1
2./configure
make