有一种观念认为,很多在 IT 行业工作的人经常从 Internet howtos 复制和粘贴。 我们都这样做,复制和粘贴本身不是问题。 问题是当我们在不了解它们的情况下运行事物时。
几年前,我团队的一位朋友需要将虚拟机模板从站点 A 复制到站点 B。他们不明白为什么他们复制的文件在站点 A 是 10GB,但在站点 B 却变成了 100GB。
这位朋友认为 rsync 是一个神奇的工具,它应该只是“同步”文件原样。 然而,我们大多数人忘记的是了解 rsync 到底是什么,以及它是如何使用的,在我看来,最重要的是它来自哪里。 本文提供了有关 rsync 的更多信息,并解释了该故事中发生的事情。
关于 rsync
rsync 是由 Andrew Tridgell 和 Paul Mackerras 出于以下问题而创建的工具:
假设您有两个文件,file_A 和 file_B。 您希望将 file_B 更新为与 file_A 相同。 显而易见的方法是将file_A 复制到file_B 上。
现在假设这两个文件位于通过慢速通信链路连接的两个不同服务器上,因为 example,一个拨号IP链接。 如果 file_A 很大,将其复制到 file_B 会很慢,有时甚至不可能。 为了提高效率,您可以在发送之前压缩 file_A,但这通常只会增加 2 到 4 倍。
现在假设 file_A 和 file_B 非常相似,为了加快速度,您可以利用这种相似性。 一种常见的方法是仅将 file_A 和 file_B 之间的差异发送到链接中,然后使用此类差异列表在远程端重建文件。
问题在于,在两个文件之间创建一组差异的常规方法依赖于能够读取这两个文件。 因此,他们要求在链接的一端预先提供两个文件。 如果它们不能在同一台机器上使用,则不能使用这些算法。 (一旦你复制了文件,你就不需要这些差异了)。 这是 rsync 解决的问题。
rsync 算法有效地计算源文件的哪些部分与现有目标文件的部分匹配。 匹配的部分则不需要通过链接发送; 所需要的只是对目标文件部分的引用。 只有不匹配的部分源文件需要发送过来。
然后,接收者可以使用对现有目标文件的部分和原始材料的引用来构建源文件的副本。
此外,可以使用一系列常见压缩算法中的任何一种来压缩发送到接收器的数据,以进一步提高速度。
rsync 算法以一种我们都知道的可爱方式解决了这个问题。
在介绍完 rsync 之后,回到正题!
问题 1:精简配置
有两件事可以帮助这位朋友了解发生了什么。
文件在其他大小上显着变大的问题是由于在源系统上启用了精简配置 (TP) – 一种优化存储区域网络 (SAN) 或网络附加存储 (NAS) 中可用空间效率的方法.
由于启用了 TP,源文件只有 10GB,当使用 rsync 传输而无需任何额外配置时,目标目的地正在接收完整的 100GB 大小。 rsync 无法自动发挥作用,必须对其进行配置。
完成这项工作的标志是 -S 或 –sparse,它告诉 rsync 有效地处理稀疏文件。 它会做它所说的! 它只会发送稀疏数据,因此源和目标将有一个 10GB 的文件。
问题 2:更新文件
发送更新文件时出现第二个问题。 目标现在只接收 10GB,但始终传输整个文件(包含虚拟磁盘)。 即使在该虚拟磁盘上更改了单个配置文件。 换句话说,只有文件的一小部分发生了变化。
用于此传输的命令是:
rsync -avS vmdk_file syncuser@host1:/destination
同样,了解 rsync 的工作原理也有助于解决这个问题。
以上是对rsync最大的误解。 我们中的许多人认为 rsync 只会发送文件的增量更新,并且它只会自动更新需要更新的内容。 但这不是 rsync 的默认行为。
正如手册页所说,rsync 的默认行为是在目标中创建文件的新副本,并在传输完成后将其移动到正确的位置。
要更改 rsync 的默认行为,您必须设置以下标志,然后 rsync 将仅发送增量:
--inplace update destination files in-place --partial keep partially transferred files --append append data onto shorter files --progress show progress during transfer
因此,可以完全按照朋友的要求执行的完整命令是:
rsync -av --partial --inplace --append --progress vmdk_file syncuser@host1:/destination
请注意,必须删除稀疏标志 -S 有两个原因。 第一个是通过网络发送文件时不能同时使用-sparse 和-inplace。 其次,当您曾经使用–sparse 发送文件时,您无法再使用–inplace 进行更新。 请注意,早于 3.1.3 的 rsync 版本将拒绝 –sparse 和 –inplace 的组合。
因此,即使朋友最终通过网络复制了 100GB,也只需要发生一次。 以下所有更新都只是复制差异,使复制效率极高。