提高rsync备份性能


8

假设一个系统将始终具有主副本,而另一个系统将始终具有最新副本(少于48小时),那么通过unix框之间的ssh镜像改善rsync的最佳技术是什么?

另外,要扩展这种方法以处理数十台机器来推动这些变化,该怎么做?

Answers:


6

如果:

  • 文件的修改时间正确
  • 文件不是很大
  • 不能错过任何推送(或存在某种积压处理)

您可以使用find -ctimefile -cnewer列出自上次执行以来已更改文件的列表,并仅复制已修改的文件(只需进行光荣的差异推送)。

这对于多个主机来说翻译得非常好:只需在源上执行差异tar,然后在所有主机上解压缩即可。

它给你这样的东西:

find -type f -cnewer /tmp/files_to_send.tar.gz > /tmp/files_to_send.txt
tar zcf /tmp/files_to_send.tar.gz --files-from /tmp/files_to_send.txt 
for HOST in host1 host2 host3 ...
do
    cat /tmp/files_to_send.tar.gz | ssh $HOST "tar xpf -"
done

脚本已经过完善,但是您明白了。


糟糕:猫的另一种无用用法:-)
史蒂夫·施耐普

实际上,这几乎可以像这样完成;假设对权力的将是确定与添加它来运行维持数据文件的脚本之后
萨尔

4

假设您正在同步的数据尚未压缩,那么打开压缩(-z)可能会有助于提高传输速度,但两端会消耗一些CPU。


压缩已经通过ssh在
萨尔

3
通过rsync进行压缩通常比在SSH隧道中进行压缩更有效。原因是rsync具有更多知识,并且可以利用它。例如,其压缩可以引用未传输文件的一部分。
德罗伯特

5
@derobert从SSH移动压缩近20%进行rsync改进的性能
SAL

2

如果您要传输包含许多更改的非常大的文件,请使用--inplace和--whole-file选项,我将它们用于2Gb VM映像,这很有用(主要是因为rsync协议没有做很多事情)通过这些文件传递增量数据)。我不建议在大多数情况下使用这些选项。

使用--stats查看使用rsync增量协议传输文件的情况。


2

另一种策略是使ssh和rsync更快。如果要通过受信任的网络(读为:私有),则无需加密实际有效负载。您可以使用HPN ssh。此版本的ssh仅加密身份验证。同样,rsync版本3在构建文件列表时开始传输文件。与rsync版本2相比,这当然可以节省大量时间。我不知道这是否是您要的内容,但希望对您有所帮助。另外,rsync确实以某种方式支持多播,尽管我不会假装理解如何。


几年前,当我使用处理器速度较慢的系统时,我对所有可用的OpenSSH压缩方法进行了基准测试,最早的“ arcfour”是最快的。这与在使用gig-e的情况下打开巨型帧相结合,可以显着提高传输速度。
Derek Pressnall 2012年

2

当您将rsync作为备份方法进行备份时,如果要备份的文件很多,将会遇到的最大问题是。Rsync可以毫无问题地处理大型文件,但是如果您要备份的文件数量太大,那么您会注意到rsync不会在合理的时间内完成。如果发生这种情况,您将需要将备份分解成较小的部分,然后遍历这些部分,例如

find /home -mindepth 1 -maxdepth 1 -print0 | xargs -0 -n 1 -I {} -- rsync -a -e ssh {} backup@mybackupserver:/backup/

或将文件集缩小以减少文件数量。

至于有数十台计算机反映这些更改的镜像,则取决于备份需要多新鲜。一种方法是将更改从主服务器镜像到备份服务器,然后让其他服务器通过初始备份服务器上的rsync守护程序将其更改从备份服务器中拉出,然后安排其他服务器稍稍拉动在不同的时间或使用脚本使用无密码的ssh连接到每台服务器,并告诉它们拉出新的备份副本,这将有助于防止最初的备份服务器不堪重负-但是您是否要花那么多麻烦将取决于您要备份多少台其他计算机。


您是否知道:/Backup/*.bak中的f的区别?做rsync -e ssh $ f backup @ mybackupserver; 完成并rsync -re ssh /Backup/*.bak backup @ mybackupserver吗?
Osama ALASSIRY,2009年

在我看来,区别仅在于第一个将对/ Backup /目录中的每个.bak文件运行rsync(假设* .bak只是匹配文件),而第二个将运行一个rsync将其全部传输。如果* .bak用于匹配目录,则第一个不会递归到子目录(假设您故意不使用-r)。通常,您将要执行第二个而不是第一个,直到您有太多文件无法很好地处理为止。
罗德尼·阿马托

1
请注意,使用for外观遍历目录或文件通常不是一个好主意。如果它命中目录或文件中带有空格的话,它会可怕地损坏。
弥敦道

@Nathan,这样的东西find /Backup/ -name '*.bak' -print0 | xargs -0 -n 1 rsync -e ssh吗?
hark

我已经更新了示例以使用xargs方法。我从来没有自己做这个,因为我从来没有在/ home下有目录,但在目录中有空格,但是我们应该在那里有最好的例子。
Rodney Amato

2

rsync有一种方法可以断开副本。换句话说,rsync可以(概念上)区分目录树并生成一个补丁文件,然后您可以将该补丁文件应用于与原始源相同的任意数量的文件。

它要求您调用与主服务器的rsync并使用进行镜像--write-batch;它产生一个文件。然后,您可以将此文件传输到任意数量的其他目标,然后使用将该批处理应用于每个目标--read-batch

如果您在与主服务器相同的机器上保留了上一个rsynced状态的本地副本(即当前镜像的副本),则可以在主服务器上生成此“补丁”而无需联系任何镜像:

在高手:

rsync --write-batch=my-batch.rsync /master/data /current/mirror

添加您想要的任何其他选项。这将做两件事:

  1. 它将做出/current/mirror改变以反映/master/data
  2. 它将创建一个二进制补丁文件(或批处理文件)my-batch.rsync供以后使用。

my-batch.rsync文件从主服务器传输到所有镜像,然后在镜像上应用补丁,可以这样说:

rsync --read-batch=my-batch.rsync /local/mirror

这种方法的好处:

  • 主人没有被淹
  • 无需协调/可以同时访问主/镜像
  • 具有不同特权的不同人员可以在母版和镜像上进行工作。
  • 无需使用TCP通道(ssh,netcat等;可以通过电子邮件发送该文件;-))
  • 脱机镜像可以稍后进行同步(只需将其联机并应用补丁)
  • 所有镜像都保证相同(因为它们应用了相同的“补丁”)
  • 所有镜像都可以同时更新(因为--read-batch镜像本身仅占用大量CPU / IO)
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.