如何在 Linux 上为许多用户启用增量文件同步
假设您作为软件开发人员出于测试目的设置了软件的日常构建。每天创建一个新版本,用户都必须重新下载更新的版本来对其进行评估。在这种情况下,您可能希望启用差异下载,以便用户只能下载两个版本之间的差异,从而节省服务器的带宽。用户也会很高兴,因为他们不必等待重新下载整个内容。当您想要设置允许用户增量同步的下载存档时,也会遇到类似的情况。
在这些情况下,如何为多个用户有效地分发增量更新的文件?事实上,有一些内置“增量同步”功能的开源存储解决方案,例如 ownCloud 或 Syncthing。这些具有内置 GUI 的成熟解决方案要求用户安装专用客户端,因此对于您正在寻找的简单文件分发来说可能有点过分了。
除非使用像这样的成熟的第三方软件,否则可能会想到 rsync,它可以进行带宽高效的文件同步。然而,rsync 的问题是所有繁重的计算都是在服务器端完成的。也就是说,当客户端请求文件同步时,服务器需要执行逐块校验和计算并搜索客户端上不可用的块。显然,如果服务器需要处理许多用户,则此过程会对服务器的资源造成很大的压力,因此不可扩展。
什么是 Zsync?
这时,名为 zsync
的命令行工具就派上用场了。虽然 zsync 使用与 rsync 相同的基于增量编码的同步算法,但它将繁重的计算从服务器转移到客户端。我这么说是什么意思?
那么,在 zsync 中,服务器为要分发的文件维护一个单独的 .zsync 元数据文件,其中包含文件各个块的“预先计算”校验和列表。当zsync客户端请求文件同步时,客户端首先下载.zsync元数据文件,并执行逐块校验和计算以自行查找丢失的块。然后,客户端使用 HTTP 范围请求来请求丢失的块。正如您所看到的,服务器完全脱离了同步算法的循环,只是通过 HTTP 提供请求的文件块,这使得它在许多用户需要增量文件同步时成为理想选择。
以下是 rsync
和 zsync
之间服务器端开销差异的快速概述。在下图中,当 200 个用户下载 tarball 文件时,我比较了 rsync
和 zsync
的服务器 CPU 使用情况,与之前版本的差异为 2.5%。为了公平比较,rsync
不使用 SSH。

使用zsync
,由于所有校验和计算开销已从服务器转移到各个客户端,因此服务器开销显着降低。一个巧妙的小创意让 zsync
成为真正的赢家!
在本教程的其余部分中,我将展示如何在 Linux 环境下使用 zsync 增量分发文件。
zsync
:客户端设置
在客户端,您需要安装 zsync
以启动从远程 Web 服务器的文件传输。 zsync
非常轻量级,并且包含在大多数 Linux 发行版中。以下是如何在各种发行版上安装 zsync
。
对于 Debian、Ubuntu 或 Linux Mint:
$ sudo apt-get install zsync
对于费多拉:
$ sudo yum install zsync
对于 CentOS 或 RHEL:
首先,启用 Repoforge 存储库,然后运行:
$ sudo yum install zsync
对于 Arch Linux:
$ sudo pacman -S zsync
zsync
:服务器端设置
在服务器端,您几乎只需要一个支持 HTTP/1.1 的 Web 服务器。任何商品网络服务器都可以。对于要使用 zsync
分发的每个文件,您需要准备一个 .zsync
元数据文件。
您可以使用 zsync
包附带的 zsyncmake
命令行工具创建 .zsync
文件。以下是创建 .zsync
元数据文件的步骤。在安装了 zsync
的任何 Linux 计算机上执行以下步骤。
假设您要分发已使用 gzip
压缩的文件 custom.tar.gz
。
首先,解压缩 custom.tar.gz
。如果文件未压缩,则可以跳过此步骤。
$ gunzip custom.tar.gz
接下来,使用 zsyncmake
和 -z
选项压缩文件。
$ zsyncmake -z custom.tar
它将以 gzip
格式 (custom.tar.gz
) 压缩输入文件,并创建相应的 .zsync
元数据文件 (custom.tar.zsync
)。

我们使用 zsyncmake
而不是使用 gzip
来压缩它的原因是 zsyncmake
压缩使得压缩文件可以增量更新。
最后,将 custom.tar.gz
和 custom.tar.zsync
上传到运行 Web 服务器的主机。确保将两个文件上传到同一目录。
使用 Zsync 增量下载文件
一旦服务器和客户端都准备就绪,您就可以继续在客户端上运行 zsync
,如下所示。
$ zsync http://192.168.1.239/custom.tar.zsync
请注意,您应该指向 .zsync
元数据文件的 URL,而不是要下载的 tarball。
第一次下载将从服务器获取整个 tarball。

随着时间的推移,如果远程 tarball 更新,您可以使用相同的命令重新下载更新的文件。 zsync
会自动检测变化,并执行增量下载。

显然,您需要在先前下载的 tarball 所在的同一目录中重新运行 zsync
。旧的 tarball 将被重命名(使用 .zs-old
扩展名),并且新的 tarball 将在当前目录中构建。
如果之前下载的 tarball 在其他地方,您可以使用 -i
选项显式指定位置。
$ zsync -i /backup/custom.tar http://192.168.1.239/custom.tar.zsync
结论
在本教程中,我将展示如何使用 zsync
增量下载远程文件,同时给服务器带来很少的开销。有些地方已经使用了 zsync
(例如 Ubuntu 每日 ISO 映像或 Debian live ISO 映像)。现在您知道看到 .zsync
文件时该怎么做。