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

Есть некоторыедедупликацияинструменты, которые могут сделать это для вас. Если вы установитеzbackup, который, вероятно, доступен в виде пакета для вашей системы, на локальной и удаленной машинах, вы можете скормить ему часть tarваших файлов, и он найдет части, которые дублируются, и не будет сохранять эти копии.

Вам вообще не нужно менять свой источник, переименовывая, жестко связывая или мягко связывая. Вот пример скрипта, который создает большой файл и копирует его в 3 каталога A, B, C. Затем он tar-архивирует каталоги (несжатые) в 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 в /otherdir, кроме a.jar

Связанный контент