我可以使用相同的文件列表 rsync 到多个目的地吗?

Jes*_*sie 24 backup rsync

我想知道 rsync 是否有可能将一个目录一次性复制到多个远程目标,甚至并行复制。(不是必需的,但会很有用。)

通常,类似以下的内容会正常工作:

$ rsync -Pav /junk user@host1:/backup
$ rsync -Pav /junk user@host2:/backup
$ rsync -Pav /junk user@host3:/backup
Run Code Online (Sandbox Code Playgroud)

如果这是唯一的选择,我会使用它。然而,/junk 位于一个包含相当多文件的慢速驱动器上,与实际传输/更新相比,每次重建大约 12,000 个文件的文件列表非常缓慢(大约 5 分钟)。是否有可能做这样的事情,完成同样的事情:

$ rsync -Pav /junk user@host1:/backup user@host2:/backup user@host3:/backup 
Run Code Online (Sandbox Code Playgroud)

Chl*_*loe 13

以下是 rsync 手册页中有关批处理模式的信息。

批处理模式

批处理模式可用于将同一组更新应用到许多相同的系统。假设一个人有一个在多个主机上复制的树。现在假设已经对该源树进行了一些更改,并且这些更改需要传播到其他主机。为了使用批处理模式执行此操作,使用 write-batch 选项运行 rsync 以将对源树所做的更改应用于目标树之一。write-batch 选项使 rsync 客户端将所有信息存储在“批处理文件”中,以针对其他相同的目标树重复此操作。

生成批处理文件一次就不必在更新多个目标树时多次执行文件状态、校验和和数据块生成。多播传输协议可用于将批量更新文件同时并行传输到多个主机,而不是单独向每个主机发送相同的数据。

要将记录的更改应用到另一个目标树,请使用 read-batch 选项运行 rsync,指定同一个批处理文件的名称和目标树。Rsync 使用存储在批处理文件中的信息更新目标树。

为方便起见,使用 write-batch 选项时还会创建一个脚本文件:它的名称与批处理文件相同,并附加了“.sh”。该脚本文件包含一个命令行,适用于使用关联的批处理文件更新目标树。它可以使用 Bourne(或 Bourne-like)shell 执行,可选择传入备用目标树路径名,然后使用该路径名代替原始目标路径。当当前主机上的目标树路径与用于创建批处理文件的路径不同时,这很有用。

   Examples:

          $ rsync --write-batch=foo -a host:/source/dir/ /adest/dir/
          $ scp foo* remote:
          $ ssh remote ./foo.sh /bdest/dir/

          $ rsync --write-batch=foo -a /source/dir/ /adest/dir/
          $ ssh remote rsync --read-batch=- -a /bdest/dir/ <foo
Run Code Online (Sandbox Code Playgroud)

在这些示例中,rsync 用于从 /source/dir/ 更新 /adest/dir/,并且重复此操作的信息存储在“foo”和“foo.sh”中。然后使用进入目录 /bdest/dir 的批处理数据更新主机“remote”。这两个示例之间的差异揭示了您在处理批处理方面的一些灵活性:

  • 第一个示例表明初始副本不必是本地的——您可以根据需要使用 remote-shell 语法或 rsync 守护程序语法向/从远程主机推送或拉取数据。

  • 第一个示例使用创建的“foo.sh”文件在远程主机上运行 read-batch 命令时获取正确的 rsync 选项。

  • 第二个示例通过标准输入读取批处理数据,因此不需要先将批处理文件复制到远程机器。这个例子避免了 foo.sh 脚本,因为它需要使用一个修改过的 --read-batch 选项,但是如果你想使用它,你可以编辑脚本文件(只要确保没有其他选项试图使用标准输入,例如“--exclude-from=-”选项)。

    注意事项:

    read-batch 选项期望它正在更新的目标树与用于创建批处理更新文件集的目标树相同。当desti有区别吗?遇到国家树时,更新可能会被丢弃并发出警告(如果文件看起来已经是最新的),或者可能会尝试文件更新,然后,如果文件无法验证,则更新会因错误而被丢弃. 这意味着如果命令被中断,重新运行读取批处理操作应该是安全的。如果您希望无论文件的大小和日期如何都强制始终尝试批量更新,请使用 -I 选项(读取批处理时)。如果发生错误,目标树可能处于部分更新状态。在这种情况下,

    在所有目标上使用的 rsync 版本必须至少与用于生成批处理文件的版本一样新。如果批处理文件中的协议版本太新,批处理读取 rsync 无法处理,则 Rsync 将因错误而终止。另请参阅 --protocol 选项,以获取一种让创建 rsync 生成旧 rsync 可以理解的批处理文件的方法。(请注意,批处理文件在 2.6.3 版中更改为?mat,因此将旧版本与较新版本混合将不起作用。)

    读取批处理文件时,如果您没有将它们设置为与批处理写入命令相同,rsync 将强制某些选项的值与批处理文件中的数据匹配。可以(并且应该)更改其他选项。例如,--write-batch 更改为--read-batch,--files-from 被删除,除非指定了--delete 选项之一,否则不需要--filter/--include/--exclude 选项.

    创建 BATCH.sh 文件的代码将任何过滤器/包含/排除选项转换为单个列表,该列表作为“此处”文档附加到 shell 脚本文件。如果需要更改由 --delete 删除的内容,高级用户可以使用它来修改排除列表。普通用户可以忽略此细节,只需使用 shell 脚本作为为批处理数据运行适当的 --read-batch 命令的简单方法。

    rsync 中的原始批处理模式基于“rsync+”,但最新版本使用了新的实现。

我想你可以试试

rsync --write-batch=foo -Pav /junk user@host1:/backup
foo.sh user@host2:/backup
foo.sh user@host3:/backup
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是我尝试做的最正确的解决方案,尽管我的用例早已蒸发到以太中。:D (2认同)

Jas*_*son 5

您可以尝试使用unison。它在构建文件列表时应该更快,因为它保留了文件的缓存。

  • 注意:Unison 不保留文件的“缓存”。它只保留文件名、时间戳、校验和的数据库。它仍然会扫描文件系统并创建校验和以与远程进行比较。Unison 的唯一优势是双向同步。我推荐 Unison,但它在这里没有帮助。 (2认同)

小智 5

rsync --batch-mode组播支持。如果这在您的网络上是可能的,那么可能值得研究一下。