Dropbox差异同步算法rsync及其改进算法原理

2023-11-01 21:08

本文主要是介绍Dropbox差异同步算法rsync及其改进算法原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


之前用过rsync很多次,只知道可以做差异同步也没研究过原理。所谓差异同步是指只通过传输两文件的差异部分将两文件同步到一致,自己取的称谓,不知道学术术语是什么。差异同步算法中最有名的就是rsync系列了。近来研究Dropbox,想看看它的同步怎么做的,没找到官方资料,不过据推测应该用的就是rsync,于是,看看鼎鼎大名的rsync是怎么实现的吧。rsync算法要解决的问题很简单:A和B两个文件在两台服务器中,要将A同步到与B一致,要求尽量减少同步带来的网络传输开销。rsync基本算法
先说基本的rsync算法,并不复杂,简单的说是三步:
1、按固定大小将A分为多块,每块都计算出一个32位的滚动哈希值和一个128位的MD4(有些也用MD5),发给B一端。
2、B一端从位置0开始按的同样块大小的滚动哈希值,查找看是否命中A给的某个滚动哈希值,若匹配,则表明B文件中的这块内容与对应的A中的那块内容很可能是一致的,但由于32位的哈希值强度不够,因此再计算MD4,若还是匹配,则确认是一致内容,这时B发给A端匹配的段号。对于那些不能匹配的内容,则发给A端原始内容。
3、A端得到B端给的匹配信息,构造一个与B一致的复本,若是匹配的块,则拷贝原A文件中对应的块,若是不匹配内容则追加之。滚动哈希值的设计基于Adler32算法,使得2~K+1字节的哈希可以根据1~K字节哈希和1、K+1字节的内容快速计算得到,这可以提高从位置0开始依次计算滚动哈希值的效率。据试验一般来说块大小取500~1000字节效果比较好。rsync初级优化
在上述基本算法之上可以进行一些初级的优化,比如:
1、传输数据再做压缩
2、先用更短小的哈希值作同步,然后比较同步后二者MD5,如果不一样,再换用更长的哈希值,如此在大多数情况下可以减小哈希值的传输开销。因为如果用500字节的块大小的话,一个32位的滚动哈希值和一个128位的MD4会占用原始数据1/25的开销,并不太小基于rsync的改进算法
基于rsync的改进算法主要有多轮rsync和本地rsync两个。多轮rsync的原理简单的说就是先用较大的块大小按rsync的方法处理一轮,但只传输那些命中的块,那些没命中的数据称为“空洞”,按较小的块大小再按rsync的方法又处理一轮,如此双可能产生规模更小的“空洞”,如此按来一轮,直到块大小到配置的最小块大小为止。最后一轮跟原始rsync是一样的,当然只处理上一轮遗留下来的“空洞”。多轮rsync在理论上可以将最差情况下的复杂度(以传输的数据量称是)从原rsync的O(sqrt(n))提高到O(ln n)。试验中有时多轮rsync可以比原rsync有10倍的提升,但大部分情况下是类似的。本地rsync则是直接更新A到与B一致,原始rsync算法是需要构造一个与B一致的副本。为实现这一点,需要先拿到所有匹配信息后进行拓扑排序,再依次应用,是有些复杂的。




转自:http://wangyuanzju.blog.163.com/blog/static/130292010101252632998/









这篇关于Dropbox差异同步算法rsync及其改进算法原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/325752

相关文章

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建