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

我想知道是否有可能的rsync复制一个目录到多个远程目的地,一口气,甚至并行。 (没有必要,但会有用。)

通常情况下,像下面的东西会工作得很好:

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

如果这是唯一的select,我会使用它。 然而,/ junk位于一个缓慢的驱动器上,有很多文件,每次重build约12,000个文件的文件列表比实际的传输/更新要慢得多(〜5分钟)。 是否有可能做这样的事情来完成同样的事情:

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

感谢您的期待!

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

批处理模式

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

生成batch file一次保存,在更新多个目标树时不止一次执行文件状态,校验和和数据块生成。 可以使用多播传输协议将批量更新文件并行传输到多个主机,而不是分别向每个主机发送相同的数据。

要将logging的更改应用到其他目标树,请使用read-batch选项运行rsync,指定相同batch file的名称和目标树。 Rsync使用存储在batch file中的信息更新目标树。

为了方便起见,当使用write-batch选项时,也会创build一个脚本文件:它将被命名为追加了“.sh”的batch file。 此脚本文件包含适用于使用关联的batch file更新目标树的命令行。 可以使用Bourne(或类似Bourne的)shell来执行,可以select传递一个替代的目标树path名,然后使用它替代原来的目标path。 这在当前主机上的目标树path与用于创buildbatch file的path不同时非常有用。

  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用来更新/ adest / dir / from / source / dir /,重复这个操作的信息存储在“foo”和“foo.sh”中。 然后主机“远程”更新,批量数据进入目录/ bdest / dir。 这两个例子之间的差异揭示了你在处理批次方面的一些灵活性:

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

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

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

    注意事项:

    read-batch选项期望它正在更新的目标树与用于创build批量更新文件集的目标树相同。 当遇到目标树之间的差异时,更新可能会被丢弃,并发出警告(如果文件看起来已经是最新的)或者可能会尝试文件更新,如果文件无法validation,更新丢弃了一个错误。 这意味着,如果命令被中断,重新运行读取 – 批量操作应该是安全的。 如果您希望强制批处理更新始终尝试,而不pipe文件的大小和date如何,请使用-I选项(读取批处理时)。 如果发生错误,目标树可能会处于部分更新状态。 在这种情况下,可以使用rsync的常规(非批处理)操作模式修复目标树。

    在所有目标上使用的rsync版本必须至less与用于生成batch file的rsync版本一样新。 如果batch file中的协议版本对批处理读取rsync来说太新了,Rsync将会因为错误而死亡。 另请参阅–protocol选项,让创buildrsync生成一个较老的rsync可以理解的batch file。 (请注意,batch file在2.6.3版本中更改了原始格式,因此,混合使用较旧版本的版本将不起作用。)

    当读取一个batch file时,rsync会强制某些选项的值与batch file中的数据相匹配,如果你没有将它们设置为batch-writing命令相同的话。 其他选项可以(也应该)改变。 例如,写入 – 批量更改为–read-batch, – files-from被删除,除非指定了–delete选项之一,否则不需要–filter / – include / – exclude选项。

    创buildBATCH.sh文件的代码将任何filter/包含/排除选项转换为单个列表,作为“here”文档附加到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 

你可以尝试使用统一 。 build立文件列表应该快得多,因为它保留了文件的caching。

rsync --batch-mode支持多播。 如果在您的networking上可以这样做,那么可能值得考虑一下。

如何改变文件系统?

前一段时间,我从ext3转换了一个多TB的FS到XFS。 扫描目录的时间(最后一次检查时,大约有60万个文件)从15-17分钟到不到30秒!

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

另一个select,仍然不是很有效率,将运行它们作为工作,所以有几个在同一时间运行。

另外,如果你不介意使用tar,我只是想到了这个问题:

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

每个本地主机当然会是不同的服务器(假设基于密钥的login)。 以前从未使用过以上。

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

更好的解决scheme是使用git创build一个仓库,然后推送给3台主机。 更快,你不需要文件列表部分,它消耗更less的资源。

祝你好运,
JoãoMiguel Neves

在自己寻找这个答案的时候,我想你需要首先使用rsync进行批量处理,然后将其发送给他们,这将使得文件列表只需要一次就可以完成,然后你就可以背景所有三个rsyncs并行运行它们。

另一个可能的解决scheme是运行尽可能多的rsync进程与你有主机,即叉。