1、Dedupe概述
De-duplication,即重复数据删除,它是一种目前主流且非常热门的存储技术,可对存储容量进行有效优化。它通过删除数据集中重复的数据,只保留其中一份,从而消除冗余数据。如下图所示。这种技术可以很大程度上减少对物理存储空间的需求,从而满足日益增长的数据存储需求。Dedupe技术可以带许多实际的利益,主要包括以下诸多方面:
(1) 满足ROI(投资回报率,Return On Investment)/TCO(总持有成本,Total Cost of Ownership)需求;
(2) 可以有效控制数据的急剧增长;
(3) 增加有效存储空间,提高存储效率;
(4) 节省存储总成本和管理成本;
(5) 节省数据传输的网络带宽;
(6) 节省空间、电力供应、冷却等运维成本。
Dedupe技术目前大量应用于数据备份与归档系统,因为对数据进行多次备份后,存在大量重复数据,非常适合这种技术。事实上,dedupe技术可以用于很多场合,包括在线数据、近线数据、离线数据存储系统,可以在文件系统、卷管理器、NAS、SAN中实施。Dedupe也可以用于数据容灾、数据传输与同步,作为一种数据压缩技术可用于数据打包。Dedupe技术可以帮助众多应用降低数据存储量,节省网络带宽,提高存储效率、减小备份窗口,节省成本。
Dedupe的衡量维度主要有两个,即重复数据删除率(deduplocation ratios)和性能。Dedupe性能取决于具体实现技术,而重复数据删除率则由数据自身的特征和应用模式所决定,影响因素如下表[2]所示。目前各存储厂商公布的重复数据删除率从20:1到500:1不等。
高重复数据删除率 | 低重复数据删除率 |
数据由用户创建 | 数据从自然世界获取 |
数据低变化率 | 数据高变化率 |
引用数据、非活动数据 | 活动数据 |
低数据变化率应用 | 高数据变化率应用 |
完全数据备份 | 增量数据备份 |
数据长期保存 | 数据短期保存 |
大范围数据应用 | 小范围数据应用 |
持续数据业务处理 | 普通数据业务处理 |
小数据分块 | 大数据分块 |
变长数据分块 | 定长数据分块 |
数据内容可感知 | 数据内容不可知 |
时间数据消重 | 空间数据消重 |
2、Dedupe实现要点
研发或应用Dedupe技术时应该考虑各种因素,因为这些因素会直接影响其性能和效果。
(1) What:对何种数据进行消重?
对时间数据还是空间数据进行消重,对全局数据还是局部数据进行消重?这是首先需要考虑的因素,这直接决定着Dedupe实现技术和数据消重率。随时间变化的数据,如周期性的备份、归档数据,比空间数据具有更高的消重率,Dedupe技术在备份归档领域中被广泛应用。不难想象,全局范围内的数据重复率比局部范围数据要高,会获得更高的数据消重率。
(2) When:何时进行消重?
数据消重时机分为两种情形:在线消重和离线消重。采用在线消重模式,数据写入存储系统同时执行消重,因此实际传输或写入的数据量较少,适合通过LAN或WAN进行数据处理的存储系统,如网络备份归档和异地容灾系统。由于它需要实时进行文件切分、数据指纹计算、Hash查找,对系统资料消耗大。离线消重模式,先将数据写入存储系统,然后利用适当的时间再进行消重处理。这种模式与前面一种刚好相反,它对系统资料消耗少,但写入了包含重复的数据,需要更多的额外存储空间来预先存储消重前数据。这种模式适合直连存储DAS和存储区域网络SAN存储架构,数据传输不占用网络带宽。另外,离线消重模式需要保证有足够的时间窗口来进行数据去重操作。总之,在何时进行消重,要根据实际存储应用场景来确定。
(3) Where:在何处进行消重?
数据消重可以在源端(Source)或者目标端(Target)进行。源端消重在数据源进行,传输的是已经消重后的数据,能够节省网络带宽,但会占用大量源端系统资源。目标端消重发生在目标端,数据在传输到目标端再进行消重,它不会占用源端系统资源,但占用大量网络带宽。目标端消重的优势在于它对应用程序透明,并具有良好的互操作性,不需要使用专门的API,现有应用软件不用作任何修改即可直接应用。
(4) How:如何进行消重?
重复数据删除技术包含许多技术实现细节,包括文件如何进行切分?数据块指纹如何计算?如何进行数据块检索?采用相同数据检测还是采用相似数据检测和差异编码技术?数据内容是否可以感知,是否需要对内容进行解析?这些都是Dedupe具体实现息息相关。本文主要研究相同数据检测技术,基于二进制文件进行消重处理,具有更广泛的适用性。
3、Dedupe关键技术
存储系统的重复数据删除过程一般是这样的:首先将数据文件分割成一组数据块,为每个数据块计算指纹,然后以指纹为关键字进行Hash查找,匹配则表示该数据块为重复数据块,仅存储数据块索引号,否则则表示该数据块是一个新的唯一块,对数据块进行存储并创建相关元信息。这样,一个物理文件在存储系统就对应一个逻辑表示,由一组FP(指纹)组成的元数据。当进行读取文件时,先读取逻辑文件,然后根据FP序列,从存储系统中取出相应数据块,还原物理文件副本。从如上过程中可以看出,Dedupe的关键技术主要包括文件数据块切分、数据块指纹计算和数据块检索。
(1) 文件数据块切分
Dedupe按照消重的粒度可以分为文件级和数据块级。文件级的dedupe技术也称为单一实例存储(SIS, Single Instance Store),数据块级的重复数据删除其消重粒度更小,可以达到4-24KB之间。显然,数据块级的可以提供更高的数据消重率,因此目前主流的dedupe产品都是数据块级的。数据分块算法主要有三种,即定长切分(fixed-size partition)、CDC切分(content-defined chunking)和滑动块(sliding block)切分。
定长分块算法采用预先义好的块大小对文件进行切分,并进行弱校验值和md5强校验值。弱校验值主要是为了提升差异编码的性能,先计算弱校验值并进行hash查找,如果发现则计算md5强校验值并作进一步hash查找。由于弱校验值计算量要比md5小很多,因此可以有效提高编码性能。定长分块算法的优点是简单、性能高,但它对数据插入和删除非常敏感,处理十分低效,不能根据内容变化作调整和优化
该方法存在的主要问题是:当向数据对象中插入数据或者从中删除数据时,会导致数据块边界无法对齐,严重地影响重复数据删除的效果。如图3所示,数据对象的版本1生成了n个定长数据块D1、D2……Dn。版本2在版本1的基础上插入了部分内容(阴影部分所示)。对版本2分块产生的数据块D1、D'2……D'n中,只有D1是重复的数据块,D'2……D'n都不是重复的数据块,使得数据对象中从插入位置到结尾的重复数据都无法被消除,影响了消冗率。
CDC(content-defined chunking)算法是一种变长分块算法,它应用数据指纹(如Rabin指纹)将文件分割成长度大小不等的分块策略。与定长分块算法不同,它是基于文件内容进行数据块切分的,因此数据块大小是可变化的。算法执行过程中,CDC使用一个固定大小(如48字节)的滑动窗口对文件数据计算数据指纹(Rabin指纹算法)。如果指纹满足某个条件,如当它的值模特定的整数等于预先设定的数时,就将该窗口的开始位置作为数据块的结尾,这样通过不断滑动窗口并计算指纹实现对数据对象的分块。CDC算法可能会出现病态现象,即指纹条件不能满足,块边界不能确定,导致数据块过大。实现中可以对数据块的大小进行限定,设定上下限,解决这种问题。CDC算法对文件内容变化不敏感,插入或删除数据只会影响到检少的数据块,其余数据块不受影响。CDC算法也是有缺陷的,数据块大小的确定比较困难,粒度太细则开销太大,粒度过粗则dedup效果不佳。如何两者之间权衡折衷,这是一个难点。
如图4所示。对于每一个划分得到的数据块,就可以通过比较其哈希值来确定重复的数据块,具体过程与上面描述的相同。
因为数据块是基于内容而不是基于长度确定的,因此能够有效地解决上述问题。当数据对象中有内容插入或者删除时,如果插入或者删除的内容不在边界滑动窗口区域,该边界不会改变;当插入的内容产生一个新的边界时,一个数据块会分成两个数据块,否则数据块不会变化。如果变化的内容发生在滑动窗口内,可能会破坏分界数据块,导致两个数据块合成一个数据块,或者两个数据块之间的边界发生变化,产生新的数据块。因此,插入或者删除内容只影响相邻的一个或者两个数据块,其余数据块不会受影响,这就使得该方法能够检测出对象之间更多的重复数据。如图5所示,当文件中插入部分内容后,分块时将该内容划分到一个数据块中,保持其后续的数据块不变,从而保证后面重复的数据块都能够被删除。
滑动块(sliding block)算法结合了定长切分和CDC切分的优点,块大小固定。它对定长数据块先计算弱校验值,如果匹配则再计算md5强校验值,两者都匹配则认为是一个数据块边界。该数据块前面的数据碎片也是一个数据块,它是不定长的。如果滑动窗口移过一个块大小的距离仍无法匹配,则也认定为一个数据块边界。滑动块算法对插入和删除问题处理非常高效,并且能够检测到比CDC更多的冗余数据,它的不足是容易产生数据碎片。
CDC分块算法解决了字节插入和删除的问题,但是引入了变长块的存储问题。在存储系统中,变长块的存储组织比较复杂。针对该问题,出现了基于滑动块重复数据删除检测消除方法。该方法如图6所示,解决了定长块和内容划分块所存在的问题。
滑动块方法采用了Rsync Checksum算法和滑动窗口(滑动窗口大小是固定的)方法进行分块。Rsync Checksum算法具有计算速度快、效率高的优点。计算的Checksum值与以前存储的Checksum值进行比较,如果匹配,则与计算数据块的SHA-1值进行比较来检测重复数据。如果发现重复数据块,则将重复数据块记录下来,并移动滑动窗口滑过该重复块,继续进行重复数据检测。另外,还要将从上个块结尾到新检测的重复块之间的数据块记录并存储下来。当Checksum值或者哈希值没有匹配上,继续数据检测过程。如果在发现重复块之前滑动窗口移动的距离达到定长块的长度,则计算该块的哈希值,并将该值存储下来供将来的数据块进行校验。
滑动块方法通过检测对象的每一个块解决数据插入问题。如果部分内容插入数据对象,只有周围的块发生变化,后面的块仍然能够通过该算法识别和检测。同理,当删除部分内容时,该部分内容之后的数据块不会受到影响,仍然可以采用该方法进行检测。
Deduputil中SB分块算法代码如下。
(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算法来为数据块计算指纹。
(3) 数据块检索
对于大存储容量的Dedupe系统来说,数据块数量非常庞大,尤其是数据块粒度细的情况下。因此,在这样一个大的数据指纹库中检索,性能就会成为瓶颈。信息检索方法有很多种,如动态数组、数据库、RB/B/B+/B*树、Hashtable等。Hash查找因为其O(1)的查找性能而著称,被对查找性能要求高的应用所广泛采用,Dedupe技术中也采用它。Hashtable处于内存中,会消耗大量内存资源,在设计Dedupe前需要对内存需求作合理规划。根据数据块指纹长度、数据块数量(可以由存储容量和平均数据块大小估算)可以估算出内存需求量。
重复数据删除的性能提升技术
重复数据删除技术在提高存储空间利用率的同时,为系统数据访问性能带来了一定影响。这是因为重复数据的检测过程序要耗费大量的系统资源,严重影响了存储系统访问性能。针对该问题,目前也出现了一系列的解决方案。
针对内存空间无法容纳所有数据索引的问题,Data Domain采用了三级查询机制[11]:Bloom Filter过滤、Hash缓冲查询和Hash文件查询。首先在内存中的Bloom Filter中进行查找。一个Bloom filter用一个m位向量来概括在块索引中n个块指纹值的存在信息。如果Bloom filter指出这个块不存在,则这个块一定不存在。如果Bloom filter指出该数据块存在,表明该数据块可能存在,再到Hash缓存中进行查找,如果存在则说明该数据块存在,否则再到磁盘上去查询。对于数据在磁盘上的组织采用了基于流的块排列技术,以有效利用数据的局部特性,提高缓存的命中率。
针对数据访问局部性特征不明显的系统,研究者提出了基于文件相似性的特点来降低重复数据删除过程中的查询次数,以提高重复数据删除性能;另外,有人也采用了两阶段的重复数据删除机制[12],通过将随机的小磁盘I/O调整为序列化的大的磁盘I/O提高重复数据删除的吞吐率;还有人采用了两层次的索引技术来降低磁盘I/O次数[13],提高重复数据删除的吞吐率。
分析现有技术可以看出,提高重复数据删除吞吐率的关键是降低磁盘I/O次数。现有方法都是通过各种策略来尽量减少数据块检索过程中磁盘的I/O次数。
4、Dedupe数据安全
这里的数据安全包含两个层面的含义:一是数据块碰撞,二是数据可用性。这两种安全性对用户来说都是至关重要的,必须事先考虑。
数据块指纹FP(FingerPrinter)通常使用Hash函数来计算获得,如MD5、SHA1、SHA-256、SHA-512等。从纯数学角度看,如果两个数据块指纹不同,则这两个数据块肯定不同。然而,如果两个数据块指纹相同,我们则不能断定这两个数据块是相同的。因为Hash函数会产生碰撞,山东大学的王小云教授所带领的团队已经找到快速产生碰撞的方法。但是,这种碰撞的概率是非常非常小的,小到甚至低于磁盘发生损坏的概率,因此通常近似认为:如果数据块指纹相同,则数据块相同。由于数据产生碰撞可能性的存在,Dedupe技术很少被用于关键数据存储的应用场合,一旦发生碰撞将产生巨大的经济损失。针对这种问题,目前主要有两种解决路径:一是对数据指纹相同的块进行字节级完全比较,它的难点在于数据块原始数据有时难以方便获得,另外性能会产生一定损失。本人开发的开源软件deduputil采用就是这种策略,详见deduputil数据块零碰撞算法。二是最大可能降低碰撞产生的概率,即采用更优的Hash函数(如SHA-512, SHA-1024),或者采用两种以上hash算法组合方式,这显然会对性能造成影响。本人在"数据同步算法研究"中采用的是该种方法,为每个数据块计算两个指纹,一个类似Rsync算法中的弱校验值(Rsync滚动校验算法)和一个强校验值MD5。弱校验值计算消耗远小于MD5计算量,先计算目标数据块的弱校验值,如果与源数据块不同则不必再计算其MD5校验值,相同则计算MD5并作比较。这种方式以较小的性能代价极大地降低了碰撞产生的概率,而且通过优化,性能损失无几。
Dedupe仅保存唯一的数据副本,如果该副本发生损坏将造成所有相关数据文件不可访问,数据可用性压力要高于不作Dedupe许多。数据可用性问题可以采用传统数据保护方法来解决,常用的方式包括数据冗余(RAID1,RAID5, RAID6)、本地备份与复制、远程备份与复制、纠错数据编码技术(如海明码、信息分散算法IDA)、分布式存储技术。这些技术均可以有效消除单点故障,从而提高数据可用性。当然,这需要付出一定代价,以空间换取安全性。
5 重复数据删除技术的应用
5.1 数据备份系统
重复数据删除技术为数据保护领域带来革命性突破,有效地改善了磁盘数据保护的成本效益。因为在传统数据保护中无法实现重复数据删除,往往采用廉价的磁带库作为备份设备,而磁带备份在备份窗口、恢复速度方面难以满足用户的需求。现在,基于磁盘的数据保护方案如虚拟磁盘库(VTL)被广泛采用,并且在未来会继续增长。备份到VTL或其他基于磁盘的备份已经缩小了备份窗口,改善了备份和恢复能力,但由于数据量的不断增加,人们所要备份的数据越来越多,面临容量膨胀的压力。重复数据删除技术的出现,为最小化存储容量找到有效的方法。
5.2 归档存储系统
重复数据删除技术对归档存储非常重要。由于参考数据的数量不断增长,而法规遵从要求数据在线保留的时间更长,并且由于高性能需求需要采用磁盘进行归档,因此,企业一旦真正开始进行数据的归档存储就面临成本问题。理想的归档存储系统应能满足长期保存归档数据的需求,并且总拥有成本也要低于生产环境。重复数据删除技术通过消除冗余实现高效率的归档存储,从而实现最低的成本。目前,归档存储系统的重复数据删除技术主要是基于Hash的方法,产品的销售理念是以内容寻址存储(CAS)技术为主,分为纯软件和存储系统两类
5.3 远程灾备系统
在远程灾备系统中,需要将大量的数据迁移到异地的系统中。随着数据量的不断增长,数据传输的压力越来越大,通过重复数据删除技术在数据传输前检测并删除重复的数据,可以有效地减少传输的数据量,提高数据传输速度,例如飞康的MicroScan软件就采用了该技术
相似数据重复数据删除技术
除了通过删除完全相同的数据可以实现数据消冗外,还可以通过相似数据的检测与编码节省存储空间,提高存储空间的利用率。相似数据重复数据删除包括相似数据检测和编码两个阶段。相似数据检测技术有以下3种。
Shingle检测技术通过为每个文档提取一组特征[9],从而将文档相似性问题简化为集合相似性问题。Shingle检测技术简单易实现,适用范围广,但它的计算开销很高,而且检测相似数据的精度取决于Shingle的取样技术,容易出现较大的偏差。
Bloom Filter是一种用位数组表示的集合[10],支持查询某个元素是否在该集合当中。Bloom Filter弥补了Shingle检测技术难度高计算开销大的缺陷,在性能和相似数据精度之间取得了平衡。Bloom Filter进行数据匹配是通过位操作的,所以可以快速匹配,而且计算开销很小。
通过模式匹配挖掘数据的特征,也可以进行相似数据的检测。模式匹配技术的匹配算法是利用一定数量的公共字串来进行文件间的相似性查找与判别。该检测技术需要对整个文件扫描,所以开销也比较大。
在相似数据检测技术基础上,对有较大相似度的数据进行编码处理,同样能为整个系统节省大量的存储空间。相似数据压缩技术存在着编码效率和适用范围的问题。
参考:
http://blog.csdn.net/liuaigui/article/details/5166538