rsync到使用同一文件列表的多个目的地?


22

我想知道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 

感谢您的光临!

Answers:


12

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

批处理模式

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

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

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

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

   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守护程序语法将数据推送到远程主机或从远程主机拉出数据。

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

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

    注意事项:

    read-batch选项期望要更新的目标树与用于创建批处理更新文件集的目标树相同。当目标树之间出现差异时,更新可能会被警告并丢弃(如果文件似乎已经是最新的),或者尝试进行文件更新,然后如果文件未能通过验证,该更新因错误而被丢弃。这意味着如果命令被中断,重新运行分批读取操作应该是安全的。如果您希望无论文件的大小和日期如何都强制执行批量更新,请使用-I选项(读取批处理时)。如果发生错误,则目标树可能处于部分更新的状态。在这种情况下,

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

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

    创建BATCH.sh文件的代码将所有filter / include / exclude选项转换为单个列表,该列表作为“此处”文档附加到外壳脚本文件中。如果需要更改--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

建议的命令不起作用:remote destination is not allowed with --read-batch
kynan

显示完整的命令。-“文件名”表示可以从标准输入中读取,并且foo在示例中还从本地文件中读取STDIN 。
Chloe

2
尽管我的用例早已蒸发到以太之中,但这似乎是我试图做的最大正确的解决方案。:D
杰西(Jessie)

4

您可以尝试使用统一。建立文件列表的速度应该快得多,因为它保留了文件的缓存。


2
注意:Unison不会保留文件的“缓存”。它仅保留文件名,时间戳记和校验和的数据库。它仍然对文件系统进行扫描,并创建校验和以与远程进行比较。Unison的唯一优势是双向同步。我推荐Unison,但这里无济于事。
Chloe

4

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


2

如何更改文件系统?

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


1

这不是一个直接的答案,但是如果使用rsync 3+版,它将在生成整个文件列表之前开始传输。

仍然不是很有效的另一种选择是将它们作为作业运行,因此有几个同时运行。

另外,如果您不介意使用tar,我只是想到了这种扼杀:

tar cf - . | tee >(ssh localhost 'cat > test1.tar') >(ssh localhost 'cat > test2.tar') >/dev/null

每个本地主机当然都是不同的服务器(假定基于密钥的登录)。以前从来没有使用过。


嗯!奇怪的是,cwrsync(rsync 3.0.7)似乎没有做到这一点。不过,我将不得不调查为什么会这样,因为这将有助于减少这些庞大的运行时。谢谢!
杰西

双方都有那个版本?
凯尔·布​​兰特

不,实际上;本地计算机是cwrsync 3.0.7,远程主机(嗯,我现在正在使用的主机)是Debian Lenny上的rsync 3.0.3。似乎这在版本上不会有太大的差异,以至于无法操作,但是我不知道。.我将考虑升级Debian。
杰西

1
多么奇怪的单线。但是,如果我没有利用rsync最多只改变了几百kb的情况,则rsync不需要通过几个慢速链接重新复制几笔数据的事实,那可能会起作用。另外,获得(cw)rsync 3.0.7的两端仍然可以建立文件列表并进行串行传输。不过,不要太担心。
杰西

不是“ tar cf-”。与“ tar c”相同。?
JohanBoulé15年

1

如何从host1,host2和host3运行rsync作业?或者,运行作业以复制到host1,然后在host2和host3上运行它以从host1获取它。


1

更好的解决方案是使用git创建存储库,然后推送到3个主机。更快,您不需要文件列表部分,它消耗的资源更少。

祝你好运,
JoãoMiguel Neves


10
git不会保留修改时间或权限(执行位除外),并且需要将数据的第二个副本存储为git对象,.git/尽管推送到原本已经拥有大部分数据的远程设备会更快。git不能替代rsync。
Dan D.

另外,除非您付费,否则git是公开可见的。
Chloe

8
@Chloe,您将git误认为GitHub。Git的本身是免费开源的分布式版本控制系统,任何人都可以通过任何手段,包括主机的Git仓库httpnfsafp。GitHub是一个网站,负责为您创建和维护git repos,并将其公开(除非您付费)。
toriningen 2014年

1
@Chloe GitHub是公开可见的,但是BitBucket提供了私有存储库。
sws

2
另外,Git不会跟踪空目录。
Flimm

1

我自己寻找此答案时,我认为您需要先使用rsync进行批处理,然后再将其发送给所有人,这将使文件列表只需要处理一次,然后您可以后台所有三个rsync使其并行运行。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.