rsync命令是一个远程数据同步工具,可经过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不一样部分。具体使用能够参考https://man.linuxde.net/rsync。html
能够同步两个文件不一样的部分,这个引发个人好奇,那么是怎么作的?linux
其实一种简单的思路是,那两个文件放一块儿,比对一下不就知道了,这里的问题就是一个文件在远端,一个在本地,那么若是按照这种方式,岂不是要传一个文件过去,直接覆盖就行了。而sync的思路就是若是文件某个部分变了,那么就同步这一块内容,至于这一块的内容怎么标识和原来的不同,须要同步,简单咱们想到的是数据摘要,若是两个md5不同,不就改变了须要同步了吗。那么咱们看一下rsync是怎么处理的。算法
首先,咱们会把fileDst的文件平均切分红若干个小块,好比咱们按照1024个字节划分,而后对每块计算两个标识,rsync使用两个方式计算:shell
再者就是同步目标端会把文件的一个计算后的列表传给同步源文件这,这个列表里包括了三个东西,rolling checksum,md5 checksume,文件块编号。数组
源机器拿到了这个列表后,会对文件作一样的计算和目标计算值作对比,这样就知道哪些文件块改变了,这里立马想到的是若是源文件好比中间或者开头加入了一个字符,那么每一块计算的值不就改变了,还不是要所有同步?由于在比对的后面用了“挪步”的方式。工具
同步源端拿到fileDst的checksum数组后,会把这个数据存到一个hash table中,用rolling checksum作hash,以便得到O(1)时间复杂度的查找性能,简单点能够理解成map,只是不知道这个hash table在冲突碰撞的时候是怎么处理的。性能
而后在源文件这里开始计算,若是弱checksum和强checksum一致,那么这就是同一个文件,若是只要其中一个不一致,那么就是不一样的部分。因而,算法会住后移动 1个字节,再计算文件块要作checksum,可是前面这一字节的内容须要同步给目标机器上。目标机器上会有一个临时文件,当匹配结束后会替换掉原来的目标文件。若是文件改动比较大,那么对文件作这么多计算仍是直接把文件传输过去,哪个效率更高呢? .net
还有就是计算checksum,弱的是32byte,强的128byte,因此仍是有可能有重复的状况吧,只是这个几率很是低2的160次方吧,这样看,是否是比直接传输覆盖的状况出错几率更低呢!htm
我参考的大神写的博客写的不错,有兴趣你们能够看看!blog
参考: