rsync是一种文件差异传输的算法,特点是高效且相似块识别率较高。具体算法这边就不赘述,网上很多,官方文档也描述的很清楚。

rsync提高文件比对效率的一个核心算法之一就是rolling checksum,官方使用的是Alder32 Hash算法。

在我经历的一个项目中,我们在Windows Azure中实现文件差异传输模块,我使用rsync时发现在本地测试速度非常理想,但一旦放到实际环境中则让人完全无法接受。

于是走上了漫长而痛苦的优化之路。。。。。。

除了外部的一些调优,最终我还是决定在rsync的算法上开刀。经过冥思(真的就只是坐着不动,连续几个小时的思考),有一个想法跳了出来 -- Jump Rolling!

rsync中的rolling是一个痛苦漫长计算消耗极大的过程,为了更好的比对文件差异,rsync是逐个字节(byte)进行计算hash比对的,听上去很恐怖,不过如果你看了rolling checksum的算法就知道这个还是很巧妙的提高了rolling的效率。

当rolling了一个chunk的数据发现匹配了,这样很好,标记为匹配,接着从下个chunk开始计算。但如果一直不匹配,rolling就必须一个字节一个字节的进行。

假设一下我们A和B两个文件长度都为100,分成10块每个chunk长度为10:

第一种情况:

A和B完全是相同的两个文件

Rolling开始计算第一块,匹配,接着计算第二块,匹配…… 一共计算5次弱hash和强hash,结束。

第二种情况:

A和B完全不同

Rolling开始计算第一块,不匹配,向后rolling步进为1,直到文件结束都不匹配,一共rolling了90次,结束。(注意直接计算一个chunk的弱hash比rolling一个字节消耗要大,但rolling仍然是非常消耗时间和CPU的计算过程)

好了,到这里我们发现对于匹配度高的文件,rsync计算神速,但匹配度低的文件由于要不断rolling,计算速度就陡然降低很多。

我想到的是我们来根据前面块的计算去“预测”后面块的匹配度。(这怎么可能预测!!!)

是的,预测的算法很多,我使用的是一种比较简单的逻辑“如果出现rolling一整个chunk都没有找到匹配,则预测下个chunk也不匹配”,然后直接跳过下个chunk不计算;进阶的预测是“如果继续出现rolling一整个chunk不匹配,则预测接下来N个chunk也不匹配”,N是关于“连续出现不匹配次数M”的一个函数,函数设计的好可以提高速度又不至于降低太多精度,我用的函数的n = 2^(m-1), 然后根据chunk数量设置了阀值避免跳跃跨度过高(阀值函数也可以自己设计,这边我参考的是rsync的分块算法来完成我的阀值算法)。最后补充规则“当rolling到匹配块时,N重置”,这个规则提高计算结果的匹配精度。OK,这个就是RexSync的精髓了。

再来用RexSync分析状况二:

Rolling开始计算第一块,不匹配,,向后rolling步进为1,直到第2个chunk结束仍然不匹配,跳过chunk3计算chunk4不匹配,rolling chunk5不匹配,跳过6和7计算chunk8不匹配,rolling chunk9不匹配,跳过chunk10结束。rolling了30次,比起rsync的90次降低很多。当然这个例子太简单,实际情况下降低的更多。

好了,这样jump啊jump,精度损失如何?

实际测试结果,精度比rsync下降0-10%左右,当然理论极端值是精度下降到0(除非你根据RexSync的特征制造专门的文件啊亲你真可爱,jump过的chunk都匹配是要闹哪样!)。不过牺牲了一点精度,性能确实极大提高了。你不喜欢牺牲精度?看看标题我怎么写的!!

之前在公司写过正式文档,这篇随便乱写的。sign~

[原创]基于rsync算法的目的性改进-RexSync的更多相关文章

  1. 一种基于Rsync算法的数据库备份方案设计

    根据容灾备份系统对备份类别的要求程度,数据库备份系统可以分为数据级备份和应用级备份.数据备份是指建立一个异地的数据备份系统,该系统是对原本地系统关键应用数据实时复制.当出现故障时,可由异地数据系统迅速 ...

  2. R语言︱情感分析—基于监督算法R语言实现(二)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:本文大多内容来自未出版的<数据 ...

  3. 基于KMP算法的字符串模式匹配问题

    基于KMP算法的字符匹配问题 反正整个清明都在纠结这玩意...差点我以为下个清明要给自己过了. 至于大体的理解,我就不再多说了(还要画图多麻烦鸭),我参考了以下两个博客,写的真的不错,我放了超链接,点 ...

  4. Python实现一条基于POS算法的区块链

    区块链中的共识算法 在比特币公链架构解析中,就曾提到过为了实现去中介化的设计,比特币设计了一套共识协议,并通过此协议来保证系统的稳定性和防攻击性. 并且我们知道,截止目前使用最广泛,也是最被大家接受的 ...

  5. 基于rsync方式的文件备份

    rsync 是一个快速增量文件传输工具,它可以用于在同一主机备份内部的备分,我们还可以把它作为不同主机网络备份工具之用.本文主要讲述的是如何自架rsync服 务器,以实现文件传输.备份和镜像.相对ta ...

  6. LinkedList实现基于LRU算法的缓存

    LinkedList实现基于LRU算法的缓存 2015年08月07日 18:18:45 秦江波 阅读数 2068 文章标签: java算法linkedlist缓存LRU更多 分类专栏: Java   ...

  7. 判断用户输入的银行卡号是否正确--基于Luhn算法的格式校验

    开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS ...

  8. #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  9. 详解rsync算法--如何减少同步文件时的网络传输量

    先看下图中的场景,客户端A和B,以及服务器server都保存了同一个文件,最初,A.B和server上的文件内容都是相同的(记为File.1).某一时刻,B修改了文件内容,上传到SERVER上(记为F ...

随机推荐

  1. 初入网络系列笔记(4)HTTP请求和响应

    一.借鉴说明,本博文借鉴以下博文 1.starok,HTTP必知必会,http://www.cnblogs.com/starstone/p/4890409.html 2.CareySon,HTTP协议 ...

  2. C#基础-技术还债2-枚举

    定一个枚举如下: using System; using System.Collections.Generic; using System.Linq; using System.Reflection; ...

  3. 利用SHELL脚本实现文件完整性检测程序(1.2版更新)

    一..开发背景 因时势所逼,需要对服务器的文件系统实行监控.虽然linux下有不少入侵检测和防窜改系统,但都比较麻烦,用起来也不是很称手.自己琢磨着也不需要什么多复杂的功能,写个脚本应该就可以满足基本 ...

  4. 图解DataGridView编辑列

    WinForm中DataGridView功能强大,除了可以自动绑定数据源外,还可以根据需求编辑列.下面以截图说明添加编辑列的步骤(HoverTreeSCJ 项目实际界面). 1.选择DataGridV ...

  5. ComponentOne 2016 V2发布了!

    火热的夏季迎了ComponentOne今年的第2个重大发布.这次发布包含了一些非常棒的新控件以及很多大的功能增强.   快来下载免费试用版体验吧! FlexChart(UWP.WPF.WinForms ...

  6. MVC 自定义Htmlhelper扩展

    在MVC中,我们不仅可以使用它原来的方法,我们还可以自定义,这不不仅加大了我们开发的效率,同时使界面更简洁. 具体什么是扩展方法,你可以这样理解,必须是静态且在形参中第一个参数是以this开头,大概先 ...

  7. form表单提交和阻止

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. STL中vector、list、map、set区别(转载)

    list封装了链表,vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[].vector对于随机访 ...

  9. Effective C#中文版

    我看的书是<Effective C#中文版——改善C#程序的50种方法>,Bill Wagner著,李建忠译.书比较老了,04年写的,主要针对C#1.0,但我相信其中的观点现在仍有价值.( ...

  10. browserify压缩合并源码反编译

    最近在学习钉钉(一个协作应用)桌面应用的前端源码时候,发现其js源码是用browserify做模块开发.于是想还原其源码的原本的目录结构,学习它的目录分类以及业务划分. 前言 用过browserify ...