数据同步算法研究

1、引言

基于LAN或WAN的网络应用之间进行数据传输或者同步非常普遍,比如远程数据镜像、备份、复制、同步,数据下载、上传、共享等等,最为简单的做法自然就是对数据进行完全复制。然而,数据在网络上来回被复制多次后就会存在大量副本,很多情形下这些文件副本之间仅有很小的差异,很可能是从同一个文件版本演化而来。如果对文件进行完全复制,在文件较大的情况下,会占用大量网络带宽,同步时间也会较长。

目前,广域网WAN的带宽与访问延迟仍然是急需解决的问题,完全复制使得很多网络应用无法提供良好的服务质量,比如分布式文件系统(DFS)、云存储(Cloud Storage)。Rsync与RDC(Remote Differential Compression)是两种最为常见的数据同步算法,它们仅传输差异数据,从而节省网络带宽并提高效率。本文基于这两种算法思想并借助重复数据删除(De-duplication)技术,对数据同步算法进行深入研究与分析,并研发了原型系统。首先介绍rsync与RDC算法,然后详细描述算法设计与相应的数据结构,并重点分析文件分块、差异编码、文件同步算法,最后简介推拉两种应用模式。

2、相关工作

Rsync是类Unix环境下的一个高效的远程文件复制(同步)工具,它通过著名的Rsync算法来优化流程,减少了数据通信量并提高文件传输效率。假设现在有两台计算机Alpha和Beta ,计算机Alpha能够访问A文件,计算机Beta能够访问B文件,文件A和B非常相似,计算机Alpha和Beta通过低速网络互联。它的大致流程如下(详细过程请参考Rsync作者Andrew Tridgell的tech_report.ps):

1、Beta将文件B分割成连续不重叠的固定大小数据块S,最后一个数据块上可能会小于S字节;

2、Beta对于每一个数据块,计算出两个校验值,一个32位的弱滚动校验和一个128位的MD4校验;

3、Beta将校验值发送给Alpha;

4、Alpha通过搜索文件A的所有大小为S的数据块(偏移量可以任意,不一定非要是S的倍数),来寻找与文件B的某一块有着相同的弱校验码和强校验码的数据块。这主要由滚动校验Rolling checksum快速完成;

5、Alpha给Beta发送重构A文件的指令,每一条指令是一个文件B数据块引用(匹配)或者是文件A数据块(未匹配)。

Rsync是一个非常优秀的工具,但它仍然存在一些不足之处。

1、Rolling checksum虽然可以节省大量checksum校验计算量,也对checksum搜索作了优化,但多出一倍以上的hash查找,这个消耗不小;

2、Rsync算法中,Alpha和Beta计算量是不对等的,Alpha计算量非常大,而Bete计算量非常小。通常Alpha是服务器,因此压力较大;

3、Rsync中数据块大小是固定的,对数据变化的适应能力有限。

RDC算法的典型代表是微软DFS中的DFSR(Distributed File System Replication),它与Rsync不同之处在于采用一致的分块规则对复制的源文件和目标文件进行切分。因此,RDC对于源端和目标端的计算量是对等的。RDC和RSync算法在设重点上有所不同,Rsync追求更高的重复数据发现而不惜计算量;RDC在两者之间作了一个折衷,目标是以少量的计算快速发现数据差异,当然重复数据发现不及Rsync。另外,Rsync是定长分块策略,而RDC是变长分块策略。

3、重复数据删除技术

De-duplication,即重复数据删除,它是一种非常新的且流行度很高的存储技术,可以大大减少数据的数量。重复数据删除技术,通过数据集中重复的数据,从而消除冗余数据。借助dedup技术,可以提高存储系统的效率,有效节约成本、减少传输过程中的网络带宽。同时它也是一种绿色存储技术,能有效降低能耗。

Dedupe按照消重的粒度可以分为文件级和数据块级。文件级的dedup技术也称为单一实例存储(SIS, Single Instance Store),数据块级的重复数据删除,其消重粒度更小,可以达到4-24KB之间。显然,数据块级的可以提供更高的数据消重率,因此目前主流的 dedup产品都是数据块级的。将文件都分割成数据块(定长或变长的数据块),采用MD5或SHA1等Hash算法 (可以同时使用两种或以上hash算法或CRC校验等,以获得非常小概率的数据碰撞发生)为数据块计算指纹(FP, Fingerprint)。具有相同FP指纹的数据块即可认为是相同的数据块,存储系统中仅需要保留一份。这样,一个物理文件在存储系统就对应一个逻辑表示,由一组FP组成的元数据。当进行读取文件时,先读取逻辑文件,然后根据FP序列,从存储系统中取出相应数据块,还原物理文件副本。

Dedupe技术目前主要应用于数据备份,因此对数据进行多次备份后,存在大量重复数据,非常适合这种技术。事实上,dedupe技术可以用于很多场合,包括在线数据、近线数据、离线数据存储系统,甚至可以在文件系统、卷管理器、NAS、SAN中实施。也可以用于网络数据传输,当然也可以应用于数据打包技术。Dedupe技术可以帮助众多应用降低数据存储量,节省网络带宽,提高存储效率、减小备份窗口,绿色节能。

4、数据同步算法

如Rsync假设现在有两台计算机Alpha和Beta ,计算机Alpha能够访问A文件,计算机Beta能够访问B文件,文件A和B非常相似,计算机Alpha和Beta通过低速网络互联。基于dedupe技术的数据同步算法大致流程与Rsync相似,简单描述如下:

1、Beta采用数据切分算法,如FSP(fixed-size partition)、CDC(content-defined chuking),将文件B分割成大小相等或不等的数据块;

2、Beta对于每一个数据块,计算一个类似rsync弱校验值和md5强校验值,并记录数据块长度len和在文件B中的偏移量offset;

3、Beta将这将数据块信息发送给Alpha;

4、Alpha采用同样的数据块切分技术将文件A切成大小相等或不等的数据块,并与Beta发过来的数据信息进行搜索匹配,生成差异编码信息;

5、Alpha将差异编码信息发送给Beta,并同时发送重构文件A的指令;

6、Beta根据差异编码信息和文件B重构文件A。

上面算法描述中,有几个关键问题需要解决,即文件切分、切分数据块信息描述、差异编码、差异编码信息描述、文件同步。文件切分、差异编码、文件同步将在后续部分介绍,这里对切分数据块信息描述和差异编码信息描述作说明。

切分数据块信息的数据文件布局由文件头(chunk_file_header)和数据块描述(chunk_block_entry)实体集组成,具体定义如下。其中,文件头定义了文件B的数据块大小、数据块总数。文件头后紧随一组数据块描述实体,每个实体代表一个数据块,定义了块长度、块在文件B中的偏移、弱校验值和强md5校验值。 

view plaincopy to clipboardprint?
/* define chunk file header and block entry */  
typedef struct _chunk_file_header {   
        uint32_t block_sz;   
        uint32_t block_nr;   
} chunk_file_header;   
#define CHUNK_FILE_HEADER_SZ    (sizeof(chunk_file_header))   
typedef struct _chunk_block_entry {   
        uint64_t offset;   
        uint32_t len;   
        uint8_t  md5[16 + 1];   
        uint8_t  csum[10 + 1];   
} chunk_block_entry;   
#define CHUNK_BLOCK_ENTRY_SZ    (sizeof(chunk_block_entry))  
/* define chunk file header and block entry */
typedef struct _chunk_file_header {
        uint32_t block_sz;
        uint32_t block_nr;
} chunk_file_header;
#define CHUNK_FILE_HEADER_SZ    (sizeof(chunk_file_header))
typedef struct _chunk_block_entry {
        uint64_t offset;
        uint32_t len;
        uint8_t  md5[16 + 1];
        uint8_t  csum[10 + 1];
} chunk_block_entry;
#define CHUNK_BLOCK_ENTRY_SZ    (sizeof(chunk_block_entry))

差异编码信息的数据文件布局同样由文件头(delta_file_header)和数据块描述实体(delta_block_entry)集组成,如下所定义。其中,文件头定义了文件A的数据块总数、最后一个数据的长度和偏移。文件头后紧随一组数据块描述实体,每个实体代表一个数据块,定义了数据块长度、偏移以及数据块位置指示。如果embeded为1,则表示数据块位于差异编码文件中offset处,数据紧随该实体后;如果embeded为0,则表示数

据块位于文件B中offset处。最后数据块存储于差异编码文件尾部,长度和偏移由头部指示。

view plaincopy to clipboardprint?
/* define delta file header and block entry */  
typedef struct _delta_file_header {   
        uint32_t block_nr;   
        uint32_t last_block_sz;   
        uint64_t last_block_offset;  /* offset in delta file */  
} delta_file_header;   
#define DELTA_FILE_HEADER_SZ    (sizeof(delta_file_header))   
typedef struct _delta_block_entry {   
        uint64_t offset;   
        uint32_t len;   
        uint8_t  embeded; /* 1, block in delta file; 0, block in source file. */  
} delta_block_entry;   
#define DELTA_BLOCK_ENTRY_SZ    (sizeof(delta_block_entry))  
/* define delta file header and block entry */
typedef struct _delta_file_header {
        uint32_t block_nr;
        uint32_t last_block_sz;
        uint64_t last_block_offset;  /* offset in delta file */
} delta_file_header;
#define DELTA_FILE_HEADER_SZ    (sizeof(delta_file_header))
typedef struct _delta_block_entry {
        uint64_t offset;
        uint32_t len;
        uint8_t  embeded; /* 1, block in delta file; 0, block in source file. */
} delta_block_entry;
#define DELTA_BLOCK_ENTRY_SZ    (sizeof(delta_block_entry))

从实时性能方面考虑,数据块信息和差异编码信息并不一定要写入文件,可以存在于Cache中,但数据布局与上面描述相同。

5、文件切分

Dedupe技术中,数据分块算法主要有三种,即定长切分(fixed-size partition)、CDC切分(content-defined chunking)和滑动块(sliding block)切分。定长分块算法采用预先定义好的块大小对文件进行切分,并进行弱校验值和md5强校验值。弱校验值主要是为了提升差异编码的性能,先计算弱校验值并进行hash查找,如果发现则计算md5强校验值并作进一步hash查找。由于弱校验值计算量要比md5小很多,因此可以有效提高编码性能。定长分块算法的优点是简单、性能高,但它对数据插入和删除非常敏感,处理十分低效,不能根据内容变化作调整和优化。

CDC算法是一种变长分块算法,它应用数据指纹(如Rabin指纹)将文件分割成长度大小不等的分块策略。与定长分块算法不同,它是基于文件内容进行数据块切分的,因此数据块大小是可变化的。算法执行过程中,CDC使用一个固定大小(如48字节)的滑动窗口对文件数据计算数据指纹。如果指纹满足某个条件,如当它的值模特定的整数等于预先设定的数时,则把窗口位置作为块的边界。CDC算法可能会出现病态现象,即指纹条件不能满足,块边界不能确定,导致数据块过大。实现中可以对数据块的大小进行限定,设定上下限,解决这种问题。CDC算法对文件内容变化不敏感,插入或删除数据只会影响到检少的数据块,其余数据块不受影响。CDC算法也是有缺陷的,数据块大小的确定比较困难,粒度太细则开销太大,粒度过粗则dedup效果不佳。如何两者之间权衡折衷,这是一个难点。

滑动块算法结合了定长切分和CDC切分的优点,块大小固定。它对定长数据块先计算弱校验值,如果匹配则再计算md5强校验值,两者都匹配则认为是一个数据块边界。该数据块前面的数据碎片也是一个数据块,它是不定长的。如果滑动窗口移过一个块大小的距离仍无法匹配,则也认定为一个数据块边界。滑动块算法对插入和删除问题处理非常高效,并且能够检测到比CDC更多的冗余数据,它的不足是容易产生数据碎片。

6、差异编码

差异编码的基础是文件B数据分块信息和文件A,它首先对文件A进行对等数据分块(滑动块算法除外,它对文件B的切分是定长算法,而对文件A是滑动块算法),然后匹配文件B数据分块信息。如果数据块匹配,则用数据块索引表示,达到重复数据删除效果。否则,则将对应的文件A数据块写入差异编码文件中。数据块匹配算法方面,定长切分和CDC切分是基本相同,文件A采用和文件B对等的切分算法进行数据块切分。滑动块算法与其他两种算法不同,它与rsync类似,它对文件B的切分是定长算法,而对文件A的切分是滑动块算法。因此,这种算法切分是不对等的。

然后根据文件B构造hashtable,通过hash查找进行匹配,并按照差异编码数据布局构造相应数据文件。

7、文件同步

Beta得到差异编码文件delta,再结合已有的文件B,即可以将文件B同步成文件A的副本。同步算法遍历delta文件,读取每一个数据块描述实体,根据embeded标志分别从delta和文件B中读取相应的数据块,重新构造出文件A。

8、PULL与PUSH模式

数据同步有PULL和PUSH两种应用模式,PULL是将远程数据同步到本地,而PUSH是将本地数据同步到远程。对应到同步算法,主要区别在于数据分块和差异编码位置不同。PULL和PUSH同步模式步骤分别如下所述。

PULL同步模式流程

1、本地对文件A进行数据切分,生成数据块描述文件chunk;

2、上传chunk文件至远程服务器;

3、远程服务器对文件B进行差异编码,生成差异编码文件delta;

4、下载delta文件至本地;

5、本地同步文件A至文件B,相当于下载文件B到本地文件A。

PUSH同步模式流程

1、远程服务器对文件B进行数据切分,生成数据块描述文件chunk;

2、下载chunk文件至本地;

3、本地对文件A进行差异编码,生成差异编码文件delta;

4、上传delta文件至远程服务器;

5、远程同步文件B到A,相当于上传文件A到远程文件B。

转载:http://blog.csdn.net/liuben/archive/2010/08/06/5793706.aspx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CCNP-第十一篇-BGP(三)(精髓篇)

CCNP-第十一篇-BGP(三) BGP十三条线路原则(大点) 能修改的前7条,後6条是无法修改的,所以实际上7条 跟ACL一样,从上往下执行,比如第一条比较出来了就不会继续往下了 工作中比较多用的,第四条根据as-path一,权重-Weight 1.思科里面叫权重,是思科私有的,在华为叫首选优先级(Pre…

WSS 数据库表中的 UserInfo 表中的 tp_SystemId 字段的使用

在 WSS 的数据库中,UserInfo表的 tp_SystemId 记录的是用户登录验证时需要用到的数据,是此用户在 AD( Active Directory ) 中的 SID( Security ID )。此字段的数据很重要,不小心改动的话,此用户将不能登录 WSS。 这里介绍一下如何…

CCNP-第十二篇-BGP(四)

CCNP-第十二篇-BGP(四) 这次接着上次的选路原则继续干 上次是前6条,现在是跟后面的7条 BGP的选路原则默认是11条,最大可以配置后去到13条七.EBGP路由优于IBGP 这个不知道咋讲呢 如果A-B-C 那么A-B为IBGP B-C为EBGP的话 他们同时宣告一个条目 在两边对称的情况下,会选择EBGP宣告…

使用Module自定义网站定义(Site Definition)

在WSS SDK中有一篇文章介绍了使用Modules添加文件到网站定义中(可以在http://msdn.microsoft.com中搜索Using Modules to Add Files to a Site Difinition找到),不过很多东西只是稍微提了一下,具体怎么操作并没有讲到。 一般的,我们可以用下…

CCNP-第十三篇-BGP(五)

CCNP-第十三篇-BGP(五) 这一节要讲下BGP联邦 干啥用的呢? 打破IBGP的传递问题 其实这个东东有点像BGP版本的NAT 啥意思呢? 我自己启动AS100 但是对外宣告200 通过EBGP打破IBGP的传递问题总有AS:1-65535 私有AS 65412-65535 网络环境 环境搭建好之后,R2和R3互为ibgp,as为65…

CCNP-第十五篇-VXLAN(一)

CCNP-第十五篇-VXLAN(一) 到了这个阶段呢,怎么说呢,简单的NP级别的交换我都跳过去了,但是后期会补, 所以这个衔接可能新手或者不会的看的有的迷茫 但是出自个人原因只好这么干了,VXLAN3篇差不多就到IE的MPLS,各种VPN 然后为什么先发第十六不发十五呢 十五是BGP的综合实验,暂时…

Sites Table

The Sites Table stores information about site collections. The Table is defined using T-SQL syntax, as follows. TABLE <table name>(FullUrl nvarchar(255) DEFAULT N’’,Id uniqueidentifier,NextUserOrGr…

CCNP-第十六篇-VXLAN效果演示+端口镜像

CCNP-第十六篇-VXLAN(二)端口镜像 这一篇主要搞vxlan的实操演示 VXLAN演示 正常的ensp里面应该是没这个镜像的 要用到这个CE12800 我这有,可以提供给大家使用 链接&#xff1a;https://pan.baidu.com/s/1nqGo8a7mmWpthu-CuBC80Q?pwdcjnb 提取码&#xff1a;cjnb 这玩意要手动…

CCNP-第十四篇-BGP综合实验

CCNP-第十四篇-BGP综合实验 大家好呀,学了那么长时间的BGP,又是一个巨大分水岭,那怎么能没综合实验呢? 答案以及个人录制视屏(数字那个视频因为录制软件的问题看不到命令行可以直接看后面的,不喜勿喷) 链接&#xff1a;https://pan.baidu.com/s/159TcFZyugYgupXzgBN1l-w?pwd…

CCIE-LAB-第一篇-教学导入环境

CCIE-LAB-第一篇-教学导入环境 2022/2/23 时间好紧啊草 开始讲lab就内容会变少,更新速度会变快. 做IE LAB 头都大,不信去看拓扑图就知道了,在第二篇 首先下载这四个东西导入进入vm里面 链接&#xff1a;https://pan.baidu.com/s/1lrrlSyEMpi0jUde_VhLR6A?pwdfgdt 提取码&a…

CCIE-LAB-第二篇-端口聚合LACP+RSTP

CCIE-LAB-第二篇-端口聚合LACP+RSTP 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 解决101.102.110-交换机,在左上角,请注意还有生成树的环境 做链路聚合 TAG:不要修改预配置的,他预先的LACP 关日志 比如这些烦人的东东你可以关掉他的日志 no log…

CCIE-LAB-第三篇-VRRP+SLA

CCIE-LAB-第三篇-VRRP+SLA 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 简单翻译 做冗余,意思就是VRRP.必须用优先级. 每个路由器都要用ping包去检测r11和r12的接口,每5秒一次,400毫秒内收不到回复就会通告不可达.如果11和12都挂了,那么交换…

CCIE-LAB-第四篇-OSPFv2+SHA384+BFD

CCIE-LAB-第四篇-OSPFv2+SHA384+BFD 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 本次修改设备为sw101.sw102.sw201.sw202 问题描述 1:启动OSPFv2,保证邻居关系 2.保障认证和完整性,在冗余连接上. DC和HQ要保证OSPF的源数据,

CCIE-LAB-第五篇-DHCP+DHCP-Realy+DHCP snooping

CCIE-LAB-第五篇-DHCP+DHCP-Realy+DHCP snooping 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 翻译: 第1.5节:针对HQ的DHCP IPV4服务(2点)问题使HO VLAN 2000和VLAN 2001中的主机能够根据这些要求1通过DHCP获得其IP配置。在SW211上,分别…

SharePoint三个主要数据库

三个主要数据库解释&#xff1a; sharepoint_admin_content -- 管理中心数据库 sharepoint_config -- 配置数据库 WSS_content -- 网站内容数据库 数据库中表解释&#xff1a; sharepoint_config.objects :物理对象表,包括站点,数据库,工作流作业等;其中的ID字段&#xff…

CCIE-LAB-第六篇-IPV6+SLLAC

CCIE-LAB-第六篇-IPV6+SLLAC 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 翻译: 第1.6节:HQ中的IPV6(点)问题在sw101和sw102上为交换机虚拟接口实施Pv6(SVT的SVLAN 2000和Vlan200l根据这些要求SSW10接口VLAN 2000:2001:DB8:1💯1/64接口…

PowerDesigner怎样才能在修改表的字段Name的时候Code不自动跟着变

tools-> General Options-> Dialog:Operation Modes: 去掉 NameToCodeMirroring 前面的√ PowerDesigner快捷键【转】 一般快捷键 快捷键 说明 F4 打开检查模型窗口&#xff0c;检查模型 F5 如果图窗口内的图改变过大小&#xff0c;恢复为原有大小即正常大小…

CCIE-LAB-第七篇-IPV6 EIRGP+Passive

CCIE-LAB-第七篇-IPV6 EIRGP+Passive 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 翻译: 在HQ中,根据这些要求1在rll、r12、sw101和sw 102上启用IPV6的EIGRP。使用过程名称“ccie”(不带引号)和编号650012。不要配置任何其他IPV6地址3。I…

微服务--分布式事务的实现方法及替代方案

这两天正在研究微服务架构中分布式事务的处理方案, 做一个小小的总结, 作为备忘. 如有错误, 欢迎指正! 概念澄清 事务补偿机制: 在事务链中的任何一个正向操作, 都必须存在一个完全符合回滚规则的可逆操作, 这个操作通常叫做rollback或者cancel. CAP理论: CAP(Consistency, A…

CCNP-第十七篇-VXLAN(三)

CCNP-第十七篇-VXLAN(三) 今天主要有点点复习的效果,这篇内容会偏少一点点 今天主要演示VXLAN环境下的跨子网的vxlan 跨子网的VXLAN 部署方式 1.集中式GW部署,意味着内网里面就一个大网关 本次演示 2.分布式GW部署,这里面会涉及到MPLSBGP,不过很多IDC都用这种. 建立VTEP的过…