重复数据删除(de-duplication)是存储领域,尤其是数据备份领域的一个非常重要的概念。其目的是删除重复的数据块,从而减少对存储空间的使用。

这种想法的出发点是非常自然的。通常情况下,每次备份的数据总是会有一部分跟上一次备份的数据重合。

比如,每次备份都要包含一个100MB的文件,那么这个文件就会重复出现在所有的备份数据中。

经过多次备份操作之后,重复的数据块就会占用可观的存储空间,而实际上,这些重复的数据块保留一份就足够了。

dedup就是为了解决这种问题而产生的。


dedup和数据压缩是不同的两个概念。

它们都能减少对存储空间的占用,这是它们的共同点。

数据压缩需要大量的CPU和IO资源,并且解压之后才能使用。另外,数据压缩没有办法解决重复数据块的问题。

dedup同样需要较多的CPU资源,但是大幅度降低了对IO资源的占用。


既然要消除重复的数据块,那么dedup面对的第一个问题就是怎样划分数据块。

最简单的也最容易想到的办法,就是以固定的长度进行划分,比如每个数据块都是1MB大小。

这种方法的好处是易于实现,效率高。

缺点也是非常明显的,那就是对于增加/删除的数据效果不明显。

比如一个10MB的文件,第一次备份的时候划分成了10个数据块。

随后在文件的开头增加了一个字符,文件长度变成了10MB+1Byte。那么下一次备份发生的时候,这个文件会被分成11个数据段,前10个数据段都是1MB大小,最后一个数据段包含1个Byte。

但是现在这11个数据段都会被认为是新的数据段,从而没有达到dedup所期望的效果。


解决这个问题的办法有很多,最容易想到的办法就是根据不同的offset,在新的备份数据中顺序查找是否与已有的数据块重复。

这样做虽然会解决数据去重的问题,但是也会带来很大的CPU消耗。一个通用的附加解决方案是scroll checksum,用于降低计算数据块的checksum所打来的CPU开销。


当然针对这个问题也有很多更好的解决方案,但是这个方法因为简洁易于实现,所以被大量采用。比如著名的rsync工具,就是这么实现的。