3.6、rsync同步实现文件目录复制

2018年11月21日 14:12 | 76次浏览 作者原创 版权保护

除了 SCP WebDAV 等主动分发方式,我们还可以采用被动同步的方式来实现文件复制,在这种情况下,接收文件的一端将主动向文件服务器发起同步请求,并根据两端文件列表的差异,有选择性地进行更新,从而保证它和文件服务器的内容一致。

Linux 下的 rsync 工具便可以非常出色地完成这项任务,但值得一提的是,通常情况下 rsync 可以采用 SSH 作为传输通道,但这种方式在性能上受限于 SSH 的传输机制,通过前面的介绍,我们知道 SSH 存在一些额外开销,特别对于小文件的传输,这些开销更显得很不值得。所以,如果条件允许的话,我们尽量使用 rsync 的独立服务器端进程 rsyncd 来负责文件传输,它同时也将使用独立的服务器端口

启动了 rsyncd 后,便可以在进程树中看到它:

3961 ?Ss0:27 /usr/sbin/rsyncd --daemon

通过 rsyncd 的服务器端配置,定义多个需要同步的目录,同时还可以指定账号文件,即便不使用 SSH,也可以实现身份验证。比如在以下的配置中,我们定义了 img,并指向站点的图片目录。

s-cache:~ # vi /etc/rsyncd.conf
gid = users
read only = true
hosts allow = 10.0.1.0/24
use chroot = no
transfer logging = true
log format = %h %o %f %l %b
log file = /var/log/rsyncd.log
slp refresh = 300
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
[img]
path = /data/www/img/htdocs
comment = img.highperfweb.com
read only = yes
auth users = user
secrets file = /etc/rsyncd.secrets

这样一来,拥有授权 IP 地址的服务器便可以随时从这台服务器同步文件,一般来说,我们会将同步指令放置在定时任务中,比如通过以下的 crontab 设置,同步任务将每 5 分钟进行一次。

*/5 * * * * rsync -vzrtopg --progress --delete img@10.0.1.200::img /data/www/img/htdocs/ > /dev/null
2>&1

一切都非常简单,通过定时任务,rsync 对文件的同步可以完全对应用程序透明,但这也恰恰使得应用程序无法细粒度地控制它的工作。当然,你也可以通过应用程序来很好地控制 rsync 的节奏,比如让它不间断地重复运行,即便是一个简单的 Shell程序也能做得到,这样可以最大程度地减少被动同步机制的复制延迟。

另一方面,从我们关心的性能角度来看,对于少量文件的同步,rsync 的表现基本上无可挑剔,但是对于大量的文件,情况便不那么乐观。注意,这里所说的并不是实际复制的文件数目,而是被同步的目录中所有文件个数,因为 rsync 在同步的时候必须扫描被同步目录中的所有文件,并根据文件最后修改时间,和本地进行对比,以找出需要复制的文件,或者需要删除的文件,这样一来,当目录中存在大量的文件时,扫描的开销便可想而知。

我们来看一个例子,以下的 rsync 同步命令将执行近 2 分钟。

s-img:~ # rsync -vzrtopg --progress --delete img@10.0.1.200::img /data /www/img/htdocs/
receiving file list ...
612600 files to consider
sent 66 bytes
received 15109850 bytes
165135.69 bytes/sec
total size is 11426157579
speedup is 756.20

可以看到,当扫描结束后,并没有引发实际的复制操作,这说明本地目录中的文件和文件服务器上是保持一致的,但即便是这样,也花费了近 2 分钟的时间。那么,对于大量文件的同步,有什么更好的办法吗?


此文章本站原创,地址 https://www.vxzsk.com/1925.html   转载请注明出处!谢谢!

感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程