Rsync同步算法

来源:互联网 发布:数据库事务是什么意思 编辑:程序博客网 时间:2024/06/06 12:36

算法简介

Rsync 算法是 Andrew Tridgell 和 Paul Mackerras 在 1998 年提出的一种远程差异文件同步算法。

假设你有两个文件(文件 A 和文件 B),你想将文件 B 更新到与文件 A 一致。最简单最直接的方法就是将文件 A 拷贝到文件 B 。如果是在两台主机通过网络连接的主机上并且文件 A 非常大时,这种方式效率就显得是否低下(尤其在通信带宽较低的情况下)。当两个文件的相似度较大时,我们可以利用文件相似度来提供传输效率。通用的做法就是只传输文件之间的差异数据。

Rsync 算法可以快速的计算出不同主机上两个文件的差异数据。假设我们有两台主机 αβ ,其中主机 α 上存在文件 A ,主机 β 上存在文件 B ,并且文件 A 和文件 B具有较大的相似度。通过 Rsync 算法将主机 β 上的文件 B 同步到主机 α 的文件 A 包含以下 5 个步骤:

  1. 主机 β 将文件 B 划分为连续的不重叠的长度为 S 字节的定长数据块,最后一个数据块长度可能小于 S
  2. 针对每个数据块主机 β 为它们计算一个弱滚动校验和以及一个强校验和(MD5)。
  3. 主机 β 将校验和信息发送给主机 α
  4. 主机 α 针对文件 A 每个偏移位置查找与文件 B 具有相同强弱校验值的数据块。通过滚动校验和算法可以在单次扫描过程中快速地完成此操作。
  5. 主机 α 发送构建指令给主机 β 构建文件 A 的副本。每个构建指令不是文件 B 的数据块索引就是文件原始数据。文件原始数据只有在文件 A 没有匹配到文件 B 中的数据块才会发送。

Rsync同步算法的原理图如下所示:

rsync

滚动校验和

Rsync 算法采用的弱校验和算法具有一个特性,即在给定数据块 X1Xn 的校验和的情况下可以快速的计算出数据块 X2Xn+1 的校验和。该算法思想来自于 Mark Adler 的 adler-32 校验和算法。

算法定义如下:

a(k,l)=(i=klXi)modM

b(k,l)=(i=kl(li+1)Xi)modM

s(k,l)=a(k,l)+216b(k,l)

其中 s(k,l) 即为数据块 XkXl 的滚动校验和,为了简化以及速度的原因,令 M=216

这种校验和算法的重要特性是可以使用递归关系非常有效地计算连续的值。

a(k+1,l+1)=(a(k,l)Xk+Xl+1)modM

b(k+1,l+1)=(b(k,l)(lk+1)Xk+a(k+1,l+1))modM

参考

[1] The rsync algorithm

原创粉丝点击