Destor源码解析01 - 功能及平台搭建
Samersions ZHONG Lv1

Destor[1]是HUST Min Fu博士开发的重复数据删除系统评估平台,随作者的综述文章[2]在第十三届USENIX文件与存储技术会议上发布。Destor整合了文章发布前常见的、有关重复数据数据删除技术的算法,并以模块化的方式构建了一套评估平台。

近期我们使用了这个平台对某些去重算法进行评估。在使用的过程中,我们发现网络上关于此平台的文档较少,在大多数情况我们只能通过阅读源码了解Destor的机制并在此平台实现算法。在近期工作完成后,我们决定撰写一系列有关此评估平台的解析文档,旨在为打算使用该评估平台的有关人士提供一点帮助,并加深我们对该评估平台的理解。

如无意外,本系列解析文档将由如下几个文档构成:

  • 功能及平台搭建。包含本文章接下来的功能介绍及平台搭建部分,重点描述如何搭建开发Destor的环境。
  • 文件大纲与辅助文件详解。包含对所有源码文件功能的概要叙述以及非算法文件代码的解析。
  • 文件读入、全模拟、计算散列阶段解析。包含文件读取、Trace以及分块后对数据块进行散列计算阶段代码的解析。
  • 分块算法解析。对Destor原生使用的分块算法进行解析。
  • 去重代码解析(上)。对去重阶段的基础代码、指纹索引表存储结构进行解析。
  • 去重代码解析(下)。对相似性去重、指纹预取等代码进行解析。
  • 重写算法解析。对重写阶段使用的算法进行解析。
  • 恢复算法解析。对Destor使用的恢复算法进行解析。

功能介绍

模拟

Destor支持四个级别的模拟,模拟模式下所做的备份和恢复操作不会写入硬盘,在某些情况下可以提升评估速度。

模拟级别由小到大排序如下:

  • SIMULATION_NO:关闭模拟模式。在此模式下,备份会从硬盘读取真实文件,归档和恢复也会向硬盘写入数据。
  • SIMULATION_RESTORE:恢复模拟。在此模式下,备份、归档会操作硬盘,但恢复操作不会写入硬盘,只统计恢复操作各类性能指标。
  • SIMULATION_APPEND:归档模拟。在此模式下,只有备份会从硬盘读取数据,归档、恢复操作不会写入硬盘。
  • SIMULATION_ALL:全模拟。在此模式下,备份操作不会读取真实文件,归档和恢复操作也不会写入硬盘。因此要求用户提供Trace以供模拟。

对于两个连续的备份版本,在满足要求情况下,可以使用两个不同模拟模式运行:

  • 若前一个版本模拟模式为SIMULATION_APPENDSIMULATION_ALL,后一个版本的模拟级别不能为SIMULATION_RESTORESIMULATION_NO

原因显而易见,若前一个版本为这两个模式,则无法给后一版本提供用于恢复真实文件的归档数据,并且归档数据库内容会不正确。

  • 若前一个版本模拟模式为SIMULATION_RESTORESIMULATION_NO,后一个版本的模拟级别不能为SIMULATION_APPENDSIMULATION_ALL

由于Destor要求备份的连续性,若进行这种模式的备份,在后期若要重新使用SIMULATION_RESTORESIMULATION_NO级别的备份,会出现无法访问某些备份版本的情况,从而使归档失败。因此若第一次备份时选择将真实文件归档的模拟模式————即SIMULATION_RESTORESIMULATION_NO————则后面每次备份都需要有真实文件的归档。

环境搭建

经测试,原版Destor的编译配置文件无法正常编译,主要原因是GLib的库文件和头文件位置无法查找以及libssl中函数名称与程序不符。作者针对前者的解决方式是手动移动头文件并为库文件建立链接。在此我们提供一种不需要移动任何文件的方法,以保证包管理器能正常维护这些包,此方法需要修改Destor的Autotools文件。

  1. 需要安装Autotools系列工具:
  • autoscan
  • aclocal
  • autoconf
  • autoheader
  • automake
  1. 安装GLib和libssl的开发文件以及pkg-config工具:
  • libglib2.0-dev
  • libssl-dev
  • pkg-config
  1. 编辑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
    6
    PKG_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
  1. 修改configure.ac所在目录的Makefile.am文件,将链接的库由glib修改为glib-2.0

  2. 修改src/hash_phase.c文件,修改如下函数:

  • SHA_Init -> SHA1_Init
  • SHA_Update -> SHA1_Update
  • SHA_Final -> SHA1_Final
  1. 运行如下代码生成Autotools配置文件:

    1
    2
    3
    aclocal
    autoconf
    automake --add-missing
  2. 生成Makefile并编译:

    1
    2
    ./configure
    make

  1. 1.https://github.com/fomy/destor
  2. 2.Design Tradeoffs for Data Deduplication Performance in Backup Workloads @ FAST'15