我们使用rsync将主文件服务器的镜像更新为异地共置备份服务器.我们目前遇到的一个问题是我们的文件服务器有> 1TB的大多数较小的文件(在10-100kb范围内),当我们传输这么多数据时,我们经常最终将连接丢弃几个小时进入传输. Rsync没有恢复/重试功能,它只是重新连接到服务器以从它停止的地方拾取 – 你需要经历文件比较过程,最终与我们拥有的文件数量相当长.
建议解决的解决方案是将大型rsync传输拆分为一系列较小的传输.我认为最好的方法是通过顶级目录名的第一个字母,这不会给我们一个完美均匀的分布,但是足够好.
我想确认一下这样做的方法是否合理,或者是否有更简单的方法来实现目标.
为此,我遍历A-Z,a-z,0-9以选择一个字符$前缀.最初我在考虑跑步
rsync -av --delete --delete-excluded --exclude "*.mp3" "src/$prefix*" dest/
(–exclude“* .mp3”只是一个例子,因为我们有一个更长的排除列表来删除像临时文件这样的东西)
这样做的问题是,strc中不再存在的dest /中的任何顶级目录都不会被–delete接收.为了解决这个问题,我改为尝试以下方法:
rsync \ --filter 'S /$prefix*' \ --filter 'R /$prefix*' \ --filter 'H /*' \ --filter 'P /*' \ -av --delete --delete-excluded --exclude "*.mp3" src/ dest/
我正在使用show并隐藏include和exclude,否则–delete-excluded将删除任何与$prefix不匹配的内容.
这是将rsync分成较小块的最有效方法吗?是否有更有效的工具,或者我错过的旗帜,这可能会使这更简单?
解决方法
我对此的解决方案是一种不同的两遍方法,在这里我可以权衡一些磁盘空间.我在服务器上执行rsync –only-write-batch,然后将批处理文件本身rsync到目标,循环直到rsync成功.批处理完全通过rsync后,目标上的read-batch重新创建所有更改.
这对我来说也有一些意想不到的好处:
>因为我更担心备份“存在”而不是“可用”我实际上并不是每天都在接收端进行读取批处理 – 大多数情况下批处理相对较小>我一直在尝试使用–checksum-seed = 1 ……我可能会错误地阅读文档,但我认为它使批处理文件更具可同步性(即,当我不执行–read-batch时任何一天,第二天的批次同步更快,因为前一天的批次是一个很好的基础)>如果批次太大而无法通过互联网“及时”发送,我可以在外部驱动器上运行它.我及时的意思是,如果我在第二天的备份开始之前无法完成批处理并阅读.>虽然我不亲自这样做,但我可以在不同的位置进行两次异地备份,并将批次发送给它们.