libsync是一个用于网络数据同步的开发库。
假设现在有两台计算机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。
上面算法描述中,有几个关键问题需要解决,即文件切分、切分数据块信息描述、差异编码、差异编码信息描述、文件同步。
libsync函数库由提供三个API,原型描述如下:
1、int file_chunk(char src_filename, char chunk_filename, int chunk_algo)
功能:对件进行切分生成分块描述文件。
参数:src_filename为源文件,chunk_filename为生成的块信息描述文件,chunk_algo为文件切分算法,目前支持FSP、CDC、SB三种。
2、int file_delta(char src_filename, char chunk_filename, char delta_filename, int chunk_algo)
功能:使用生成的块描述信息对文件进行差异编码。
参数:src_filename为待编码文件,chunk_filename为通过函数file_chunk生成的块描述文件,chunk_algo为文件切分算法。
3、int file_sync(char src_filename, char delta_filename)
功能:使用差异编码文件将源文件同步至目标文件。
参数:src_filename为基本文件,delta_filename为通过函数file_delta生成的差异编码文件。
数据同步有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。
"数据同步算法研究"一文提出了一种改进的数据同步算法,我在实现的原型系统基础上,将文件切分、差异编码、文件同步等关键算法抽取出来封装成动态开发库libsync,方便自己的开发应用。在本人开发的deduputil,WSIO, wsync等软件中,均使用了libsync动态函数库,现已将libsync发布至google code。libsync函数库由提供三个API,原型描述如下: 1、int f
09.04 笔试,测评 笔试代码题sql比较简单 09.08 一面 1.自我介绍 2.一道简单sql题目 3.python:冒泡排序(实际写的快排) 4.了解实时数仓吗? 5.对Hadoop框架的了解 6.对mapreduce的了解 7.反问 09.12 二面 十分钟左右 1.自我介绍 2.python中怎么实现类型转换 3.python常用的函数 4.研究生阶段的学习计划 5.反问 10.09
最开始发来的邮件说是电话面,当天走完了一面二面,中间只间隔了二十多分钟,当晚HR面,第二天看状态结束了。。。。凉凉 这次幸亏是电话面,手机直接录音了,记录的详细一些。 一面 面试时间:20min 自我介绍? 实习工作介绍,实习内容,所用的技术栈。。。 怎么和同事配合的?自己有开发了那些?有什么提高? 你们这个项目,你觉得还有那些地方可以做优化? 离线和实时结合,未来发展的一些看法? Hive的组成
# 一面9.8 自我介绍 离线项目用到什么架构 实习使用的是什么开发语言 实习做的是哪一层的开发 阿里数仓分层是怎么做的 Mysql的索引是用的什么 为什么用B+树索引 一条语句select from where group by having在mysql中执行顺序是什么 mapreduce的执行过程 hive分区表和分桶表的区别 数据倾斜有哪些是怎么处理的 给题说思路 1. 统计主键出现次数 2
我们有一个包含对象集合的开发服务器。这些对象的实际积累是一个持续的过程,在这个本地开发服务器上运行标签、验证等的整个过程。一旦这些对象准备好生产,它们就会被添加到生产数据库中,从那时起,生产数据库将在其计算中使用它们。 我正在寻找一种简单地将增量(新对象)添加到生产数据库中的方法,同时将所有其他集合和旧对象保留在同一个集合中。到目前为止,我们一直使用MySql,所以这个过程只涉及运行数据库结构和数
虽然之前我们已经提到过不建议直接使用 LogStash::Inputs::TCP 和 LogStash::Outputs::TCP 做转发工作,不过在实际交流中,发现确实有不少朋友觉得这种简单配置足够使用,因而不愿意多加一层消息队列的。所以,还是把 Logstash 如何直接发送 TCP 数据也稍微提点一下。 配置示例 output { tcp { host => "19
Swoole提供了底层的网络socket服务器实现。普通用户只需要实现协议或基于现有的协议进行二次开发。 底层Driver BlockTCP 阻塞的tcp/udp server, 请求按顺序执行,必须处理完一个请求才能继续处理新的请求。 SelectTCP 使用select做IO复用的异步非阻塞 server,可以同时维持多个TCP连接。select最大只能维持1024个连接,并且性能会随着连接数
问题内容: 我有一个相当大的SQL Server 2005数据库,该数据库正在不断开发中。每隔一段时间,我要么找一个新的开发人员,要么需要将大规模的架构更改部署到生产服务器。 我主要关心的是从“主”开发副本向开发人员计算机部署架构+数据更新。 是否有一些内置功能或工具以这种方式发布架构+数据?我希望它花费尽可能少的时间。可以从SSMS内完成吗? 在此先感谢您的时间 问题答案: 我建议使用可以部署架
问题内容: 我正在编写自己的ContentProvider,它将使用SyncAdapter同步到Web服务。 当同步适配器修改内容提供者的数据时,问题会发生,当内部调用getContentResolver()。notifyChange导致同步循环时,提供者触发网络同步。 客户端应用程序进行修改时,需要带有网络同步标志的notifyChange,但在修改同步适配器时应避免使用notifyChange