重复数据删除技术概述
一、 重复数据删除的分类
1. 源端重复数据删除和目标端重复数据删除
源端消重在数据源进行,传输的是已经消重后的数据,能够节省网络带宽,但会占用大量源端系统资源。
目标端消重发生在目标端,数据在传输到目标端再进行消重,它不会占用源端系统资源,但占用大量网络带宽。
2. 在线重复数据删除和离线重复数据删除
采用在线消重模式,数据写入存储系统同时执行消重,因此实际传输或写入的数据量较少,适合通过LAN或WAN进行数据处理的存储系统,如网络备份归档和异地容灾系统。由于它需要实时进行文件切分、数据指纹计算、Hash查找,对系统资料消耗大。
先将数据写入存储系统,然后利用适当的时间再进行消重处理。这种模式与前面一种刚好相反,它对系统资料消耗少,但写入了包含重复的数据,需要更多的额外存储空间来预先存储消重前数据。这种模式适合直连存储DAS和存储区域网络SAN存储架构,数据传输不占用网络带宽。另外,离线消重模式需要保证有足够的时间窗口来进行数据去重操作。
3. 操作粒度的差异
操作颗粒度分为文件级、块级和字节,比特位级重复数据删除。
块级又可以根据划分块的长度是否可变,分为定长块和变长块的重复数据删除技术。
操作的粒度越小删除的冗余数据越多,但实现的复杂程度和系统开销也相应增加。
重复数据删除技术也应用在虚拟机环境下的主存储系统中.由于虚拟机环境中的每个虚拟机都要求为其操作系统采用专用的存储,用户有可能为很多虚拟机安装同样的操作系统和应用程序;因此,利用重复数据删除技术可以为基于虚拟机的主存储系统节省大量的存储空间。
二、 过程分析
首先将数据文件分割成一组数据块,为每个数据块计算指纹,然后以指纹为关键字进行Hash查找,匹配则表示该数据块为重复数据块,仅存储数据块索引号,否则则表示该数据块是一个新的唯一块,对数据块进行存储并创建相关元信息。这样,一个物理文件在存储系统就对应一个逻辑表示,由一组FP组成的元数据。当进行读取文件时,先读取逻辑文件,然后根据FP序列,从存储系统中取出相应数据块,还原物理文件副本
重复数据删除的过程主要分为:
l 数据划分
l 数据块指纹特征计算
l 数据块检索
l 冗余消除 数据存储
l 相同数据检测还是采用相似数据检测和差异编码技术
对比传统的存储系统,重复数据删除系统基于内容寻址,而不是基于文件名寻址;尽管
减少了写操作,但由于增加了重复数据删除处理过程,较传统存储系统的i/o性能要低;由于每次只写新的数据,重复数据删除系统具有顺序写、随机读的特点.
1. 数据划分
1) 全文件分块: 将每个完整的文件当作一个分块:
应用:EMC的CenteraE、微软的Windows2000上的SIS 均采用全文件分块技术来实现重复数据删除
缺点:不能发现文件内部以及文件之间更小粒度的数据冗余
优点:简单有效,并且节省空间量能够达到最优块级划分策略的3/4
2) 定长分块
定长分块算法采用预先义好的块大小对文件进行切分,并进行弱校验值和md5强校验值。弱校验值主要是为了提升差异编码的性能,先计算弱校验值并进行hash查找,如果发现则计算md5强校验值并作进一步hash查找。由于弱校验值计算量要比md5小很多,因此可以有效提高编码性能。定长分块算法的优点是简单、性能高,但它对数据插入和删除非常敏感,处理十分低效,不能根据内容变化作调整和优化。
应用: 内容寻址的文件系统Venti和Oceanstore
缺点:对数据插入和删除非常敏感,处理十分低效,不能根据内容变化作调整和优化
优点: 定长分块算法的优点是简单、性能高, 适用于更新操作少的静态数据集
3) 内容分块
主要使用滑动块(sliding block)算法
往往通过计算窗口的Rabin指纹来确定边界
应用: LBFS和Pastiche
缺点: 划分大小不均匀,容易产生数据碎片
优点: 克服静态分块对数据更新敏感的缺点, 适合应用于更新频繁的数据集,在减少存储空间的使用上较静态分块更具有优势
4) 基于应用分块
利用不同文件类型的具体格式来指导数据分块,以改进冗余检测的效果
根据文件的元数据: 自动地选择与之相适应的、基于应用定义的分块策略
缺点: 依据文件格式来制定一种划分策略,实现起来较复杂
优点: 对MP3,FI V,HTML和Email等文件格式验证了基于应用分块较基于内容分块策略能够获得更高的数据缩减率
5) Delta编码
Delta编码是基于字节 比特位级进行重复数据删除,是在数据分块的基础上,基于Shingling船,Bloom Filterl3。。和模式匹配。 等技术检测数据的相似性;然后采用Delta编码的方法,存储一个文件相对于另一个文件的变化部分,而不是整个文件来节省存储开销.由于重复数据删除过程中它进行数据比对的粒度最小,其数据缩减率最高.
缺点; 且随着系统逐渐老化和消重树深度不断增长,系统的性能会变得更加糟糕。开销非常大
优点: 据缩减率最高
6) 分块技术总结
尽管目前有各种类型的数据划分策略,但都不能很好地解决数据缩减率与性能之间的平衡关
系。基于内容分块的消重效果最好,其次是静态分块;全文件分块的消重效果最差,但系统开销最小.基于应用分块技术虽然消重效果较好,但要对依据文件格式来制定一种划分策略,实现起来较复杂.You等人通过对全文件分块、静态分块、基于内容分块与Delta编码这4种数据划分方法进行了比较,认为基于Delta编码方法的数据缩减率最高,但其系统开销也最大
2. 数据块指纹特征计算
数据指纹是数据块的本质特征,理想状态是每个唯一数据块具有唯一的数据指纹,不同的数据块具有不同的数据指纹。数据块本身往往较大,因此数据指纹的目标是期望以较小的数据表示(如16、32、64、128字节)来区别不同数据块。数据指纹通常是对数据块内容进行相关数学运算获得,从当前研究成果来看Hash函数比较接近与理想目标,比如MD5、SHA1、SHA-256、SHA-512、为one-Way、RabinHash等。另外,还有许多字符串Hash函数也可以用来计算数据块指纹。然而,遗憾的是这些指纹函数都存在碰撞问题,即不同数据块可能会产生相同的数据指纹。
相对来说,MD5和SHA系列HASH函数具有非常低的碰撞发生概率,因此通常被采用作为指纹计算方法。其中,MD5和SHA1是128位的,SHA-X(X表示位数)具有更低的碰撞发生概率,但同时计算量也会大大增加。实际应用中,需要在性能和数据安全性方面作权衡。另外,还可以同时使用多种Hash算法来为数据块计算指纹。
弱校验值和强校验提高效率:
Rsync算法中的弱校验值(Rsync滚动校验算法)和一个强校验值MD5。弱校验值计算消耗远小于MD5计算量,先计算目标数据块的弱校验值,如果与源数据块不同则不必再计算其MD5校验值,相同则计算MD5并作比较。这种方式以较小的性能代价极大地降低了碰撞产生的概率,而且通过优化,性能损失无几
Hash冲突不可忽视.一些系统利用基于属性识别文件或者对相同Hash值的Chunk进一步逐字节比对以避免Hash碰撞引起数据丢失,如IBM 公司的HyperFactor技术.
3. 相似数据的检测与编码技术
相似数据检测和编码技术.利用数据自身的相似性特点,通过shingle 技术、bloomfilter 技术和模式匹配技术挖掘出相同数据检测技术不能识别的重复数据;对相似数据采用delta 技术进行编码并最小化压缩相似数据,以进一步缩减存储空间和网络带宽的占用。
Broder提出的shingling算法
Charikar的simhash算法
被认为是目前为止最好的算法
提出为每个文档提取一组特征,这样将文件相似性问题转换为集合相似性问题,如基于shingle的计算方法。这种方式的核心思想是为每个文件提取组特征值,以特征值集合来计算相似性,从而降低空间和计算复杂性来提高性能。
Shingle算法的核心思想是将文件相似性问题转换为集合的相似性问题,集合的相似性度量方法主要有resemblance 和containment两种。
Shingle算法的空间和时间计算复杂性都比较高,对于大数据集的Simlarity Join问题将难以适用。Charikar的simhash算法的核心思想是用一个b位的hash值来表示文件的特征值,然后使用simhash之间的Hamming距离来衡量相似性。
Bloomfilter算法
Bloom filter算法的核心思想也是着眼于文件特征的降维,它使用Bloom filter数据结构来表示特征值。
文件特征值存储空间消耗方面,Shingle > bloom filter > simhash;相似性计算精度方面,Shingle< bloom filter < simhash。Bloom filter算法往往是比较折中的相似数据检测方法选择,但海量数据集的相似性计算往往采用simhash算法,在计算性能方面具有很大优势,而且更加适合MapReduce计算模型。
4. 数据块检索
索引进行数据查找和比对.而该索引会随着系统容量的扩展而相应增大,使得将其全部存放在系统内存中不实际,并且Chunk指纹随机分布
对于大存储容量的Dedupe系统来说,数据块数量非常庞大,尤其是数据块粒度细的情况下。因此,在这样一个大的数据指纹库中检索,性能就会成为瓶颈。信息检索方法有很多种,如
动态数组
数据库
RB/B/B+/B*树
Hashtable等。
Hash查找因为其O(1)的查找性能而著称,被对查找性能要求高的应用所广泛采用,Dedupe技术中也采用它。Hashtable处于内存中,会消耗大量内存资源,在设计Dedupe前需要对内存需求作合理规划。根据数据块指纹长度、数据块数量(可以由存储容量和平均数据块大小估算)可以估算出内存需求量。
散列表(Hashtable,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。散列表的查找过程基本上和造表过程相同,一些关键码可通过散列函数转换的地址直接找到,另一些关键码在散列函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。详细请参考散列表设计。
5. 系统安全性
删除了冗余数据,使得数据的可靠性降低。
Dedupe仅保存唯一的数据副本,如果该副本发生损坏将造成所有相关数据文件不可访问,数据可用性压力要高于不作Dedupe许多。数据可用性问题可以采用传统数据保护方法来解决,常用的方式包括数据冗余(RAID1,RAID5, RAID6)、本地备份与复制、远程备份与复制、纠错数据编码技术(如海明码、信息分散算法IDA)、分布式存储技术。这些技术均可以有效消除单点故障,从而提高数据可用性。当然,这需要付出一定代价,以空间换取安全性
重复数据删除系统读写数据的过程中保证数据完整性和一致性仍然是个难题
6. 系统可扩展性
早期的重复数据删除系统往往采用单服务器结构,如HP公司的D2D4000。
利用多个节点构成的服务器集群进行重复数据删除的Extreme Binning策略,并采用基于内存和磁盘的两级Chunk索引消除系统I/O瓶颈,使得重复数据删除系统具有更高的系统扩展能力.NEC公司设计的备份系统HYDRAstor也采用服务器集群结构进行重复数据删除,并通过分布Hash表将数据均匀地分配到各个存储节点上以提高系统的可扩展性。
7. 进一步优化策略
基于分层消重的优化策略
针对重复数据删除存储系统的不同存储层次和不同存储架构的特点,可以分层和分步骤地进行消重,以充分利用重复数据删除系统的各种资源来提高系统I/O性能
设计的重复数据删除存储系统DEBARL。采用客户端和服务器端分别进行文件粒度和Chunk粒度的消重策略,并结合服务器集群可以实现并行顺序索引查询和并行顺序索引更新来提
高读写吞吐量。
例如:
设计并实现了一种基于重复数据删除的备份系统THBS,该系统提出了高精简的数据备份方法HAD依次从目录、文件、块、字节粒度分层多步,由粗及细地匹配删除重复数据,同时采用Bloom filter和倒排索引技术,以减少不必要的数据匹配与磁盘访问,提高匹配查找速度, 待备份数据经过目录、文件、块粒度的数据匹配后,最后进行字节粒度的数据压缩.数据压缩采用Linux标准的Gzip压缩算法,对数据压缩后传输至服务器端[2]。
基于SSD的优化策略
Chunk索引和元数据存放在SSD(solid state disk)设备上,以利用其随机读的优势来改进系统的吞吐量。新型存储介质也在迅速发展,并具有许多磁盘所不具有的优点.在构建重复数据删除系统时,如何利用这些新型存储设备的优势来提升和优化整体系统的性能是值得关注的问题
三、 数据同步算法Rsync
Rsync它能同步更新两处计算机的文件与目录,并适当利用差分编码以减少数据传输。rsync中一项与其他大部分类似程序或协议中所未见的重要特性是镜像对每个目标只需要一次发送。rsync可拷贝/显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。
1. 流程
假设现在有两台计算机Alpha和Beta ,计算机Alpha能够访问fileSrc文件,计算机Beta能够访问fileDst文件,文件A和B非常相似,计算机Alpha和Beta通过低速网络互联[5]。
假设我们同步源文件名为fileSrc,同步目的文件叫fileDst
1. 分块Checksum算法
Beta将文件fileDst的文件平均切分成若干个小块,比如每块512个字节(最后一块会小于这个数),
Beta对于fileDst每一个数据块,计算出两个校验值:
rolling checksum,是弱checksum,32位的checksum,其使用的是Mark Adler发明的adler-32算法,
强checksum,128位的,以前用md4,现在用md5 hash算法。
弱的checksum是用来区别不同,而强的是用来确认相同
2. 传输算法
Beta会把fileDst的一个checksum列表传给Alpha,这个列表里包括了三个东西,rolling checksum(32bits),md5checksume(128bits),文件块编号。
3. checksum查找算法
Alpha同步源端拿到fileDst的checksum数组后,会把这个数据存到一个hash table中,用rolling checksum做hash,以便获得O(1)时间复杂度的查找性能。这个hash table是16bits的,所以,hash table的尺寸是2的16次方,对rolling checksum的hash会被散列到0 到 -1中的某个整数值。若发生碰撞,把碰撞的做成一个链表就好
4. 比对算法,最关键的算法
如果我fileSrc这边在文件中间加了一个字符,这样后面的文件块都会位移一个字符,这样就完全和fileDst这边的不一样了,但理论上来说,我应该只需要传一个字符就好了。如何解决?rolling checksum解决这个问题。
4.1)取fileSrc的第一个文件块(我们假设的是512个长度),也就是从fileSrc的第1个字节到第512个字节,取出来后做rolling checksum计算。计算好的值到hash表中查。
4.2)如果查到了,说明发现在fileDst中有潜在相同的文件块,于是就再比较md5的checksum,因为rolling checksume太弱了,可能发生碰撞。于是还要算md5的128bits的checksum,这样一来,我们就有 的概率发生碰撞,这太小了可以忽略。如果rolling checksum和md5 checksum都相同,这说明在fileDst中有相同的块,我们需要记下这一块在fileDst下的文件编号。
4.3)如果fileSrc的rolling checksum 没有在hash table中找到,那就不用算md5 checksum了。表示这一块中有不同的信息。总之,只要rolling checksum 或 md5 checksum 其中有一个在fileDst的checksum hash表中找不到匹配项,那么就会触发算法对fileSrc的rolling动作。于是,算法会住后step 1个字节,取fileSrc中字节2-513的文件块要做checksum,go to (4.1) – 这就是rolling checksum。解决改变一个字符的问题。
4.4)这样,我们就可以找出fileSrc相邻两次匹配中的那些文本字符,这些就是我们要往同步目标端传的文件内容了。
过程示意图:
最终,在同步源这端,我们的rsync算法可能会得到下面这个样子的一个数据数组:
对于某些压缩文件使用rsync传输可能会传得更多,因为被压缩后的文件可能会非常的不同。
Rsync是一个非常优秀的工具,但它仍然存在一些不足之处。
Rolling checksum虽然可以节省大量checksum校验计算量,也对checksum搜索作了优化,但多出一倍以上的hash查找,这个消耗不小;
Rsync算法中,Alpha和Beta计算量是不对等的,Alpha计算量非常大,而Bete计算量非常小。通常Alpha是服务器,因此压力较大;
Rsync中数据块大小是固定的,对数据变化的适应能力有限。
RDC算法的典型代表是微软DFS中的DFSR(Distributed File System Replication),它与Rsync不同之处在于采用一致的分块规则对复制的源文件和目标文件进行切分。因此,RDC对于源端和目标端的计算量是对等的。RDC和RSync算法在设重点上有所不同,Rsync追求更高的重复数据发现而不惜计算量;RDC在两者之间作了一个折衷,目标是以少量的计算快速发现数据差异,当然重复数据发现不及Rsync。另外,Rsync是定长分块策略,而RDC是变长分块策略[4]。
2. 数据同步有PULL和PUSH两种应用模
PULL是将远程数据同步到本地,而PUSH是将本地数据同步到远程。对应到同步算法,主要区别在于数据分块和差异编码位置不同。PULL和PUSH同步模式步骤分别如下所述
PULL同步模式流程:
1、本地对文件A进行数据切分,生成数据块描述文件chunk;
2、上传chunk文件至远程服务器;
3、远程服务器对文件B进行差异编码,生成差异编码文件delta;
4、下载delta文件至本地;
5、本地同步文件A至文件B,相当于下载文件B到本地文件A。
PUSH同步模式流程:
1、远程服务器对文件B进行数据切分,生成数据块描述文件chunk;
2、下载chunk文件至本地;
3、本地对文件A进行差异编码,生成差异编码文件delta;
4、上传delta文件至远程服务器;
5、远程同步文件B到A,相当于上传文件A到远程文件B
四、 参考文献
1. 付印金, 肖侬, 刘芳. 重复数据删除关键技术研究进展[J]. 计算机研究与发展, 2012, 49(1): 12-20.
2. 陆游游, 敖莉, 舒继武. 一种基于重复数据删除的备份系统[J]. 计算机研究与发展, 2012,
3. 敖莉, 舒继武, 李明强. 重复数据删除技术[J].Journal of Software, 2010, 21(5): 916-929.
4.数据同步算法研究http://blog.csdn.net/liuaigui/article/details/5793706
5.rsync的核心算法http://coolshell.cn/articles/7425.html