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. Sql Server函数全解(五)之系统函数

     系统信息包括当前使用的数据库名称,主机名,系统错误消息以及用户名称等内容.使用SQL SERVER中的系统函数可以在需要的时候获取这些信息.下面介绍系统函数的作用和使用方法. 1.返回表中指定字段的 ...

  2. 获取linux服务器基本信息脚本

    为了方便日常运维写的一段简单脚本,用于集中获取服务器操作系统.CPU.内存使用.负载.硬盘使用.网络信息. 脚本比较简单,就不解释了,有兴趣的朋友请自行查看. #!/bin/bash##Name:sy ...

  3. jQuery带控制按钮向上和向下滚动文本列表

    效果:http://hovertree.com/texiao/jquery/64/ 效果图如下: 代码如下: <!DOCTYPE html> <html> <head&g ...

  4. jQuery页面顶部下拉广告

    本广告可以是图片也可以是Flash,可以设置自动播放的时间,可以手动停止和重播. 效果展示 http://hovertree.com/texiao/jquery/80/ 源码下载:http://hov ...

  5. LinQ C#防注入式攻击实例代码

    注入式攻击是Web开放项目中开发人员的第一时间要考虑的问题,下面就我的开发实例分享给大家,有用的的话就点个赞吧. 定義賬戶信息類 public class UserInfors { public st ...

  6. Python 3.4 Library setup

    matplotlib:  https://pypi.python.org/pypi/matplotlib/1.4.3 Unofficial Windows Binaries for Python Ex ...

  7. wampsever在线模式和离线模式有什么区别

    我们在开发网站的时候经常会使用到wampsever服务器,在测试项目的时候我们会经常发现,wampsever服务器在线模式和离线模式都可以使用并且测试,还有一个现象就是我们在测试无线网络,用手机访问的 ...

  8. 从零开始学Python08作业思路:开发简单的FTP

    一,作业要求 开发简单的FTP 1,用户登录 2,上传/下载文件 3,不同用户家目录不同 4,查看当前目录下文件 5,充分使用面向对象 二,程序文件清单 Folder目录:用户上传文件家目录 db目录 ...

  9. android raw和assets的区别

    *res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点: 1**.res/raw中的文件会被映 ...

  10. Maven命令行使用:mvn clean compile(编译)

    先把命令行切换到Maven项目的根目录,比如:/d/xxxwork/java/maven-test,然后执行命令: mvn clean compile 执行结果如下: [INFO] Scanning ...