分块大型 rsync 传输?

Gab*_*esy 7 backup rsync file-transfer

我们使用 rsync 将主文件服务器的镜像更新为异地并置备份服务器。我们目前遇到的问题之一是我们的文件服务器有 > 1TB 的大多数较小的文件(在 10-100kb 范围内),当我们传输这么多数据时,我们经常会在几个小时内连接中断转移。Rsync 没有恢复/重试功能,可以简单地重新连接到服务器以从停止的地方开始——您需要通过文件比较过程,这最终会随着我们拥有的文件数量而变得非常长。

建议绕过的解决方案是将大型 rsync 传输拆分为一系列较小的传输。我认为最好的方法是通过顶级目录名称的第一个字母,这并没有给我们一个完美均匀的分布,但已经足够了。

我想确认我这样做的方法是否合理,或者是否有更简单的方法来实现目标。

为此,我遍历 AZ, az, 0-9 以选择一个字符$prefix。一开始我只是想跑步

rsync -av --delete --delete-excluded --exclude "*.mp3" "src/$prefix*" dest/
Run Code Online (Sandbox Code Playgroud)

(--exclude "*.mp3" 只是一个例子,因为我们有一个更长的排除列表来删除临时文件之类的东西)

这样做的问题是 dest/ 中不再存在于 src 上的任何顶级目录都不会被 --delete 选取。为了解决这个问题,我改为尝试以下方法:

rsync \
--filter 'S /$prefix*' \
--filter 'R /$prefix*' \
--filter 'H /*' \
--filter 'P /*' \
-av --delete --delete-excluded --exclude "*.mp3" src/ dest/
Run Code Online (Sandbox Code Playgroud)

我正在使用showand hideover includeand exclude,因为否则 --delete-excluded 将删除任何与 $prefix 不匹配的内容。

这是将 rsync 拆分为较小块的最有效方法吗?有没有更有效的工具,或者我错过的标志,可以让这更简单?

小智 4

我的解决方案是采用不同的两遍方法,其中我牺牲了一些磁盘空间。我在服务器上执行 rsync --only-write-batch ,然后将批处理文件本身 rsync 到目标,循环直到 rsync 成功。一旦批处理完全结束,目标上的 rsync --read-batch 就会重新创建所有更改。

这对我来说也有一些意想不到的好处:

  • 因为我更关心备份“存在”而不是“可用”,所以我实际上并没有每天在接收端执行批量读取——大多数时候批量相对较小

  • 我一直在尝试使用 --checksum-seed=1 ...我可能会误读文档,但我认为它使批处理文件更加可同步(即,当我不执行 --read-batch 任何操作时)给定的一天,第二天的批次同步速度更快,因为前一天的批次是一个很好的基础)

  • 如果批次太大而无法通过互联网“及时”发送,我可以将其通过外部驱动器进行网络传输。我所说的及时是指如果我无法在第二天的备份开始之前完成批处理并进行读取。

  • 虽然我个人不这样做,但我可以在不同的位置有两个异地备份,并将批次发送给它们。