本篇内容主要讲解“rsync算法的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“rsync算法的原理是什么”吧!
rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分。具体使用可以参考https://man.linuxde.net/rsync。
可以同步两个文件不同的部分,这个引起我的好奇,那么是怎么做的?
其实一种简单的思路是,那两个文件放一起,比对一下不就知道了,这里的问题就是一个文件在远端,一个在本地,那么如果按照这种方式,岂不是要传一个文件过去,直接覆盖就好了。而sync的思路就是如果文件某个部分变了,那么就同步这一块内容,至于这一块的内容怎么标识和原来的不一样,需要同步,简单我们想到的是数据摘要,如果两个md5不一样,不就改变了需要同步了吗。那么我们看一下rsync是怎么处理的。
首先,我们会把fileDst的文件平均切分成若干个小块,比如我们按照1024个字节划分,然后对每块计算两个标识,rsync使用两个方式计算:
一个叫rolling checksum,是弱checksum,32位的checksum,其使用的是Mark Adler发明的adler-32算法,
一个是强checksum,128位的,以前用md4,现在用md5 hash算法。
再者就是同步目标端会把文件的一个计算后的列表传给同步源文件这,这个列表里包括了三个东西,rolling checksum,md5 checksume,文件块编号。
源机器拿到了这个列表后,会对文件做同样的计算和目标计算值做对比,这样就知道哪些文件块改变了,这里立马想到的是如果源文件比如中间或者开头加入了一个字符,那么每一块计算的值不就改变了,还不是要全部同步?因为在比对的后面用了“挪步”的方式。
同步源端拿到fileDst的checksum数组后,会把这个数据存到一个hash table中,用rolling checksum做hash,以便获得O(1)时间复杂度的查找性能,简单点可以理解成map,只是不知道这个hash table在冲突碰撞的时候是怎么处理的。
然后在源文件这里开始计算,如果弱checksum和强checksum一致,那么这就是同一个文件,如果只要其中一个不一致,那么就是不同的部分。于是,算法会住后移动 1个字节,再计算文件块要做checksum,但是前面这一字节的内容需要同步给目标机器上。目标机器上会有一个临时文件,当匹配结束后会替换掉原来的目标文件。如果文件改动比较大,那么对文件做这么多计算还是直接把文件传输过去,哪一个效率更高呢?
还有就是计算checksum,弱的是32byte,强的128byte,所以还是有可能有重复的情况吧,只是这个概率非常低2的160次方吧,这样看,是不是比直接传输覆盖的情况出错概率更低呢!
到此,相信大家对“rsync算法的原理是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。