阿里云
1024开发者盛宴之Java专家问答专场
发表主题 回复主题
  • 600阅读
  • 0回复

[大牛分享]超大文件如何同步传输?

级别: 程序猿
发帖
243
云币
342
随着计算机技术和互联网的快速发展以及智能终端设备的兴起,移动化办公已经成为常态。目前,越来越多的人们拥有多个智能终端设备,这极大的方便了人们的工作和生活。智能终端设备的普及在给人们带来方便的同时,也给人们的文件管理提出了新的挑战。如何保证多个设备之间的数据一致性以及如何高效地进行文件同步成为了人们关注的焦点,除此之外,数据的可追溯性也逐渐进入人们的视野。现有的文件同步软件大都没有提供数据的可追溯性功能,一旦用户修改文件并保存后就无法回退到该文件之前的状态。 /si<Fp)z  
.))g]CH  
{F<0e^*  
文件同步是用于保持不同设备上文件一致性的应用程序。用户通过设置一个文件同步目录来保存需要同步的文件,当用户更新文件时,这些变化将动的同步到该用户的其他设备上。当人们在旅行、出差时需要访问某些远程文件时,文件同步系统的作用就突显出来了,文件同步的应用也越来越广。主要用到的技术: /l<(i+0  
4. R(`#f  
.2%t3ul[  
1.重复数据删除技术 O|t>.<T?  
ChK-L6  
xN*k&!1&  
文件同步系统需要存储用户数据,这些数据往往存在许多冗余,若对所有的用户数据进行存储势必会降低系统存储空间的利用率。本文通过分析研究了文件系统中常用的重复数据删除技术,并利用滑动分块的重复数据删除算法实现冗余数据的删除。 /phMrL=  
AUD) =a>  
o-bH3Jkb]&  
滑动分块算法:使用固定大小的滑动窗口计算文件每个位置处固定大小数据块的弱校验值,仅在弱校验值匹配成功之后,该算法将计算数据块的 Hash值并用于实现更为准确的重复数据查找。其中只有当强弱校验值都匹配成功时,才认为找到重复数据并将其作为一个分界块,该分界块与前一个分界块之间的数据形成一个不定长度的数据块并存储该数据块的原始信息及其强弱校验值,接着移动滑动窗口大小的距离开始查找;当匹配过程中任何一个环节失败或者数据块大小达到滑动窗口大小,都意味着没能找到重复数据,因此需要滑动窗口到下一个位置处。滑动分块算法结合了定长分块和变长分块算法的优点,它通过采用强弱校验值的方式,可以避免为不相同的数据分块计算 Hash 值,从而降低了算法的运行时间。基于变长分块的特性,滑动分块同样能保证对数据插入或删除只会影响附近的数据块,后续的相同数据块同样能通过算法匹配出来。 {@2+oOuYfN  
@aQ:3/  
S TWH2_`  
2.文件同步算法 VzXVy)d  
c!E{fSP  
tU?BR<q  
比如,服务端有一个文件 A,客户端有一个文件 B,现在需要将文件 A 的内容同步到文件 B 中,传统的做法就是将服务器端的文件 A 的所有数据通过网络发送到客户端并重写文件 B。然而,当文件 A 和文件 B 具有一定的相似度时,这种方式将会造成网络带宽的浪费。Andrew  Tridgell 在 1996 年提出的 Rsync同步算法巧妙地解决了上述问题。Rsync 同步流程: ]EHsRd  
jSpj6:@B  
$1ovT8  
1) 客户端采用定长分块算法对文件进行分块,并采用 Adler-32算法计算分块的弱校验值和 MD5 算法计算强校验值; 0U7Gl9~  
2) 客户端将文件分块编号强弱校验值发送给服务器进行重复数据查找; Tw';;euw  
3) 服务器接收到文件分块信息后,由强弱校验值建立查找树,并将待同步的文件进行分块进行重复数据查找;  Z}t;:yhR  
4) 若服务器查找到重复数据,则向客户端发送重复数据块的编号,否则发送文件内容信息; C`r:jA<LC,  
5) 客户端在接收到来自服务器的信息后,并根据这些信息构造服务器端的文件,从而实现将服务器端的文件同步到客户端。 @RPQ 1da  
;t*SG*Vi  
ou-#+Sdd  
其实,在 Rsync 算法中,最关键的部分就是上述流程中的步骤2),它通过两轮校验找出文件之间的相同部分,Rsync服务器在接收到来自客户的文件同步请求及分块信息之后,利用分块信息建立查找树,随后服务器将待同步的文件通过重叠文件每个偏移分块的方式查找匹配数据块。 ?wHhBh-Q  
`qJJ{<1&U  
UJ,vE}=_{  
3.文件监控技术 '!A}.wF0  
pyV`O[  
gM&O dT+i  
当用户数据发生变化时,用户通常希望同步软件能自动将变化的文件同步到服务器端,为了实现这种效果需要监控同步目录下的文件,从而及时地进行同步操作 nK03xYA  
q=->) &D%  
UH6 7<_mK  
1)JNotify 开源库:JNotify是用于应用程序监控文件系统中文件创建、修改、重命名以及删除等事件的 Java 开源库,它支持 Windows、Linux 以及 Mac  平台,对于 Linux 系统而言,JNotify 是对 Linux 操作系统提供 INotify 接口进行封装,从而实现对文件及文件夹的监控功能,由于 Linux 的 INotify 应用程序编程接口不能递归的监控子目录,JNotify 通过为每个子目录创建一个 INotify 监控器实现子目录的监控,这对用户来说是透明的; Cp/f18zO  
{ rLgyrj$  
hZHM5J~  
2)Watch Service 技术:atch  Service提供了件系统监控 API。Watch Service 在对文件进行监控时,无法直接监控目录下的子目录文件信息,必要递归的遍历子目录,从而为每个文件建立监听事件才能监控到子目录下的文件变化信息,由于该功能是由 JDK 自身提供的,因此不会依赖特定平台,在不同平台下都能保持一致。 _rB,N#{2R=  
8u~  
In_"iEo,  
w -o#=R_  
g|]HS4y  
目前,市面上存在不少文件同步系统,如360 云盘、百度云盘、微云的云存储系统等,它们都有一个共同的特征就是依靠强大的免费存储空间来获取用户。实际上,大部分用户也只是将这类云存储作为一个云端的数据备份网盘。由于它们并没有提供给用户关于文档变更的历史信息,一旦用户无意间更改某个文件之后,要想重新获取之前版本几乎是不可能的。 y(QFf*J  
l[:Aq&[o3  
AcuF0KWw/  
在当前的云同步系统中,用户如果需要保存某个文件的多个版本通常需要手动的重命名文件,然后上传到同步系统中,随后在其他设备上进行操作,如此繁琐的操作使得用户体验极为不佳。当用户维护的版本过多时,要记住各个不同版本之间的差异本身就是一件很困难的事,同时,在使用时用户还需要在众多相似文件名中找出需要回退的版本,为此用户需要不停的查看对比,才能确定回退的版本。 e1-tpD:J  
_xv3UzD  
NCkI[d]B@  
此外,由于用户包含众多相似的文件,因此这些相似的文件中必然有一部分数据是重复,对于同步系统来说,重复数据的存储将导致系统存储空间的利用率降低。针对上述问题,文件同步软件能提供很好的解决方案并有很大的市场前景。 7?R600OA  
kd^H}k  
=${.*,o  
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
验证问题: ECS是阿里云提供的什么服务? 正确答案:云服务器
上一个 下一个