sal Asked: 2009-05-05 06:46:30 +0800 CST2009-05-05 06:46:30 +0800 CST 2009-05-05 06:46:30 +0800 CST 提高 rsync 备份性能 772 假设一个系统总是有主副本,另一个系统总是有一个最近的副本(少于 48 小时) 此外,要扩展这种方法以处理数十台机器来推动这些变化,还需要做些什么呢? backup unix rsync mirror 6 个回答 Voted Best Answer Steve Schnepp 2009-05-05T07:01:24+08:002009-05-05T07:01:24+08:00 如果 : 您的文件的修改时间是正确的 文件不是很大 不能错过任何推送(或者有某种积压处理) 您可以使用find -ctime或file -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 剧本已经精炼,但你明白了。 pjz 2009-05-05T06:50:20+08:002009-05-05T06:50:20+08:00 假设您正在重新同步的数据尚未压缩,打开压缩 (-z) 可能会有助于传输速度,但代价是两端都需要一些 CPU。 mogsie 2012-06-01T15:18:27+08:002012-06-01T15:18:27+08:00 rsync 有一种方法可以进行断开连接的副本。换句话说,rsync 可以(在概念上)区分目录树并生成一个补丁文件,然后您可以将其应用于与原始源相同的任意数量的文件。 它要求您使用 master 调用 rsync 并使用--write-batch;进行镜像。它产生一个文件。然后将此文件传输到任意数量的其他目标,然后使用--read-batch. 如果您在与主服务器相同的机器上保留上次 rsynced 状态的本地副本(即镜像现在看起来的副本),您可以在主服务器上生成此“补丁”,甚至无需联系任何镜像: 在主上: rsync --write-batch=my-batch.rsync /master/data /current/mirror 添加您想要的任何其他选项。这将做两件事: 它会做出/current/mirror改变来反映/master/data 它将创建一个二进制补丁文件(或批处理文件)my-batch.rsync供以后使用。 将my-batch.rsync文件从主服务器传输到所有镜像,然后在镜像上,应用补丁可以这么说: rsync --read-batch=my-batch.rsync /local/mirror 这种方法的好处: 主人没有被淹没 无需同时协调/访问主/镜像 具有不同权限的不同人可以在 master 和 mirror(s) 上执行工作。 无需 TCP 通道(ssh、netcat 等;文件可以通过电子邮件发送;-)) 离线镜像可以稍后同步(只需将它们上线并应用补丁) 所有镜像都保证是相同的(因为它们应用了相同的“补丁”) 所有镜像都可以同时更新(因为--read-batch镜像本身只有 cpu/io 密集型) Rodney Amato 2009-05-06T01:33:22+08:002009-05-06T01:33:22+08:00 当您将 rsyncing 作为备份方法时,您将遇到的最大问题是如果您有很多要备份的文件。Rsync 可以毫无问题地处理大文件,但是如果您要备份的文件数量太大,那么您会注意到 rsync 不会在合理的时间内完成。如果发生这种情况,您将需要将备份分解为更小的部分,然后循环这些部分,例如 find /home -mindepth 1 -maxdepth 1 -print0 | xargs -0 -n 1 -I {} -- rsync -a -e ssh {} backup@mybackupserver:/backup/ 或压缩文件集以减少文件数量。 至于让数十台机器获得这些更改的镜像,这取决于备份需要多新鲜。一种方法是将更改从主服务器镜像到备份服务器,然后让其他服务器通过初始备份服务器上的 rsync 守护程序将其更改从备份服务器中拉出,然后调度其他服务器以稍微拉取不同时间或通过脚本使用无密码 ssh 连接到每台服务器并告诉他们提取备份的新副本,这将有助于防止您的初始备份服务器不堪重负 - 但您是否会遇到那么多麻烦将取决于关于您有多少其他机器提取备份副本。 gbjbaanb 2009-06-02T08:48:52+08:002009-06-02T08:48:52+08:00 如果您要传输具有大量更改的非常大的文件,请使用 --inplace 和 --whole-file 选项,我将它们用于我的 2Gb VM 映像,它有很大帮助(主要是因为 rsync 协议没有做太多通过这些文件传递增量数据)。我不建议在大多数情况下使用这些选项。 使用 --stats 查看使用 rsync 增量协议传输文件的情况。 Jackalheart 2009-06-02T09:00:31+08:002009-06-02T09:00:31+08:00 另一种策略是使 ssh 和 rsync 更快。如果您正在通过受信任的网络(阅读:私有),则不需要加密实际的有效负载。您可以使用HPN ssh。此版本的 ssh 仅加密身份验证。此外,rsync 版本 3 在构建文件列表时开始传输文件。这当然比 rsync 版本 2 节省了大量时间。我不知道这是否是您想要的,但我希望它有所帮助。此外,rsync 确实以某种方式支持多播,但我不会假装理解如何。
如果 :
您可以使用
find -ctime
或file -cnewer
列出自上次执行以来更改的文件,并仅复制修改后的文件(只是一个美化的差异推送)。这对于多个主机来说非常好:只需在源上执行差异 tar,然后在所有主机上解压缩它。
它给了你类似的东西:
剧本已经精炼,但你明白了。
假设您正在重新同步的数据尚未压缩,打开压缩 (-z) 可能会有助于传输速度,但代价是两端都需要一些 CPU。
rsync 有一种方法可以进行断开连接的副本。换句话说,rsync 可以(在概念上)区分目录树并生成一个补丁文件,然后您可以将其应用于与原始源相同的任意数量的文件。
它要求您使用 master 调用 rsync 并使用
--write-batch
;进行镜像。它产生一个文件。然后将此文件传输到任意数量的其他目标,然后使用--read-batch
.如果您在与主服务器相同的机器上保留上次 rsynced 状态的本地副本(即镜像现在看起来的副本),您可以在主服务器上生成此“补丁”,甚至无需联系任何镜像:
在主上:
添加您想要的任何其他选项。这将做两件事:
/current/mirror
改变来反映/master/data
my-batch.rsync
供以后使用。将
my-batch.rsync
文件从主服务器传输到所有镜像,然后在镜像上,应用补丁可以这么说:这种方法的好处:
--read-batch
镜像本身只有 cpu/io 密集型)当您将 rsyncing 作为备份方法时,您将遇到的最大问题是如果您有很多要备份的文件。Rsync 可以毫无问题地处理大文件,但是如果您要备份的文件数量太大,那么您会注意到 rsync 不会在合理的时间内完成。如果发生这种情况,您将需要将备份分解为更小的部分,然后循环这些部分,例如
或压缩文件集以减少文件数量。
至于让数十台机器获得这些更改的镜像,这取决于备份需要多新鲜。一种方法是将更改从主服务器镜像到备份服务器,然后让其他服务器通过初始备份服务器上的 rsync 守护程序将其更改从备份服务器中拉出,然后调度其他服务器以稍微拉取不同时间或通过脚本使用无密码 ssh 连接到每台服务器并告诉他们提取备份的新副本,这将有助于防止您的初始备份服务器不堪重负 - 但您是否会遇到那么多麻烦将取决于关于您有多少其他机器提取备份副本。
如果您要传输具有大量更改的非常大的文件,请使用 --inplace 和 --whole-file 选项,我将它们用于我的 2Gb VM 映像,它有很大帮助(主要是因为 rsync 协议没有做太多通过这些文件传递增量数据)。我不建议在大多数情况下使用这些选项。
使用 --stats 查看使用 rsync 增量协议传输文件的情况。
另一种策略是使 ssh 和 rsync 更快。如果您正在通过受信任的网络(阅读:私有),则不需要加密实际的有效负载。您可以使用HPN ssh。此版本的 ssh 仅加密身份验证。此外,rsync 版本 3 在构建文件列表时开始传输文件。这当然比 rsync 版本 2 节省了大量时间。我不知道这是否是您想要的,但我希望它有所帮助。此外,rsync 确实以某种方式支持多播,但我不会假装理解如何。