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

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

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

通常情况下,类似下面的方法就可以正常工作:

$ rsync -Pav /junk user@host1:/backup
$ rsync -Pav /junk user@host2:/backup
$ rsync -Pav /junk user@host3:/backup

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

$ rsync -Pav /junk user@host1:/backup user@host2:/backup user@host3:/backup 

答案1

这是来自 rsync 手册页的有关批处理模式的信息。

批处理模式

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

生成批处理文件一次可省去在更新多个目标树时多次执行文件状态、校验和和数据块生成的麻烦。可以使用多播传输协议将批处理更新文件同时并行传输到多台主机,而不是将相同的数据分别发送到每台主机。

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

为了方便起见,使用 write-batch 选项时还会创建一个脚本文件:它将被命名为批处理文件的名称,但附加了“.sh”。此脚本文件包含一个命令行,适用于使用相关批处理文件更新目标树。它可以使用 Bourne(或类似 Bourne)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

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

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

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

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

    注意事项:

    读取批处理选项要求它正在更新的目标树与用于创建批处理更新文件集的目标树相同。当发现目标树之间存在差异时,可能会丢弃更新并发出警告(如果文件似乎已经是最新的),或者可能会尝试文件更新,然后,如果文件无法验证,则丢弃更新并显示错误。这意味着如果命令中断,重新运行读取批处理操作应该是安全的。如果您希望强制始终尝试批处理更新而不管文件的大小和日期如何,请使用 -I 选项(读取批处理时)。如果发生错误,目标树可能处于部分更新状态。在这种情况下,可以以常规(非批处理)操作模式使用 rsync 来修复目标树。

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

    读取批处理文件时,如果您未将某些选项的值设置为与批处理写入命令相同,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

答案2

您可以尝试使用齐奏。由于它保留了文件的缓存,因此构建文件列表的速度应该更快。

答案3

支持rsync --batch-mode多播。如果您的网络支持多播,则可能值得研究一下。

答案4

改变文件系统怎么样?

前段时间,我将一个多 TB 文件系统从 ext3 切换到 XFS。扫描目录(上次检查时约有 600,000 个文件)的时间从 15-17 分钟缩短到不到 30 秒!

相关内容