简介:
Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远
程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 
特点:
1.可以镜像保存整个目录树和文件系统; 
 2.可以很容易做到保持原来文件的权限、时间、软硬链接等; 
 3.无须特殊权限即可安装; 
 4.优化的流程,文件传输效率高; 
 5.可以使用rsh、ssh等方式来传输文件,当然也可以通过直接的socket连接; 
 6.支持匿名传输。
Rsync同步算法:
rsync的算法如下:(假设我们同步源文件名为fileSrc,同步目的文件叫fileDst)

1.首先,我们会把fileDst的文件平均切分成若干个小块,比如每块512个字节(最后一块会小于这个数),然后对每块计算两个checksum,

一个叫rolling checksum,是弱checksum,32位的checksum,其使用的是Mark Adler发明的adler-32算法,
另一个是强checksum,128位的,以前用md4,现在用md5 hash算法。
为什么要这样?因为若干年前的硬件上跑md4的算法太慢了,所以,我们需要一个快算法来鉴别文件块的不同,但是弱的adler32算法碰撞概率

太高了,所以我们还要引入强的checksum算法。

2.CheckSum算法

同步目标端会把fileDst的一个checksum列表传给同步源,这个列表里包括了三个东西,rolling checksum(32bits),

md5 checksume(128bits),文件块编号。

我估计你猜到了同步源机器拿到了这个列表后,会对fileSrc做同样的checksum,然后和fileDst的checksum做对比,这样就知道哪些文件块改变了。

但是,聪明的你一定会有以下两个疑问:

如果我fileSrc这边在文件中间加了一个字符,这样后面的文件块就完全和fileDst这边的不一样了,但理论上来说,我只需要传一个字符就好了。
如果这个checksum列表特别长,而我的两边的相同的文件块可能并不是一样的顺序,那就需要查找,线性的查找起来应该特别慢吧。
很好,让我们来看一下同步源端的算法。

3.checksum查找算法

同步源端拿到fileDst的checksum数组后,会把这个数据存到一个 hash table中,用rolling checksum做hash,以便获得O(1)时间复杂度的查找性能。

这个hash table是16bits的,所以,hash table的尺寸是2的16次方,对rolling checksum的hash会被散列到0 – 2^16 – 1中的某个值。

(对于hash table,如果你不清楚,请回去看你大学时的数据结构那本教科书)

顺便说一下,我在网上看到很多文章说,“要对rolling checksum做排序”(比如这篇和这篇),这两篇文章都引用并翻译了原版的这篇文章,

但是他们都理解错了,不是排序,就是把fileDst的checksum数据,按rolling checksum做存到2^16的hash table中,当然会发生碰撞,

把碰撞的做成一个链接就好了。这就是原文中所说的第二步。

4.比对算法

这是最关键的算法,细节如下:

4.1)取fileSrc的第一个文件块(我们假设的是512个长度),也就是从fileSrc的第1个字节到第512个字节,取出来后做rolling checksum计算。

计算好的值到hash表中查。

4.2)如果查到了,说明发现在fileDst中有潜在相同的文件块,于是就再比较 md5的checksum,因为rolling checksume太弱了,可能发生碰撞。

于是还要算md5的128bits的checksum,这样一来,我们就有 2^-(32+128) = 2^-160的概率发生碰撞,这太小了可以忽略。

如果rolling checksum和md5 checksum都相同,这说明在fileDst中有相同的块,我们需要记下这一块在fileDst下的文件编号。

4.3)如果fileSrc的rolling checksum 没有在hash table中找到,那就不用算md5 checksum了。表示这一块中有不同的信息。总之,

只要rolling checksum 或 md5 checksum 其中有一个在fileDst的checksum hash表中找不到匹配项,

那么就会触发算法对fileSrc的rolling动作。于是,算法会住后step 1个字节,取fileSrc中字节2-513的文件块要做checksum,

Go to (4.1) - 现在你明白什么叫rolling checksum了吧。

4.4)这样,我们就可以找出fileSrc相邻两次匹配中的那些文本字符,这些就是我们要往同步目标端传的文件内容了。

图示
怎么,你没看懂? 好吧,我送佛送上西,画个图给你看看。

这样,最终,在同步源这端,我们的rsync算法可能会得到下面这个样子的一个数据数组,图中,红色块表示在目标端已匹配上,不用传输

(注:我专门在其中显示了两块chunk #5),而白色的地方就是需要传输的内容(注意:这些白色的块是不定长的),这样,同步源这端

把这个数组(白色的就是实际内容,红色的就放一个标号)压缩传到目的端,在目的端的rsync会根据这个表重新生成文件,这样,同步完成。

最后想说一下,对于某些压缩文件使用rsync传输可能会传得更多,因为被压缩后的文件可能会非常的不同。对此,对于gzip和bzip2这样的命令,

记得开启 “rsyncalbe” 模式。

以上部分摘抄自:http://blog.csdn.net/wishfly/article/details/7575152

Rsync命令语法:
rsync [OPTION]... SRC DEST 
rsync [OPTION]... SRC [USER@]host:DEST 
rsync [OPTION]... [USER@]HOST:SRC DEST 
rsync [OPTION]... [USER@]HOST::SRC DEST 
rsync [OPTION]... SRC [USER@]HOST::DEST 
rsync [OPTION]... 
rsync://[USER@]HOST[:PORT]/SRC [DEST]

语法如上,解析:


  1. -v, --verbose 详细模式输出。
  2. -q, --quiet 精简输出模式。
  3. -c, --checksum 打开校验开关,强制对文件传输进行校验。
  4. -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
  5. -r, --recursive 对子目录以递归模式处理。
  6. -R, --relative 使用相对路径信息。
  7. -b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
  8. --backup-dir 将备份文件(如~filename)存放在在目录下。
  9. -suffix=SUFFIX 定义备份文件前缀。
  10. -u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。
  11. -l, --links 保留软链结。
  12. -L, --copy-links 想对待常规文件一样处理软链结。
  13. --copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结。
  14. --safe-links 忽略指向SRC路径目录树以外的链结。
  15. -H, --hard-links 保留硬链结。
  16. -p, --perms 保持文件权限。
  17. -o, --owner 保持文件属主信息。
  18. -g, --group 保持文件属组信息。
  19. -D, --devices 保持设备文件信息。
  20. -t, --times 保持文件时间信息。
  21. -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间。
  22. -n, --dry-run现实哪些文件将被传输。
  23. -w, --whole-file 拷贝文件,不进行增量检测。
  24. -x, --one-file-system 不要跨越文件系统边界。
  25. -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节。
  26. -e, --rsh=command 指定使用rsh、ssh方式进行数据同步。
  27. --rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息。
  28. -C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。
  29. --existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。
  30. --delete 删除那些DST中SRC没有的文件。
  31. --delete-excluded 同样删除接收端那些被该选项指定排除的文件。
  32. --delete-after 传输结束以后再删除。
  33. --ignore-errors 及时出现IO错误也进行删除。
  34. --max-delete=NUM 最多删除NUM个文件。
  35. --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输。
  36. --force 强制删除目录,即使不为空。
  37. --numeric-ids 不将数字的用户和组id匹配为用户名和组名。
  38. --timeout=time ip超时时间,单位为秒。
  39. -I, --ignore-times 不跳过那些有同样的时间和长度的文件。
  40. --size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。
  41. --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0。
  42. -T --temp-dir=DIR 在DIR中创建临时文件。
  43. --compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份。
  44. -P 等同于 --partial。
  45. --progress 显示备份过程。
  46. -z, --compress 对备份的文件在传输时进行压缩处理。
  47. --exclude=PATTERN 指定排除不需要传输的文件模式。
  48. --include=PATTERN 指定不排除而需要传输的文件模式。
  49. --exclude-from=FILE 排除FILE中指定模式的文件。
  50. --include-from=FILE 不排除FILE指定模式匹配的文件。
  51. --version 打印版本信息。
  52. --address 绑定到特定的地址。
  53. --config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件。
  54. --port=PORT 指定其他的rsync服务端口。
  55. --blocking-io 对远程shell使用阻塞IO。
  56. -stats 给出某些文件的传输状态。
  57. --progress 在传输时现实传输过程。
  58. --log-format=formAT 指定日志文件格式。
  59. --password-file=FILE 从FILE中得到密码。
  60. --bwlimit=KBPS 限制I/O带宽,KBytes per second。
  61. -h, --help 显示帮助信息。
文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux29964 人正在系统学习中

[转帖]rsync原理的更多相关文章

  1. sersync+rsync原理及部署

    标签:sersync+rsync部署文档 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liubao0312.blog.51ct ...

  2. Rsync原理介绍及配置应用

    1.前言 基于LAN或WAN的网络应用之间进行数据传输或者同步非常普遍,比如远程数据镜像.备份.复制.同步,数据下载.上传.共享等等.对此,最简单.直接的做法是对数据进行完全复制.然而,数据在网络上来 ...

  3. [转帖]rsync简介

    rsync用法详细解释 https://www.cnblogs.com/noxy/p/8986164.html 之前一直使用 scp 现在发现这个命令更好一些. 提要 熟悉 rsync 的功能及其特点 ...

  4. [转帖]mDNS原理的简单理解

    mDNS原理的简单理解 https://binkery.com/archives/318.html 发现还有avahi-daemon mdns 设置ip地址 等等事项 网络部分 自己学习的还是不够多 ...

  5. [转帖]Kafka 原理和实战

    Kafka 原理和实战 https://segmentfault.com/a/1190000020120043 两个小时读完... 实在是看不完... 1.2k 次阅读  ·  读完需要 101 分钟 ...

  6. [转帖]SSH原理与运用(二):远程操作与端口转发

    SSH原理与运用(二):远程操作与端口转发 http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html 接着前一次的文章,继续介绍S ...

  7. [转帖]SSH原理与运用(一):远程登录

    http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html 写的很好.. 自己才简单明白了一点东西.. SSH是每一台Linux电脑的标准 ...

  8. [转帖]RSYNC 的核心算法

    RSYNC 的核心算法 https://coolshell.cn/articles/7425.html rsync是unix/linux下同步文件的一个高效算法,它能同步更新两处计算机的文件与目录,并 ...

  9. Linux实战教学笔记21:Rsync数据同步工具

    第二十一节 Rsync数据同步工具 标签(空格分隔): Linux实战教学笔记-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载,转载 ...

  10. Redis 复制原理及分析

    1.测试 见master-slave测试帖 2 原理 第一次.Slave向Master同步的实现是: Slave向Master发出同步请求(发送sync命令),Master先dump出rdb文件,然后 ...

随机推荐

  1. kubernetes不同pod之间调用(四)

    kubernetes不同pod之间调用(四) k8s系列 源自我工作上的实际场景,记录于此. kubernetes不同服务间的调用.kubernetes不同容器间的调用.kubernetes不同- 今 ...

  2. 26、Flutter中命名路由

    Flutter 中的命名路由 main.dart中配置路由 void main() { runApp(MaterialApp( theme: ThemeData( appBarTheme: const ...

  3. Langchain-Chatchat项目:3-Langchain计算器工具Agent思路和实现

      本文主要讨论Langchain-Chatchat项目中自定义Agent问答的思路和实现.以"计算器工具"为例,简单理解就是通过LLM识别应该使用的工具类型,然后交给相应的工具( ...

  4. 华为云云容器引擎CCE产品文档带来4个升级,降低使用难度

    本文分享自华为云社区<华为云云容器引擎CCE产品文档优化升级!>,作者: 云容器大未来 . 云原生产品技术栈庞大,需要用户对容器.Kubernetes等核心技术都有扎实的理解和掌握:同时问 ...

  5. 火山引擎云原生数据仓库 ByteHouse 技术白皮书 V1.0 (Ⅴ)

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,<火山引擎云原生数据仓库 ByteHouse 技术白皮书>正式发布.白皮书简述了 ByteHou ...

  6. 火山引擎 DataTester 推出可视化数据集成方案

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着数字化的长期演进,企业中往往存在多个运行在不同平台的数字系统,这些数据源彼此独立,数据跨系统间的交流.共享和融 ...

  7. 性能提升-如何设置Windows操作系统TIME_WAIT状态的TCP连接快速回收时间?

    大规模Windows环境下,采用Nginx反向代理服务后,操作系统会产生较多TIME_WAIT的TCP(Transmission Control Protocol)连接,操作系统默认TIME_WAIT ...

  8. 收到一封CTO来信,邀约面试机器学习工程师

    大家好,我是北海 很少登陆 Gmail,前天收验证码登了一下,发现居然收到一封某初创公司CTO的来信. 我在Github上看到了您的资料觉得很有意思,请问您是否考虑我们公司的全职工作机会呢?可供考虑的 ...

  9. 用Python制作高逼格数学动画manim

    简介 manim是斯坦福大学数学系小哥Grant Sanderson开源的数学仿真模拟python库,并用于YouTube 频道3Blue1Brown,来解说高等数学. manim是一个非常优秀的数学 ...

  10. JXUST_NC - ACM工作室20级选拔赛题解

    A - RioTian学长的星际航线 并查集板子 #include <bits/stdc++.h> using namespace std; const int maxn = 1010; ...