假设一个系统始终拥有主副本,而另一个系统始终拥有最新副本(少于 48 小时),那么改进 unix 机器之间通过 ssh 镜像进行 rsync 的最佳技术是什么?
此外,要如何扩展这种方法来处理数十台机器受到这些变化的影响?
答案1
如果 :
- 您的文件的修改时间正确
- 文件不是很大
- 不能错过任何推送(否则会有某种积压处理)
您可以使用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
脚本还有待完善,但你已经明白我的意思了。
答案2
假设您正在 rsyncing 的数据尚未压缩,打开压缩(-z)可能会有助于提高传输速度,但会以两端的一些 CPU 为代价。
答案3
rsync 有办法断开连接副本。换句话说,rsync 可以(概念上)差异目录树并生成修补然后你就可以申请在与原始源相同的任意数量的文件上。
它要求您使用 调用 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
这种方法的好处:
- 主人没有忙不过来
- 无需同时协调/访问主服务器/镜像服务器
- 具有不同权限的不同人员可以在主服务器和镜像服务器上进行工作。
- 不需要 TCP 通道(ssh、netcat 等等;文件可以通过电子邮件发送 ;-) )
- 离线镜像可以稍后同步(只需将它们联机并应用补丁即可)
- 保证所有镜像完全相同(因为它们应用了相同的“补丁”)
- 所有镜像都可以同时更新(因为
--read-batch
镜像本身只占用大量 CPU/IO)
答案4
另一个策略是让 ssh 和 rsync 更快。如果你正在通过受信任的网络(即私有网络)进行传输,则无需加密实际有效负载。你可以使用远程控制协议。此版本的 ssh 仅加密身份验证。此外,rsync 版本 3 在构建文件列表时开始传输文件。这当然比 rsync 版本 2 节省了大量时间。我不知道这是否是您想要的,但我希望它能有所帮助。此外,rsync 确实以某种方式支持多播,尽管我不会假装了解如何支持。