谈谈文件增量同步算法:RSYNC和CDC
最近在研究文件的增量同步问题,着重研究了文件差异编码部分,因为这个其实是文件同步的核心。目前应用最广泛的当然是linux下的RSYNC算法,但是这个算法本身存在缺陷,就是当两个文件完全无关时,差异编码的效率非常低,几乎难以接受!
带着这个问题,我研究了CDC(Content-Defined Chunking)算法,发现CDC算法恰好解决了这个问题:当两个文件的差异非常大时,CDC的效率非常高。我尝试了对两个完全不同的安装包文件进行差分编码,文件大小约120M左右,使用RSYNC算法大约耗时180s,而CDC算法耗时则只有4s!但CDC也有自己的问题,在文件差异不大的情况下,RSYNC和CDC效率差不多,但是RSYNC能够发现的重复分块更多,比CDC大约多出10%左右。
对于大文件的差异编码,我觉得可以将两者结合起来,首先使用CDC算法进行差分编码,如果相同分块较多(可以用相同分块数据大小占文件总大小的比例确定),再使用RSYNC算法提取更多的相同分块;如果相同分块较少(可能是2个完全无关的文件),则无需再使用RSYNC进行差分编码。这样既可以避免两个完全无关的文件差分编码时效率低下的问题,又能在文件差异较小时提取尽可能多相同分块,鱼和熊掌兼得!