我有超过 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