
Ich habe über 100 Microservices, die zuerst auf einem lokalen Computer erstellt und dann später per rsync mit dem Zielcomputer gestartet werden.
Alle Microservices verwenden eine gemeinsame fat.jar-Datei, benennen sie um und speichern sie in ihrem Distributionsordner.
/serviceA
/a.jar
/serviceB
/b.jar
...
Wenn wir dies per Rsync mit dem Server synchronisieren, erkennt Rsync nicht, dass alle Jar-Dateien (die zusammen 99 % der Distribution ausmachen) genau die gleiche fat.jar sind. Wenn Rsync also intelligenter wäre, könnte es tatsächlich nur eine a.jar übertragen und diese dann für alle anderen kopieren (da Größe und Hash dieser Dateien genau gleich sind).
Ist dies mit rsync möglich oder sollte ich nach einer anderen Lösung suchen? Dies kann die Bereitstellungsgeschwindigkeit erheblich reduzieren, insbesondere wenn ich eine schlechte Internetverbindung habe!
Antwort1
Benennen Sie das Original nicht fat.jar
auf jedem Server um.
Wenn etwas unter einem anderen Namen auf die Datei zugreifen muss, dann erstellen Sie einen symbolischen Link auf die Datei.
Für serviceA
:
ln -s fat.jar a.jar
Für serviceB
:
ln -s fat.jar b.jar
Antwort2
Dort sind einigeDeduplizierungTools, die dies für Sie tun können. Wenn Sie installierenAbonnieren, das wahrscheinlich als Paket für Ihr System auf dem lokalen und dem Remote-Computer verfügbar ist, können Sie ihm einige tar
Ihrer Dateien zuführen. Es findet dann die Teile, die dupliziert sind, und behält diese Kopien nicht bei.
Sie müssen Ihre Quelle überhaupt nicht ändern, weder durch Umbenennen, Hardlinking noch Softlinking. Hier ist ein Beispielskript, das eine große Datei erstellt und sie in 3 Verzeichnisse A, B, C kopiert. Anschließend tarnt es die Verzeichnisse (unkomprimiert) in zbackup
. Wir vergleichen die Größe der resultierendenRepositoryund was ein herkömmliches komprimiertes Tar wäre. Normalerweise würde das Repository in diesem Stadium nun auf das Remote-Gerät kopiert und dort entpackt, aber das Skript entpackt es einfach per Tar in ein neues Verzeichnis, damit wir es mit dem Original vergleichen können.
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/*/*
Hier ist ein Teil der Ausgabe. Wie Sie sehen, benötigt das Repository nur 2632045 Bytes, verglichen mit einem komprimierten Tar von 7682010 Bytes. Dies zeigt, dass die 3 Kopien der großen Datei auf 1 Kopie dedupliziert wurden.
-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
Antwort3
ja, das liegt daran, dass Sie die Dateien umbenennen, sodass es für rsync jedes Mal eine andere Datei ist. rsync ist nicht dafür gedacht, Duplikate zu finden. Es ist nur ein schnelles Tool zum Kopieren von Dateien. Wenn Sie wissen, welche Dateien Sie nicht mehrmals kopieren werden, schließen Sie sie einfach mit einer rsync-Filterregel aus und behandeln Sie sie auf separate Weise.
Beispiel: rsync -uva --filter "- a.jar" /somedir/ /otherdir/ kopiert alles von /somedir nach /otherdir außer a.jar