rsync 算法
场景:假设有两台计算机 CA和 CB , CA 上有文件 FA , CB 上有文件 FB , FA 和 FB 是“相似的”。 CA 和 CB 通过低速通信链接连接,现在要把 FA 同步到 FB 上去,如何才能高效同步。
rsync 算法包含下面的步骤:
1、 CB把 FB 分割成固定大小 S 字节的块,最后一块可能少于 S 字节;
2、 对于每个块,CB 计算两个校验和:一个弱的“滚动” 32 位校验和和一个强的 128 位 MD4 校验和。
3、 CB把这些校验和发给 CA 。
4、 CA搜索 FA 来查找 S 大小的块,这些块与 CB 的块有相同的弱和强校验和。这可以通过一次遍历来完成,通过利用滚动校验和的特殊属性。
5、 CA给 CB 发送一序列指令来构建一个 FA 的拷贝。每个指令要么指向 FB 的一个块,要么是文字数据。文字数据只用于发送 FA 的那些不匹配 FB 块的区域。
最终结果是 CB有了 FA 的拷贝,但只发送了那些在 FB 里找不到的数据。
这个算法只要求一个来回,减少了网络延迟。
这个算法的最重要的细节是滚动校验和 和 associated multi-alternate search mechanism which allows the all-offsets checksum search to proceed very quickly.
这里说到的多选择搜索机制,在实现时用HashMap + List。
算法图示
此图来自 酷壳: “rsync 的核心算法”, 见参考资料
红色的是匹配的块,白色的是实际传输的内容。
滚动校验和
rsync算法使用的弱滚动校验和 须具有非常廉价地根据 X 1 .. X n 和字节值 X 1 和 X n +1 快速计算 X 2 .. X n +1 的校验和的性质。
rsync算法使用弱校验和算法是由 Mark Adler 发明的adler-32 校验和。校验和定义如下:
实现
在实现时,MD5 算法在 Java 里是现成的,滚动校验和也是不难实现。网上其他的博客提到在计算块的滚动校验和时, a 的初始值是 1 ,在我实现时发现那是错的, rsync 的报告文档没说要这样,报告给出的算法公式也没要求,误导我费了不少时间。
在实现过程中,我觉得比较难的在于 根据 checksum 流计算 diffitem 流,也是我要在这里想说的。
下面这两个图所表示的是基于避免把整个文件读入内存实现的,如果不考虑内存占用,把整个文件读入内存,只需要看第 2 张流程图。在把文件部分读入内存时,第 2 张图是第 1 张图红色字体部分的逻辑。
在实现有两个缓存:
buffer:缓存,容量是块的N倍,直接使用数组。
outBuffer:新增数据块的缓存,是ByteArrayOutputStream的实例。
还有一些int类型的充当指针的变量。
流程图说明:
确保滚动查找数据足够: 判断缓存里是否还有有效的数据,并返回boolean 值表示流是否结束。如果有,返回 false ,如果没有,调用 为块匹配填充缓存,并返回调用结果。
为块匹配填充缓存: 整理并填充缓存,返回boolean 值表示流是否结束。首先把 roll 过的不属于当前块的数据写入新增数据缓存,然后把当前块拷贝到缓存的首部,然后从文件流读取数据填充剩余的缓存空间,并返回表示流是否结束的 boolean 值。
具体源代码见github : https://github.com/wen866595/jrsync
参考资料
http://rsync.samba.org/tech_report/tech_report.html
rsync 的核心算法 | 酷壳 - CoolShell.cn
欢迎关注我的微信公众号: coderbee笔记。
相关推荐
本项目基于Java实现,运用了rsync算法的原理,来高效地处理二进制文件的差异比较。rsync算法是一种广泛使用的快速增量数据传输算法,它能够在大量数据中找出差异部分,仅传输这些差异,从而极大地提高了数据传输效率...
Rsync是一款开源的文件传输协议,其核心功能是能够在本地或网络环境中快速地同步文件和目录。Rsync以其增量复制技术著称,只传输两份文件之间的差异部分,从而大大减少了数据传输量。此外,Rsync还支持压缩、排除...
以下是一个简单的MD4算法的Java实现示例: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD4Example { public static byte[] calculateMD4Hash...
14. 大数据人才应掌握的核心知识包括数学与统计知识、计算机相关知识,如编程、算法和数据结构。 15. 图片中的问题未给出,无法作答。 16. Python中,值为0的任何数字对象的布尔值是False,这是正确的。 17. ...
Java可以与其他工具结合,如Rsync或tar命令,来实现备份。 9. **安全编程**:在处理敏感信息时,必须遵循安全编程原则,防止缓冲区溢出、SQL注入等攻击。Java提供了许多安全相关的类和接口,如`java.security`包。 ...
例如,教育网和ChinaNet之间的差异可以通过教育网内的镜像站点来缓解,这可以通过rsync等工具实现。 6. **负载均衡**:负载均衡是解决高并发和大规模请求的核心技术,它通过将请求分发到多台服务器,避免单点故障,...
Mahout是Apache软件基金会下的一个开源项目,主要提供一系列机器学习算法的实现,如推荐系统、聚类、分类等。Mahout依赖于Hadoop进行分布式计算,可以高效地处理大规模数据集。 #### 六、Mahout搭建和操作 1. **...
1. **差分算法**:在生成增量升级文件时,开发者通常会使用某种差分算法,如Rsync、Xdelta或bsdiff等。这些算法能找出两个文件或文件集之间的最小差异,并将其转换为一个补丁文件。补丁文件通常较小,只包含必要的...
分布式核心域节点拓扑当前在“分布式核心域”实际采用了“主+从”(主从共享),主机使用 Zookeeper 提供对 HDFS、YARN 以及 HBase 的高可用保障,当主控节点出现单点故障时能够及时发现并启动备份的主控节点进行替换...
- 免费且开源:Linux的核心优势之一在于其开源性,这使得任何人都可以查看并修改源代码,同时也能够免费使用。 - 高度稳定性和安全性:相比其他操作系统,Linux因其设计特性而在服务器领域特别受欢迎。 - 多用户...