Rsync原理的学习与总结

rsync,原理,学习,总结 · 浏览次数 : 196

小编点评

## Rsync原理简单学习前言工作 这篇文章介绍了 Rsync 算法的基本原理,通过实验和分析,验证了算法的效率和正确性。 ** Rsync 算法的五个步骤** 1. **分块传输:** 将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块,其中 S 是一个整数,通常与文件大小的倍数相关。 2. **校验:** 对每个数据块执行两种校验: * **32 位滚动校验:** 用于快速验证文件完整性。 * **128 位 MD4 强校验:** 用于更安全的验证。 3. **搜索文件 A 的数据块:** 通过搜索文件 A 的所有大小为 S 的数据块(偏移量可以任选,不一定非要是 S 的倍数),来寻找与文件B 的某一块有着相同的弱校验码和强校验码的数据块。 4. **创建文件 A 的备份:** 通过生成文件 A 在 β 上的备份。 5. **传输文件:** 通过对文件进行分割、校验和传输。 ** 测试结果** 实验结果表明: * **效率高:** 大文件修改一部分时效率非常高,加速比超过 30。 * **校验正确:** 无论是文件头新增还是尾端修改文件,校验正确。 * **压缩效率高:** zhaobsh.tar.gz 的加速比比 tar.gz 更高。 * **上传文件大小适中:** 针对实际文件大小,上传效率比较高。 ** 总结** Rsync 算法是一个高效且可靠的文件传输工具,通过分块传输、校验和搜索实现极高的效率。 zhaobsh.tar.gz 的加速比比其他压缩格式更高,但文件大小相对较大,建议在实际应用中选择 tar.gz 格式。 ** 其他补充** * Rsync 算法的详细原理可以参考官方文档或其他资源。 * 该文只是一种简要介绍,实际操作中可能需要根据具体情况进行调整。

正文

Rsync原理的简单学习


前言

工作这么多年, 感觉对自己帮助最大的是rsync.
用了很多rsync的脚本, 甚至因为这个脚本授权了两个专利.
但是昨天晚上在跟高手聊天时发现 自己对rsync 其实不了解.
对他底层的一些算法和实现,其实都是不清不楚的.
说实话感触挺深的. 

以后自己用东西,还是必须深入学习的. 

网上资料的学习

假定在名为 α 和 β 的两台计算机之间同步相似的文件 A 与 B,其中 α 对文件A拥有访问权,
β 对文件 B 拥有访问权。并且假定主机 α 与 β 之间的网络带宽很小。
那么 Rsync 算法将通过下面的五个步骤来完成:

β 将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。
β 对每一个分割好的数据块执行两种校验:一种是32位的滚动弱校验,另一种是128位的 MD4 强校验。
β 将这些校验结果发给 α。
α 通过搜索文件 A 的所有大小为 S 的数据块(偏移量可以任选,不一定非要是 S 的倍数),
    来寻找与文件B 的某一块有着相同的弱校验码和强校验码的数据块。
    这项工作可以借助滚动校验的特性很快完成。
α 发给 β 一串指令来生成文件 A 在 β 上的备份。
    这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,
    这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。
From https://blog.csdn.net/JineD/article/details/111871170

一些简单理解

rsync的检查主要是通过 循环区块的处理.
并且感觉 他们并不是完全按照区块进行md4或者是md5的检查.

或者仅是32字节做一下简单的 checksum 能够极大额减少文件需要传输的字节. 
昨天刚好学习了下split 和 cat 进行文件的切分和合并. 
联想到之前BT下载时都是分块下载. 其实感觉道理应该都是相通的. 
感觉可以通过一个实验的方式进行处理. 

下面就是实验的时间.

实验的思路

公司内上传文件->阿里云的机器
通过 avz 参数查看文件上传时间 以及一些加速特性. 
通过cat的方式进行一些文件的变更, 验证他的速度. 

cat 使用两种模式 尾部添加文件和头部添加文件. 
验证rsync是否可以智能化的继续拧处理. 

以及验证压缩文件和非压缩文件的一些处理机制.

实验结果分析

1. rsync 是分块传输. 大文件修改一部分时效率非常高,加速比超过30 很正常. 
2. rsync 进行计算的原理很只能.不管是文件头新增和文件尾部新增都可以准确识别. 
3. rsync 的传输可以进行压缩, 并且压缩比非常可观. 在地网络带宽情况下的性能很好. 
4. rsync 的一致性检查应该是 循环模式进行check或者是md4. 不适用更高级别的checksum,避免算法消耗更多的CPU

测试过程-原始文件测试-tar包

262M 8月  16 2021 vmware_exporter.tar
262M的文件 上传完 24秒. 加速比是 2.71

time rsync -avz  vmware_exporter.tar root@xx.xx.xx.xx:/
Warning: Permanently added 'xx.xx.xx.xx' (ED25519) to the list of known hosts.
sending incremental file list
vmware_exporter.tar

sent 100,954,996 bytes  received 35 bytes  4,120,613.51 bytes/sec
total size is 273,871,872  speedup is 2.71

real    0m24.456s

测试过程-原始文件测试-tar包-重传

不做任何修改, 直接进行文件传输. 发现不到一秒钟就可以传输完成
提示仅接收了12个字节. 怀疑应该是整个文件的 checksum. 判断完全一致就没有继续传输.
所以效率很快.

time rsync -avz  vmware_exporter.tar root@xx.xx.xx.xx:/
Warning: Permanently added 'xx.xx.xx.xx' (ED25519) to the list of known hosts.
sending incremental file list

sent 53 bytes  received 12 bytes  130.00 bytes/sec
total size is 273,871,872  speedup is 4,213,413.42

real    0m0.786s

测试过程-尾端修改文件-tar包

time cat vmware_exporter.tar zhaobsh.tar.gz >/root/vmware_exporter.tar
将文件进行一下融合增加
273M  /root/vmware_exporter.tar
大概增加了11M的大小
再次进行传输, 大约7秒钟完成. 发送字节是 不到10m. 接收了 110k. 
加速比是30. 感觉他做的压缩效率比tar.gz 还要高. 
因为 zhaobsh.tar.gz的大小为:
11,893,322 12月  5 23:09 zhaobsh.tar.gz

time rsync -avz  /root/vmware_exporter.tar root@xx.xx.xx.xx:/
Warning: Permanently added 'xx.xx.xx.xx' (ED25519) to the list of known hosts.
sending incremental file list
vmware_exporter.tar

sent 9,372,579 bytes  received 115,924 bytes  1,265,133.73 bytes/sec
total size is 285,765,194  speedup is 30.12

real    0m7.463s

测试过程-头部修改文件-tar包

time cat  zhaobsh.tar.gz vmware_exporter.tar  >/home/vmware_exporter.tar
将文件进行一下头部增加.
文件大小类似,发现结果为: 7秒钟左右完成.
加速比也是一样的. 上传的文件大小也是类似的. 

time rsync -avz  /home/vmware_exporter.tar root@xx.xx.xx.xx:/home/
Warning: Permanently added 'xx.xx.xx.xx' (ED25519) to the list of known hosts.
sending incremental file list
vmware_exporter.tar

sent 9,372,112 bytes  received 115,924 bytes  1,265,071.47 bytes/sec
total size is 285,765,194  speedup is 30.12

real    0m7.534s

tar.gz包的加速比验证

加速比为 1 
原始文件的大小为: 110400785  /root/vmware_exporter.tar.gz
110,400,785 发送比实际的total size 要下, 说明效率还是很高的. 

time rsync -avz  /root/vmware_exporter.tar.gz root@xx.xx.xx.xx:/home/
Warning: Permanently added 'xx.xx.xx.xx' (ED25519) to the list of known hosts.
sending incremental file list
vmware_exporter.tar.gz

sent 109,955,873 bytes  received 35 bytes  5,638,764.51 bytes/sec
total size is 110,400,785  speedup is 1.00

real    0m19.259s

与Rsync原理的学习与总结相似的内容:

Rsync原理的学习与总结

Rsync原理的简单学习 前言 工作这么多年, 感觉对自己帮助最大的是rsync. 用了很多rsync的脚本, 甚至因为这个脚本授权了两个专利. 但是昨天晚上在跟高手聊天时发现 自己对rsync 其实不了解. 对他底层的一些算法和实现,其实都是不清不楚的. 说实话感触挺深的. 以后自己用东西,还是必

[转帖]lsyncd实时同步搭建指南——取代rsync+inotify

lsyncd实时同步搭建指南——取代rsync+inotify https://segmentfault.com/a/1190000002737213 1. 几大实时同步工具比较 1.1 inotify + rsync 最近一直在寻求生产服务服务器上的同步替代方案,原先使用的是inotify + r

[转帖]rsync指定密码文件

rsync -Pav -e "ssh -i xxx/xxx1 -p xxx2" username@serverip:source_data_path target_path xxx/xxx1::密钥文件位置 xxx2:端口 source_data_path:源文件路径 target_path:传输目

[转帖]03-rsync传输模式(本地传输、远程方式传输、守护进程模式传输)

https://developer.aliyun.com/article/885801?spm=a2c6h.24874632.expert-profile.282.7c46cfe9h5DxWK 简介: 1.Rsync传输模式 rsync大致使用三种主要的数据传输方式 本地方式 远程方式 守护进程 1

[转帖]02-rsync备份方式

https://developer.aliyun.com/article/885789?spm=a2c6h.24874632.expert-profile.283.7c46cfe9h5DxWK 简介: 1.Rsync应用场景 数据同步的方式​ 推:push,上传(upload)​ 将客户端的数据上传

[转帖]01-rsync备份方式

https://developer.aliyun.com/article/885783?spm=a2c6h.24874632.expert-profile.284.7c46cfe9h5DxWK 简介: Rsync备份方式 1.rsync概述 rsync是一款开源的备份工具,可以在不同主机之间进行同步

[转帖]07-rsync企业真实项目备份案例实战(需求收集--服务器配置---客户端配置---报警机制---数据校验---邮件告警)

https://developer.aliyun.com/article/885820?spm=a2c6h.24874632.expert-profile.279.7c46cfe9h5DxWK 简介: 2.需求描述 客户端需求: 1.客户端每天凌晨1点在服务器本地打包备份(系统配置文件、日志文件、其

[转帖]rsync参数详解

最近经常需要传送文件,学习到rsync这个非常好用的工具。rsync的传输方不像是scp复制粘贴,而是是创建一个镜像,所以在传输效率上比scp命令要快很多,缺点就是对文件的属性如权限、用户、组、时间戳等会忽略,但是加上相关参数就可以很好的使用。在scp传输的过程/mnt和/mnt/在传输之后都会存在

Rsync的一个高级应用

Rsync的一个高级应用 背景 2019年刚开始接触linux时. 有一个很恶心的场景. 很多人为了简单起见, 提交数据库的修改(数据结果和预制数据) 都不是增量处理, 都是全量提交过来. 所以会造成修改越来越多的, 速度越来越慢的情况. 当时自己就在网上找资料,发现了一个解决方案, 就是利用rsy

readhat8搭建SFTP双机高可用并配置Rsync数据实时同步

环境准备: 主机 host-61-118 : 192.168.61.118 host-61-119:192.168.61.119 vip:192.168.61.220 检测openssh版本,版本必须大于4.8.p1,否则需要升级openssh版本 [root@host-61-118 ~]# ssh