rsync 以避免精确副本的冗余传输

rsync 以避免精确副本的冗余传输

我有超过 100 个微服务,它们首先构建在本地计算机上,然后同步到目标计算机并启动。

所有微服务都使用共享的 fat.jar 文件,将其重命名并存储在其分发文件夹中。

/serviceA
  /a.jar
/serviceB
  /b.jar
...

当我们将其 rsync 到服务器时,rsync 不会发现所有 jar 文件(总共占分布的 99%)都是完全相同的 fat.jar。因此,如果 rsync 更聪明,它实际上只能传输一个 a.jar,然后将其复制到所有其他文件(因为它们的大小和哈希值将完全相同)。

这可能与 rsync 有关吗?还是我应该寻找其他解决方案?这会显着降低部署速度,尤其是当我的互联网连接较差时!

答案1

不要fat.jar在每台服务器上重命名原始文件。

如果某些东西必须使用其他名称访问该文件,则创建该文件的符号链接。

为了serviceA

ln -s fat.jar a.jar

为了serviceB

ln -s fat.jar b.jar

答案2

有一些重复数据删除可以为您完成此操作的工具。如果你安装备份,它可能作为您的系统的软件包提供,在本地和远程计算机上,您可以向它提供tar您的文件,它会找到重复的部分,并且不会保留这些副本。

您根本不必通过重命名、硬链接或软链接来更改源。下面是一个示例脚本,它创建一个大文件并将其复制到 3 个目录 A、B、C。然后将目录(未压缩)打包为zbackup.我们比较结果的大小存储库,以及传统的压缩 tar 是什么。通常,在这个阶段,存储库现在将被复制到远程,并在远程解压,但脚本只是通过 tar 将其解压到一个新目录中,以便我们可以与原始目录进行比较。

ZB=/tmp/zrepo
cd /tmp/; mkdir try; cd try
dd count=5000 if=/dev/urandom of=file
for dir in A B C
do  mkdir $dir
    date >$dir/a
    cp file $dir/b$dir
done
ls -l /tmp/try/*/*
zbackup init --non-encrypted $ZB
tar cf - A B C  | zbackup backup --non-encrypted $ZB/backups/x
du -bs $ZB
tar czf - A B C | wc -c
cd /tmp; mkdir copy; cd copy
zbackup restore --non-encrypted $ZB/backups/x | tar xf -
ls -l /tmp/copy/*/*

这是一些输出。正如您所看到的,存储库仅占用 2632045 字节,而压缩后的 tar 则需要 7682010 字节,这表明大文件的 3 个副本已被删除为 1 个副本。

-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/try/A/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/try/A/bA
-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/try/B/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/try/B/bB
-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/try/C/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/try/C/bC

4       /tmp/zrepo/info
4       /tmp/zrepo/index/2e0ec29dfd5742005a477525009cfa3a6677f28cffaf2ae5
4       /tmp/zrepo/backups/x
2052    /tmp/zrepo/bundles/e0/e0a14717771602304b480202e05a4f796e8346b7033c231e
2052    /tmp/zrepo/bundles/e0
520     /tmp/zrepo/bundles/3c/3cf381e405fc278c4336ae331c5ea6a9d67b3147792567bc
520     /tmp/zrepo/bundles/3c

2632045 /tmp/zrepo # du -bs of repo

7682010            # size of tar z

-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/copy/A/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/copy/A/bA
-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/copy/B/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/copy/B/bB
-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/copy/C/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/copy/C/bC

答案3

是的,这是因为你重命名了文件,所以每次rsync都是不同的文件。 rsync 的目的不是查找​​重复项。它只是一个快速文件复制工具。如果您知道不会多次复制的文件,只需使用 rsync 过滤规则排除它们并以单独的方式处理它即可。

示例。 rsync -uva --filter "- a.jar" /somedir/ /otherdir/,将把 /somedir 中除 a.jar 之外的所有内容复制到 /otherdir

相关内容