数据重删和数据压缩主流技术分析

数据压缩

随着计算能力的不断提升,当代社会正在产生越来越巨量的数据,数据压缩也被应用在生活的方方面面,如在网上打开的图片、视频、音频等都是经过压缩的。

压缩可以分为无损压缩和有损压缩。无损压缩可以通过压缩文件完全恢复原始文件;而有损压缩则会丢失一部分信息。对于文本、可执行程序的压缩是无损压缩的典型应用场景,因为任何一点信息的缺失都是不被允许的。有损压缩在图片、音频、视频方面被广泛应用,因为人们对于损失的部分信息并不敏感。有损并不意味着信息是被随机丢弃的,而是选择丢弃对恢复影响最小的部分。有损压缩既提高了效率,又保证了接受度。

这里主要讨论无损压缩。压缩的意义在于,使压缩文件在存储时占用的体积更小,传输时使用的带宽(Bandwidth)更少,传输速度更快。

本文章不会介绍具体的技术细节,仅是概述性介绍当前主流的重删和压缩技术。前面的文章介绍过哈夫曼编码,LZ77算法,后面还是会有专门文章介绍定长重删和不定长重删技术细节。

1.数据压缩基础

压缩的本质是用更小的数据量表示更多的数据。无损压缩通常通过对数据中的冗余信息的处理来减小数据体积,因此是可逆的。无损压缩可实现的基础是真实世界的数据存在大量冗余,而通过对数据进行编码,就能尽量减少这种冗余。我们会讨论两种应用广泛的编码方式。

1)霍夫曼编码

霍夫曼编码是一种用于无损数据压缩的熵编码。熵编码,是指对出现的每个不同符号,创建分配一个唯一的前缀码。前缀码是一种可变长度码,并且每个码字都具有前置性,即每个码字都不会被其他码字作为前置部分。

霍夫曼编码的原理是,为出现频率更高的字符分配更短的编码。通过这种方式,可以减少平均自信息量,使编码长度趋于信息熵。目前广泛使用的压缩算法(Compression Algorithm)都是使用霍夫曼编码作为编码方式的,如文件压缩格式gzip、PKZIP,以及图片压缩格式PNG、JPEG等。

2)算术编码

算术编码是一种应用在无损数据压缩领域的熵编码。和其他熵编码不同的是,算术编码可以把整条信息编码成一个一定精度的小数q(0.0≤q<1.0),如霍夫曼编码为一条信息中每个字符至少分配一个符号。

算术编码的基本原理是根据信源发射不同符号的概率,对区间[0,1]进行划分,区间宽度代表各符号出现的概率。通过下边的例子,可以有更清楚的理解。假设某个信源发射信号a1、a2、a3的概率分别为P(a1)=0.7、P(a2)=0.1、P(a3)=0.2,这个信源发送的信息是a1、a2、a3,使用算术编码的编码过程如图所示。那么a1、a2、a3这个信息就可以用[0.5460, 0.5600]这个区间中的任何一个数字来表示。

算术编码是到目前为止编码效率最高的一种统计熵编码方式,比霍夫曼编码效率高10%左右。但由于其编码的复杂性、实现技术的限制及专利权的限制,并不像霍夫曼编码那样应用广泛。算术编码有两点优于霍夫曼编码:①符号更紧凑;②编码和符号的统计模型是分离的,可以和任何一种概率模型协同工作。

算术编码是一种高效清除字符串中冗余信息的算法,可以按分数比特位逼近信源熵,突破了霍夫曼编码只能按整数比特位逼近信源熵的限制。但是算术编码的实现有一个缺陷就是很难在具有固定精度的计算机上完成无限精度的浮点运算。对于有限精度的计算机系统,最终区间会收敛到一个点,无法再细分。因此,需要解决无限序列和有限精度之间的矛盾,通过对区间进行动态调整来保证区间不会收敛到一个点,同时这种调整又不能使编码和解码引入歧义。因此,带有区间调整算法的算术编码和基于整数的算术编码就被提了出来,这两种编码都是通过对缩减后的区间进行重新映射。非对称数字系统(Asymmetric Numeral System,ANS)就使用了这种思想,并且在Facebook的Zstandard 压缩库中已经做了代码实现。

2.Linux下开源数据压缩软件

目前,越来越多优秀的开源数据压缩软件出现在大众的视野中,这些开源数据压缩软件不仅免费,还提供了多种数据压缩算法,并且支持多种存储格式,因此被越来越多的用户接受。下面介绍常见的开源数据压缩软件。

1)FreeArc

FreeArc是一个开源的数据压缩软件,集成了多种数据压缩算法(如gzip、Multimedia、TrueAudio、Tornado、LZMA(Lempel-Ziv-Markov chain-Algorithm)、PPMD)和过滤器(如BCJ、DICT、DELTA、REP、LZP)。另外,FreeArc会根据文件类型自动选择最优的数据压缩算法,并支持数据恢复及算法加密(如AES +Twofish + Serpent)。FreeArc是目前压缩效率较高的数据压缩软件之一。

2)7-Zip

7-Zip是一款开源数据压缩软件,其特点是使用了LZMA与LZMA2算法的7z格式,具有非常高的压缩比。另外,7-Zip为7z与ZIP提供了更加完善的AES-256加密算法。7-Zip支持多种压缩/解压缩格式,如7z、gzip、ZIP、bzip2、XZ、TAR、WIN等。同时,7-Zip也支持其他格式文件的压缩/解压缩,如ARJ、CAB、CHM、cpio、Cramfs、DEB、DMG、FAT、HFS、ISO、LZH、LZMA、MBR、MSI、NSIS、NTFS、RAR、RPM、SquashFS、UDF、VHD、WIM、XAR、Z。对于ZIP及gzip格式的文件,7-Zip能够提供的压缩比比使用PKZIP和WinZip高2%~10%。

3)Snappy

Snappy是由Google开源的压缩/解压缩软件,具有快速、稳定的特点,一直被用于Google的产品当中。它的目标不是最大限度地兼容其他压缩格式,而是提供高速的压缩速度和合理的压缩比。例如,Snappy在64位的i7处理器上,可达约250MB/sec的压缩速度、500MB/sec的解压缩速度。相对于zlib,Snappy能够提供更快的压缩速度,但同时压缩后的文件大小相对来说会增大20%~100%。

重复数据删除

重复数据删除(DEDUPE)在存储备份系统中有很重要的应用,有利于更高效地利用存储空间。重复数据删除在维基百科上的定义为“一种可粗粒度去除冗余数据的特殊数据压缩技术”,明确的解释了重复数据删除和数据压缩之间的联系。

通俗地讲,数据压缩一般通过字符串或比特级的操作来去除冗余数据,然而重复数据删除判断数据冗余的粒度较大,一般是文件级别或块级别的匹配,其目标是达到性能和去重复比例的平衡。

为何需要进行重复数据删除呢?数据的快速增长是对数据中心最大的挑战,爆炸式的数据增长会消耗巨大的存储空间,这会迫使数据提供商去购买更多的存储,然而即使这样却未必能赶上数据的增长速度。这样的现实迫使我们去考虑一些问题:产生的数据是不是都被生产系统循环使用?如果不是,是不是可以把这些数据放到廉价的存储系统中?怎么让数据备份消耗的存储更低?怎么让备份的时间更短?数据备份后,可以保存的时间有多久(物理介质原因)?备份后的数据能不能正常取出?

在实际情况中,和生产系统连接的备份系统一般每隔一段时间就会对生产系统做一次主备份,即备份生产系统中的所有内容。在两次主备份之间有很多增量式备份,且生产系统和备份系统的工作时间一般来讲是互斥的。当然如果生产系统需要持续运行,那么备份系统则需要在生产系统相对空闲的时间来工作。也就是说,备份系统的工作时间是有限制的,一般这个时间被称为备份窗口。需要被备份的数据必须在这个时间全部被迁移到备份系统中,这就对备份系统的吞吐率提出了要求。

那么怎么提高备份系统的吞吐率呢?纯粹更换硬件是一种方法。例如,10年前,主流的备份系统用的是磁带,其局限性在于吞吐率不够而且只支持顺序读/写。为满足吞吐率方面的需求,主流的备份系统的后端存储开始采用磁盘。

用于备份的数据,或者多次备份过来的数据可能是相似的,如果我们不是机械化地去备份这些数据,而是有意识地识别其中冗余的数据,然后对相同的数据只备份一份或少数几份(出于数据可靠性方面的考虑),那么这种方法不仅减少了备份系统所需要的容量,还减少了备份时对带宽的使用。举一个现实的例子,邮件系统中有很多群发邮件,其内容相同,特别是附件。试问邮件备份系统中需要将用户的相同附件都保存一份吗?答案显然是不必要的。邮件系统的例子体现出重复数据删除的作用,不过邮件系统所用的重复数据删除比较简单,主要针对的是相同的文件。

简言之,文件级别的重复数据删除有很大的局限性。最浅显的问题就是:如果文件内容只是略微有些不同,那要怎样进行数据去重呢?换句话说,文件级别的粒度太大,而粒度太小就变成了常用数据压缩技术,也不太合适。所以我们需要的是粒度适中的,如大小平均在8KB左右(经验值)。这样的重复数据删除能让空间(数据去重比率)和时间(备份性能)达到一个最佳的平衡点。

综上所述,重复数据删除一般用于备份系统中(或二级存储)。衡量一个应用重复数据删除的备份系统是不是优秀,有以下几个主要特征。

· 数据去重复率。数据去重复率越大越能减少备份系统存储方面的压力,同时在二次或多次数据备份的时候,越能减少对网络带宽的使用。

· 吞吐率。使用了数据去重技术后,备份时间是否显著缩短。根据前面所说的,对于很多生产系统来讲,备份窗口时间有限。如果数据吞吐率不高,即使再高的数据压缩比,也很难被采用。

· 数据的可靠性。这是指经过重复数据删除处理后的数据在进行灾难恢复时,数据能否被正常恢复,因为去重后的数据已经不是原来的数据了。这一点往往被外行人忽略,但是一个好的数据备份厂商,一定会重视这个问题。试想如果去重后的数据在某些情况下不能被正常恢复,那又何必应用重复数据删除做数据备份呢?

· 备份过程的安全性。对于企业内部或私有云,基本上默认在数据备份过程中不会出现安全方面的问题,如数据窃取。但是如果将重复数据删除技术作为一个由第三方提供的服务,那么安全问题就需要被重视。

1.重复数据删除的分类

上面简单地介绍了重复数据删除技术,这里稍微讲一下重复数据删除的主流分类,以便读者能够更好地理解重复数据删除。

1)分类一

重复数据删除根据应用的位置,可分为源端重复数据删除和目标端重复数据删除两种,其中源端指备份数据的来源;目标端指备份系统。所谓源端重复数据删除是指在源端判断数据重复的工作。例如,用户在上传某数据的时候,可以操作以下步骤。

(1)使用单向函数(某些哈希算法)生成需要上传的数据的指纹(Fingerprint);

(2)把指纹发送到备份系统,等待确认;

(3)位于目标端的备份系统,判断是否存在相似的数据,给源端返回数据是否存在的信息;

(4)源端接收信息后,决定是否上传数据。

源端重复数据删除的好处显而易见,如果数据已经被备份过了,则不需要将数据再传送给备份系统。当然源端数据去重复,性能未必一定高,在确认数据交换的时候,需要传送大量的指纹(每块数据都会保留一个“指纹”,为了保证指纹的唯一性可以使用比较好的哈希算法),这是一笔不小的开销。

此外,如果源端是不可信的,则可能将引起某些安全问题。试想以下应用场景:假设一个备份系统中存有很多用户的工资信息,每个用户都有一个工资单,且工资单的模板都是一样的,那么某些用户就可以去探测其他人的工资信息,假设工资单中含有的信息是用户姓名、工号、工资,如果用户A知道用户B的姓名、工号,想要猜测对方的工资,只要在源端生成相关文件,然后上传给备份系统,一旦发现生成的文件没有被上传,即可确定B的工资。虽然这种攻击是非常耗时的,但是在理论上完全存在这种可能性。

和源端重复数据删除相对应的是目标端重复数据删除,在这种情况下,源端只要把数据上传给位于目标端的备份系统即可,源端甚至感受不到重复数据删除技术的存在。所有的数据都会通过网络或其他传输机制交给备份系统,备份系统对接收的数据统一地应用重复数据删除技术。相比源端重复数据删除,目标端重复数据删除虽然对传输数据的网络带宽占据较大,但是也有很多好处:客户端完全透明,去除了安全方面的隐患,也不用对客户端做维护工作,如版本升级;去重复数据都在目标端,使得管理集中,可进行全局的去重复,可称为一个相对独立的系统。

2)分类二

根据数据在备份系统中进行重复数据删除的时间发生点,分为离线(Post-process)重复数据删除和在线(Inline)重复数据删除两种。

离线重复数据删除,是指在用户数据上传的过程中,数据去重复并不会发生,直接写到存储设备上;当用户数据上传完全结束后,再进行相关的数据去重复工作。这样的方式可以理解成那些有很多胃的食草动物(如牛),先把食物吃到胃中,然后在某个时间点再进行反刍,以完全消化食物。有反刍能力的食草动物一般有多个胃,对应到备份系统中,就是至少需要两个存储设备。试想如下的场景:用户的备份数据是1PB,备份系统需要的存储至少要大于1PB。其中第一个存储设备大小为1PB,用于存储用户上传的数据,另外一个存储设备大小为X(X为应用重复数据删除后的数据大小,为0~1PB)。这样的去重复手段,相信读者一定会看出其中的问题,即为了确保重复数据删除能正常进行,最差的情况下会有100%的额外存储资源消耗。

为了解决这个问题,在线重复数据删除技术应运而生。所谓在线重复数据删除,就是在用户数据通过网络上传到备份系统的时候,数据去重复就会发生。用户的数据会被重复数据删除子系统分成不同的部分,每个部分视为一个块(Chunk)或切片,每个数据切片会被计算一个相应的指纹,然后通过指纹去查找相关数据切片是否存在,一旦存在,这个数据切片就不会被写入真实的存储设备中。但这一过程对CPU和内存的消耗是非常高的。

虽然存储某个数据需要先查找数据切片是否存在,但是如果能找到这个数据切片,则避免了大量外部存储写操作,以及过多的存储(磁盘I/O)的操作时间,反而提高了备份的速度。另外,多次备份的内容存在很大的相似性,这带来的好处是非常可观的,因此,在线重复数据删除同时“压榨”CPU、内存、网络、存储I/O等模块,使得整个系统的资源能被更好地利用,与离线重复数据删除相比是一个不小的进步。

当然重复数据删除还有很多其他分类,如根据目标端的备份系统可分为单机重复数据删除或分布式重复数据删除,不再一一赘述。

2.深入理解重复数据删除

这里将深入地讨论重复数据删除,以帮助读者了解重复数据删除是怎么应用到备份系统中,并使得备份吞吐率、去重复比率、数据的完整和安全性都能得到满足的。

1)数据切片算法

开始的时候,我们就谈到重复数据删除只是一种数据切片级别的特殊数据压缩技术。一般来讲,数据被切成数据切片有两种分类:定长(Fixed Size)和变长(Variable Size)。

定长就是把一个接收到的数据流或文件按照相同的大小切片,每个数据切片都有一个独立的指纹。从实现角度来讲,定长文件的切片实现和管理比较简单,但是数据的去重复比率比较低。这个也是容易理解的,因为每个数据切片在文件中都有固定的偏移。在最坏的情况下,如果一个文件在文件开始处增加或减少一个字符,将导致所有数据切片的指纹发生变化。最差的结果是备份两个仅差一个字符的文件,导致重复数据删除率等于零。这显然是不可接受的。

为此变长技术应运而生,变长不是简单地根据数据偏移来划分数据切片的,而是根据“Anchor”(某个标记)来划分数据切片的。因为寻找的是特殊的标记,而不是数据的偏移,所以能完美地解决定长数据切片中由于数据偏移略有变化而导致的低数据去重复比率。

那么变长技术中的“Anchor”究竟是怎么确定的呢?一般使用基于内容的分片(Content Defined Chunking,CDC)算法使用滑动窗口技术(Sliding Window Algorithm)来确定数据切片的大小。窗口的大小一般是12~48字节,根据经验值,数据切片大小为8KB时对数据去重复是比较有效的。常用的数据切片算法是利用RabinHash算法计算滑动窗口的指纹进行切片。如果获得的指纹满足预先设定的条件,则这个窗口的位置是一个切分点,两个切分点之间的数据被认为是一个切片。RabinHash算法有很多开源实现,比较早的应用在MITPdos研究组的Pastwatch项目中有相应的源码下载。

当然RabinHash算法也有局限性,在理想情况下,使用RabinHash算法产生的切片大小(按照数学期望)是比较均匀的,但是实际情况往往不是这样的。可能会出现以下的问题:①出现很多小切片,这将导致管理数据切片的代价变大(一般使用树状索引);②数据切片太大,影响数据去重复的效果。

为了解决这两个问题,研究人员提出了一些改进的方法。例如,在NEC的一篇文章中,作者提出了双峰算法,其主要思想是进行二次切片。对于大的数据切片可能继续采取一些分片操作,对于小的切片可能采取切片合并操作。此外HP实验室在A Framework for Analyzing and Improving Content-Based Chunking Algorithms中也提供了一个框架来分析一些常用的基于内容的分片算法,并且提出了一个新的基于内容的分片算法——TTTD(Two Thresholds Two Divisors Algorithm)。其中,Two Thresholds是指规定切片的大小只能在上下界限之间。Two Divisors是指使用RabinHash算法来确定分界的时候有两个值可选:主Divisor和备份Divisor。当使用主Divisor时如果找不到分界点,则备份Divisor的条件不能被满足。此外在NEC发表的文章Improving Duplicate Elimination in Storage Systems中还提出了一种名为fingerdiff的新切片算法。

2)高效删除重复数据

数据切片算法是重复数据删除技术中比较重要的一部分,但只依赖于数据切片算法是远远不够的。前面我们提到衡量数据去重复有两个重要指标:数据去重复率和吞吐率。很多研究表明数据切片越小去重复率越高,但是会导致低吞吐率;反之,数据切片越大去重复率越低,但是吞吐率越高。为此要求应用重复数据删除的系统必须选择合适的切片大小,以在去重复率和吞吐率之间达到一个动态平衡,数据切片大小对数据去重复率和吞吐率的影响如图所示。

在在线数据去重中,怎样在数据切片后根据数据切片的指纹,高效地在数据切片管理系统中查询或建立新的数据切片索引是提高吞吐率的关键所在。一般来讲,数据是通过网络传输过来的,然后指纹的计算会消耗大量的CPU,指纹的查询会占用大量的内存和进行过多的磁盘操作。因此,整个在线去重复系统就是高效利用了网络、CPU、内存和磁盘4个模块。

例如,Avoiding the Disk Bottleneck in the Data Domain Deduplication File System论文中所描述的DDFS就采用了以下技术来提高数据的吞吐率。

· 摘要向量技术(Summary Vector),对于切片的指纹查询引入了Bloom Filter技术,使用Bloom Filter的好处在于没有假负率(False Negative)。只要在Bloom Filter中找不到,直接就能说明这个指纹不存在。

· 基于流的块排列技术(Streaming Informed Segment Layout,SISL)的前提是如果备份过一次数据流后出现非常相似的数据流,那么对于某个数据流,其应该作为一个整体来考虑,和该数据流相关的切片和指纹应该尽量集中放置在某几个容器(Container)中。在DDFS中,每个容器大小定长,均存储了数据切片和相关的指纹。

· 局部性保持技术(Locality Preserved Cache,LPC)把数据切片和指纹与容器保持一个映射关系。这样的好处在于,如果备份的数据流是有空间局部性的,那么把一个数据指纹加载到内存中时,和这个数据指纹位于同一个容器中的指纹会一起被下载到内存中,后续数据切片的指纹就能直接在内存中找到了,避免了不必要的外部I/O操作。此外内存使用最近最少使用(Least Recently Used,LRU)算法管理容器。

客观来讲,DDFS所使用的策略是非常有效的,这使得整个数据重复删除的效率非常高,为此在工业界,Data Domain公司的产品从目前来讲领先于其他同类产品,占据了很大的市场份额。

当然除了在软件上优化指纹的查找,很多研究人员也从硬件方面考虑问题。我们知道,计算指纹(一般使用哈希算法,如SHA1)需要消耗大量的CPU。为此可以引入其他物理器件,如GPU,从而释放CPU的计算能力。

3)数据可靠性

当人们把过多目光放在重复数据删除的去重复率和吞吐率方面的时候,我们需要考虑备份数据的可恢复性及其完整性,也就是说,不希望备份数据被破坏。那么到底从哪些方面保证数据的可靠性呢?这里认为,对一个去重复系统而言,当数据从客户端通过传输介质进入数据去重复系统后,必须考虑系统中的每一个模块。也就是说在设计整个重复数据删除系统的时候,必须将任何一个模块在运行过程中存在错误的可能考虑进来。

第一个需要考虑的问题是,外部存储的可靠性。现在备份的数据最终会被放到磁盘(取代了以前的磁带)。所以一个简单的问题就是,在备份过程中磁盘设备损坏了该如何处理?为此,磁盘阵列技术被引入。一般在数据去重复系统中常用的应用有RAID0、RAID5或RAID6。当然磁盘阵列技术也有软件和硬件之分,其中,硬件磁盘阵列部署起来虽然比较容易,但是也不能百分之百保证数据不出错。磁盘也一样,写入磁盘的数据未必一定正确,即使错误发生的概率非常低。因此,就需要去重复系统通过软件的方法去验证一些数据的完整性。例如,对于一些数据结构,可采用内嵌的校验和(Checksum)来保证数据的完整性。

第二个需要考虑的问题是,内存的可靠性。众所周知,服务器上的内存都携带ECC(Error Correcting Code)功能。对于重复数据删除系统而言,如果内存有这样的机制,就可以让重复数据删除系统通过ECC去检验这些内存条的错误。如果在同一个区域ECC出现错误的频率变高了,超过了某个阈值,似乎就可以断定这块内存条在一定时间内有损坏的可能,需要及时替换。再扩展一下,就是对系统中所有的硬件都需要有监控,以防止意外发生,如监控CPU和风扇的温度等。

第三个需要考虑的问题是,如果在进行去重复的过程中整个系统崩溃了,那么还能保证数据的完整性吗?这个问题可能比较难解决。对于那些还在CPU或内存中但并没有被刷入外部存储的数据,能不能进行相关的跟踪?发生这样的事情最完美的结局是:系统能恢复正常,还没刷入外部存储的数据(已经经过了指纹处理)能被正常写入外部存储。直观地想,这似乎是不可能的,但是细想一下,似乎还有其他的解决方案。

先把思维发散到数据库中。我们知道支持OLTP的数据库对事务的支持有很强的要求,如那些没被正常提交的事务(Transaction)需要进行回滚。为了满足这一需求,数据库引入WAL(Write Ahead Log)机制,即任何写磁盘操作必须先写日志。在数据去重复系统中,是不是也可以引入WAL机制呢?答案是,可以,但是纯粹使用引入的WAL机制似乎不能满足数据去重复系统高吞吐率的要求,那么怎么办呢?为此,数据去重复系统向一些高端的存储系统学习引入NVRAM,因此日志可以先被写入NVRAM。于是当系统崩溃的时候,一些数据就可以从NVRAM中恢复出来,这在一定程度上解决了系统崩溃所导致的数据丢失问题。但是NVRAM也不是万能的,系统在某些情况下依然会处于一个不能完全恢复数据的状态,当然这样的概率是比较低的。

从数据脆弱性的角度来讲,开发一个好的数据去重复系统还是比较困难的。总的来说,必须把数据可失性的问题从软件和硬件等方面进行全面考虑,才能尽可能地避免数据在去重复或恢复过程中的丢失问题。

3.重复数据删除应用

重复数据删除技术从萌芽到兴起时间不长,但是随着大数据的发展,人们对存储的需求也呈爆炸式增长。前面我们所讲的是当前重复数据删除技术在数据备份系统中的应用,市场上销售的重复数据删除系统基本都是一体化的。所谓一体化系统,是指数据去重系统以容量大小进行销售,也就是说用户会购买一个BOX(包含了所有软件和硬件)。但问题是,随着数据容量的增长,单个BOX是否还能满足要求?

就这里而言,答案是否定的。数据去重复系统的可扩展性,现在还处于探索阶段,目前可以进一步压榨多核或CPU的能力,但是总有一天这种方式的优化效果会变得越来越不显著。为此我们必须将方向转向分布式系统,或者把数据去重和云联系起来。例如,昆腾公司的一款虚拟插件产品DXi V1000,开始把重复数据删除和虚拟化及云相结合。重复数据删除在数据备份方面的应用,还有很长的路要走。

构建分布式的数据去重复系统,或将其重复数据删除和云结合,有很多种玩法。对云服务代理商而言,可以结合重复数据删除技术和一些廉价的云存储服务,来提供更加可靠的存储服务,这里使用重复数据删除技术也是为了降低成本。重复数据删除的供应厂商,不再单纯地将BOX卖给用户,而是提供更加一体化的服务。当用户的BOX容量满了,则需要购买容量更大的BOX来替换。

对于一些小企业来讲,持续的BOX替换是一项比较大的IT开销。因此如果数据去重复厂商提供额外的云服务,允许用户在BOX容量满的情况下,把去重复后的数据放到云端,虽然备份的性能会有所下降,但是确实满足了小型企业的需求。例如,如果用户买了1TB的去重复系统,附加一个10TB的云数据去重复系统。

重复数据删除除了在数据备份系统(主要指Secondary Storage)中的应用,在其他方面也有相应的应用,如主存储(Primary Storage)、文件系统、虚拟化,甚至内存。下面对其进行简单介绍。

· 主存储中的数据去重复。在2012年的FAST会议上,NetApp公司发表了一篇名为iDedup:Latency-aware,inline data deduplication for primary storage的文章,希望重复数据删除在主存储上的应用能同时在存储空间节省和I/O延迟之间做一个平衡。

· 文件系统的数据去重复,如ZFS、liveDFS、SDFS、DEDE,其中,ZFS在文件系统管理中支持了数据去重复功能;liveDFS可在虚拟机内进行重复数据删除;SDFS可在一些文件系统之下进行重复数据删除,不过它是一个用户级数据去重复文件系统;DEDE工作在VMware的VMFS层,可以在线对用户虚拟机磁盘进行重复数据删除。

· 对于内存中的去重复(数据共享),大家应该不会陌生,一般都是在Page级别进行内存共享。例如,在操作系统中进程之间共享内存,使用的写时复制(Copy On Write,COW)机制,以及同一个主机中的不同虚拟机之间通过写时复制机制共享内存。另外还有一些更复杂的基于内存数据去重复机制,这里不再赘述。

4.Linux下开源数据删除软件

Linux下的独立开源存储方案不太多,目前用得比较多的是OpenDedup。OpenDedup针对Linux的重复数据删除文件系统被称为SDFS,主要针对的是那些使用虚拟化环境,且追求低成本、高性能、可扩展的重复数据解决方案的用户。

OpenDedup OST连接器提供了网络备份与OpenDedup之间的集成,其支持以下的功能:将数据写入并备份到OpenDedup卷;从OpenDedup卷读取并恢复;备份OpenDedup卷的加速器支持。此外OpenDedup的开源文件系统SDFS,可以在本地或云存储删除目标。OpenDedup的特定功能如下。

· 对云存储后端(Storage Backend)进行在线重复数据删除:SDFS可以将所有数据发送到AWS、Azure、Google或任何S3兼容的后端。

· 性能:对压缩的数据可以多线程上传和将数据下载到云端。

· 本地缓存:SDFS可以在本地缓存最近访问的数据(默认大小是10GB)。

· 安全性:所有数据在发送到云端时都可以使用AES-CBC 256进行加密。

· 流控:上传和下载速度可能会受到限制。

· 云恢复/复制:所有本地元数据都可以被复制到云端中,并且可以被恢复。

· Glacier支持:支持S3生命周期策略并可以从中检索数据。

此外,还有另外一些开源网络备份和数据恢复软件厂商,如Bacula Systems、Zmanda、Nexenta等。另外重复数据删除功能,也被集成在大型的分布式存储系统中,以提供备份的功能。这方面云服务商用得比较广泛。

 

数据压缩与重复数据删除两种技术具有不同层面的针对性,并能够结合起来使用,从而实现更高的数据缩减比例。值得一提的是,如果同时应用数据压缩和重复数据删除技术,为了降低对系统的处理需求和提高数据压缩比率,通常需要先应用数据删除技术,然后再使用数据压缩技术进一步降低"结构图"和基本数据块的体积。如果顺序颠倒会出现什么样的结果呢?压缩会对数据进行重新编码,从而破坏了数据原生的冗余结构,因此再应用重复数据删除效果则会大打折扣,而且消耗时间也更多。而先执行重复数据删除则不同,它首先消除了冗余数据块,然后应用数据压缩对唯一副本数据块进行再次压缩。这样,两种技术的数据缩减作用得到叠加,而且数据压缩的消耗时间大大降低。因此,先去重后压缩,可以获得更高的数据压缩率和性能。

热门文章

暂无图片
编程学习 ·

C++数据结构第16课、线性表存储结构的抽象实现

课程目标 — 完成顺序存储结构线性表的抽象实现SeqList 设计要点 — 抽象类模板,存储空间的位置和大小由子类完成 — 实现顺序存储结构线性表的关键操作(增、删、查、等) — 提供数组操作符,方便快速获取元素SeqList.h #ifndef SEQLIST_H #define SEQLIST_H#include "…
暂无图片
编程学习 ·

js 的递归写法 代码的健壮性

这几天参加面试,有个关于递归的问题,之前学红皮书的手后,看过也写过代码,但是时间长了不用就会忘记,翻书肯定没有自己记住效率高;首先解释一下为什么这么写;//因为函数的本质是一个对象,fun是声明在栈内存中,其中保存一个地址,系统通过地址可以在堆中找到一个Function的对象;fu…
暂无图片
编程学习 ·

BIO、NIO、AIO基本概念

BIO 采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成后,通过输出流返回应答给客户端,线程销毁。 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须…
暂无图片
编程学习 ·

Hadoop集群的四个配置文件的常用属性解析

在启动hadoop集群的守护线程时,一定会加载并运行相关的class字节码文件。通过common模块和hdfs模块里的源码可以看到,它们读取了相关的配置文件。hadoop-common-2.7.3-sources.jar下的org.apache.hadoop.conf.Configuration源文件的部分源码:package org.apache.hadoop.conf…
暂无图片
编程学习 ·

【论文阅读报告】Visualizing and Understanding Convolutional Networks

背景 众所周知,卷积神经网络在图像处理方面表现突出,但是在很多情况下,我们在调神经网络的参数时只是依靠运气,并不知道自己对参数和网络结构的调整会影响神经网络的哪一部分。因此这篇文献的目的就是让我们通过一种可视化的方法来了解卷积神经网络如何工作,以及每一层的特…
暂无图片
编程学习 ·

Video Summarization with Long Short-Term Memory论文翻译

基于长短期记忆网络的视频摘要 文章目录基于长短期记忆网络的视频摘要Abstract1 introduction2 Related Work3 Approach3.1 Problem Statement3.2 Long Short-Term Memory (LSTM)3.3 vsLSTM for Video Summarization3.4 Enhancing vsLSTM by Modeling Pairwise Repulsiveness3…
暂无图片
编程学习 ·

自定义控件三部曲之动画篇(四)——ValueAnimator基本使用

一、概述前面,我写过几篇有关Animation的文章,讲解了传统的alpha、scale、translate、rotate的用法及代码生成方法。其实这三篇文章讲的所有动画效果叫做Tween Animation(补间动画)在Android动画中,总共有两种类型的动画View Animation(视图动画)和Property Animator(属性…
暂无图片
编程学习 ·

防火墙部署,功能及数据包分析。

防火墙部署方式的应用路由模式虚拟线模式部署透明模式(交换模式)访问控制和地天融信防火墙抓包 路由模式 防火墙的路由模式,主要是用于网络的出口位置,也就是防火墙的设备有一个网口配置公网地址。多出口加上多入口,有时也叫上下联(上联口向外网方向,下联口向内网方向)…
暂无图片
编程学习 ·

postman引入文件实现参数化及中文乱码问题解决

1、首先,在postman中输入地址和参数,保证接口请求成功。可以在tests中添加断言2、将需要参数化的参数用变量表示,并将变量添加进全局变量中3、将需要参数化的参数写成CSV,TXT,JSON格式的文档。这里用的是csv格式的文件,其中name是变量名如果用txt格式的文件,多参数之间要用…
暂无图片
编程学习 ·

[算法]最长公共前缀

题目编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。示例输入: [“flower”,“flow”,“flight”] 输出: “fl”输入: [“dog”,“racecar”,“car”] 输出: “” 解释: 输入不存在公共前缀。这是一道简单题,没什么说的 class Solut…
暂无图片
编程学习 ·

CQF笔记M1L3泰勒级数和转移概率密度函数

CQF笔记M1L3泰勒级数和转移密度函数Module 1 Building Blocks of Quant FinanceLecture 2 Taylor Series and Transition Density Functions泰勒级数期权价格的泰勒级数trinomial random walk和转移密度函数Similarity solutions 求解过程 Module 1 Building Blocks of Quant F…
暂无图片
编程学习 ·

学习node.js前,浏览器的一些工作原理知识的补充

浏览器概述 1、人机交互(UI) 2、网络请求部分(Socket) 3、JavaScript引擎(解析执行JavaScript) 4、渲染引擎(渲染HTML,CSS)又叫排版引擎或浏览器内核 5、数据库存储(cookie、HTML5的本地存储Localstorage、SessionStorage)渲染引擎 主流的渲染引擎有 Chrome浏览器:…
暂无图片
编程学习 ·

Java语言基础之封装&构造方法&静态的使用

面向对象思想概述 概述:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对象,强调具备功能的对象。 思想特点:面向对象思维方式是一种更符合人们思考习惯的思想 面向过程思维方式中更多的体现的是执行者(自己做事情),面向对象中更多…
暂无图片
编程学习 ·

6台路由器ospf+rip实验

一、环境OSPF路由协议是一种典型的链路状态(Link-state)的路由协议,一般用于同一个路由域内。在这里,路由域是指一个自治系统(Autonomous System),即AS,它是指一组通过统一的路由政策或路由协换路由信息的网络。在这个AS中,所有的OSPF路由器都维护一个相同的描述这个A…
暂无图片
编程学习 ·

ssm 网上商店实训 部分内容

一、 基础的配置文件applicationContext.xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context=…
暂无图片
编程学习 ·

OA、ERP、BPM 各自的功能和特点是什么?怎么配合使用?

​OA是Office Automation的简称,译为办公自动化,常用于企业内部事务管理。OA具有的几个功能:信息存储、数据管理、数据共享。因此,它的使用场景常分布在日常办公中,比如:公文管理、沟通工具、文档管理、项目管理、任务管理、会议管理、通讯录、工作便签、问卷调查、常用工…