文件副本经常在网络上来回被COPY多次,很多情形下这些文件副本之间仅有很小的差异,很可能是从同一个文件版本演化而来。如果对文件进行完全COPY,在文件较大的情况下,会占用大量网络带宽,同步时间也会较长。Rsync是类Unix环境下的一个高效的远程文件复制(同步)工具,它通过著名的Rsync算法来优化流程,减少了数据通信量并提高文件传输效率。它的大致流程如下:
假设现在有两台计算机Alpha和Beta ,计算机Alpha能够访问A文件,计算机Beta能够访问B文件,文件A和B非常相似,计算机Alpha和Beta通过低速网络互联。
1、Beta将文件B分割成连续不重叠的固定大小数据块S,最后一个数据块上可能会小于S字节;
2、Beta对于每一个数据块,计算出两个校验值,一个32位的弱滚动校验和一个128位的MD4校验;
3、Beta将校验值发送给Alpha;
4、Alpha通过搜索文件A的所有大小为S的数据块(偏移量可以任意,不一定非要是S的倍数),来寻找与文件B的某一块有着相同的弱校验码和强校验码的数据块。这主要由滚动校验Rolling checksum快速完成;
5、Alpha给Beta发送重构A文件的指令,每一条指令是一个文件B数据块引用(匹配)或者是文件A数据块(未匹配)。
以上过程详细信息请参考Rsync作者Andrew Tridgell的tech_report.ps。
Rsync是一个非常优秀的工具,但它仍然存在一些不足之处。
1、Rolling checksum虽然可以节省大量checksum校验计算量,也对checksum搜索作了优化,但多出一倍以上的hash查找,这个消耗不小;
2、Rsync算法中,Alpha和Beta计算量是不对等的,Alpha计算量非常大,而Bete计算量非常小。通常Alpha是服务器,因此压力较大;
3、Rsync中数据块大小是固定的,对数据变化的适应能力有限。
为了弥补以上这些不足,我利用dedup技术中的变长块数据切分算法,重新实现了一个远程相似文件同步原型dedup_sync。它的大致流程与Rsync相似,简单描述如下:
1、Beta采用变长块数据切分算法CDC(Content-defined chunking)将文件B分割成大小不等的数据块;
2、Beta对于每一个数据块,计算md5校验值,并记录数据块长度len和在文件B中的偏移量offset;
3、Beta将这将数据块信息发送给Alpha;
4、Alpha采用同样的数据块切分技术将文件A切成大小不等的数据块,并与Beta发过来的数据信息进行md5搜索匹配;
5、Alpha给Beta发送重构文件A的指令,每一条指令是一个文件B数据块引用(匹配)或者是文件A数据块(未匹配)。
明显地,上面这算法与rsync算法相比,去除了rolling checksum计算与hash查找,数据块大小是变化的,alpha与beta计算量也是对等的。
变长块切分CDC算法,我在dedup uitl中有实现,感兴趣读者可以去下载源码。
当然,CDC算法也是有缺陷的,数据块大小的确定比较困难,粒度太细则开销太大,粒度过粗则dedup效果不佳。如何在两者之间权衡折衷,这是一个难点。
阅读(665) | 评论(0) | 转发(0) |