允许多个同时进行的 rsync 协同运行

允许多个同时进行的 rsync 协同运行

每天我需要在特定时间将 N 个文件从源位置复制到镜像(其中 N 非常大)。假设我告诉多个 CPU 同时对文件子集运行 rsync(网络和磁盘带宽不是问题)。理想情况下,每个 CPU 负责 N 个文件的不相交子集,但实际上有时很难保证。(某些源文件可能被多个 CPU“认领”。)因此,有时 rsync I 和 rsync J 都会尝试同时复制文件 F。

使用rsync -avz --delete --temp-dir=/tmp remote:/path/to/source/ /path/to/dest/,假设 rsyncs I 和 J 都看到这种情况并开始:

/path/to/source/:
    FileA
    FileB
    FileC

/path/to/dest/:
    FileA

每个 rsync 都认为它需要复制文件 B 和 C,并且每个 rsync 都开始这样做,首先复制到 /tmp/name_of_source_file.temp_suffix。假设 I 先完成并将其临时文件移动到/path/to/dest/FileB。现在的情况是:

/path/to/dest/:
    FileA
    FileB

/tmp/:
    FileB.rsyncJsuffix

现在 rsync J 完成了复制,但是在尝试移动其版本的 FileB 时会产生错误,/path/to/dest/因为那里已经存在另一个它在启动时没有看到的 FileB。

rsync 的众多选项中是否有一个可以以某种方式处理这种情况?理想情况下,我希望有一个选项告诉 rsync,“相信自己。你不会做错事。随意覆盖你内心渴望的任何东西。”这样它就不会抱怨在执行过程中突然出现的 FileB。

有什么想法吗?

答案1

我不知道您为什么要以这种方式运行 rsyncs,但如果我是您,我会认真考虑其他方法来解决问题,而不涉及让多个 rsyncs 同时写入同一个文件树。

这是来自 --temp-dir 部分的 rsync 手册页:

如果您使用此选项的原因并非磁盘空间不足,则可能希望将其与 --delay-updates 选项结合使用,这将确保所有复制的文件都被放入目标层次结构的子目录中,等待传输结束。如果没有足够的空间在目标分区上复制所有到达的文件,另一种告诉 rsync 您不太担心磁盘空间的方法是使用带有相对路径的 --partial-dir 选项;因为这会告诉 rsync 可以将单个文件的副本存储在目标层次结构的子目录中,rsync 将使用 partial-dir 作为暂存区来获取复制的文件,然后从那里将其重命名。(指定带有绝对路径的 --partial-dir 不会产生此副作用。)

答案2

假设您有一些目录结构,其中包含一些空目录和一些文件,并且您想要它的存档副本——我会尝试并行运行 rsync:

  1. 重新创建相同的目录结构

查找/source/dir -type f|parallel mkdir -p dest/dir/{//}

  1. rsync 文件:

查找/源/目录 -type f|parallel rsync -a {} /目标/目录/{}

  1. 然后运行一个 rsync 来获取空目录并确保一切正常

rsync -av /源/目录 /目标/目录

相关内容