使用Rsync上传下载及同步备份

rsync Sep 28, 2019

平常下载网页资源可以借助一些工具,比如IDM,FDM,上传可以借助各类网盘进行分享。但是到了服务器中,就不能容易借助这些工具直接上传下载了,因为服务器上的资源一般不对外暴露,需要使用特定的传输协议比如SSHSFTP进行上传下载。

全量同步与增量同步

同步上传下载本地和服务器之间资源,现在主流的工具有XFTP,WinScp等。这些工具有个问题是基本上每次都是全量上传,假如一个压缩包有100MB大小,第一次需要全量上传100MB,当我们修改了压缩包里面的一个小文件时,再次压缩上传还是100MB。并且这些同步上传工具中有些不支持断点续传,一旦传输中断就要重新上传。或许可以只上传被修改过的文件到服务器,这是一种思路,但是如果修改的文件有很多,并且目录结构层级非常深,虽然减少了文件上传时间,但是需要手工覆盖替换的时间就多了,并且容易出错。

为了减少上传时间并支持断点续传,可以将全量上传替换成增量差异上传。即每次只同步上传差异的文件部分,如果文件是第一次上传时就使用全量上传。之前提到的比如winScp是支持断点续传,但是并不能差异上传。

GNU/Linux自身附带了一些命令行同步工具,支持全量同步的有scp,可以配置参数-C开启压缩传输。支持增量差异同步的比如Rsync,这如Rsync的名字一样,它的作用就是Remote sync,即远程同步。

使用以上命令行工具时要注意的是要注意的平台支持文件。基本上类*nix都是支持的。Windows上可以通过[WSL][1]支持。

上传工具 方式 断点续传 时间消耗
scp 每次全量 不支持 文件大小/上传速率
winscp 每次全量 支持 文件大小/上传速率
rsync 首次全量/后续差异增量 支持 第一次全量时间同上。后续上传:(差异增量大小/上传速率)加上差异算法时间

Rsync命令

Rsync传输效率高,使用同步算法,只比较变化差异部分。使用rsync对比其他全量上传工具如果多次上传一个修改后的文件,比如java打包后的war包,第一次上传war包时各上传工具速度差异不大都是全量上传。但是当第二次上传同一个修改后的war包后,速度差异就非常明显了。

rsync的常用命令:

-a 包含-rtplgoD
-r 同步目录时要加上,类似cp时的-r选项
-v 同步时显示一些信息,让我们知道同步的过程
-l 保留软连接
-L 加上该选项后,同步软链接时会把源文件给同步
-p 保持文件的权限属性
-o 保持文件的属主
-g 保持文件的属组
-D 保持设备文件信息
-t 保持文件的时间属性
-P 显示同步过程,比如速率,比-v更加详细
-u 加上该选项后,如果DEST中的文件比SRC新,则不同步
-z 传输时压缩

如果是上传文件到服务器而言,可以使用如下命令:

$ rsync -avzP foo.zip [email protected]:/opt
上传foo.zip到xxx服务器的/opt
支持断点续传和压缩上传并且显示上传进度和过程

根据场景:如果文件只需上传一遍,比如博客的安装程序我们只需要安装一遍,不需要多遍上传,这时可以使用任意的上传工具比如scp -C命令及参数压缩上传。但是如果上传的文件需要经常迭代更新并比较大,第一次上传时可以使用任意工具上传,第二次上传就可以借助rsync -avzp命令参数实现增量差异并压缩上传。

总结

使用rsync用在备份同步上,不必每次全量同步,可以节省大量时间。

(完)
[1]: https://docs.microsoft.com/en-us/windows/wsl/install-win10

标签

毛俊

探索,热爱,分享。

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.