
我有超過 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 將其解壓縮到一個新目錄中,以便我們可以與原始目錄進行比較。
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