正確なコピーのための冗長な転送を避けるためのrsync

正確なコピーのための冗長な転送を避けるためのrsync

最初にローカル マシンで構築され、その後、宛先マシンに rsync されて起動されるマイクロサービスが 100 個以上あります。

すべてのマイクロサービスは共有 fat.jar ファイルを使用し、名前を変更して配布フォルダーに保存します。

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

これをサーバーに rsync すると、rsync はすべての jar ファイル (合わせて配布の 99% を占める) がまったく同じ fat.jar であることを認識しません。したがって、rsync がもっとスマートであれば、実際には 1 つの a.jar のみを転送し、それを他のすべてのファイルにコピーすることができます (それらのサイズとハッシュはまったく同じであるため)。

これは rsync で実行できますか、それとも別の解決策を探すべきでしょうか? 特にインターネット接続が悪い場合は、これによりデプロイメント速度が大幅に低下する可能性があります。

答え1

fat.jar各サーバー上の元の名前を変更しないでください。

別の名前でファイルにアクセスする必要がある場合は、そのファイルへのシンボリック リンクを作成します。

のためにserviceA

ln -s fat.jar a.jar

のためにserviceB

ln -s fat.jar b.jar

答え2

幾つかある重複排除これを行うツールがあります。インストールするとzバックアップは、おそらくシステム用のパッケージとして提供されており、ローカル マシンとリモート マシンでファイルの を入力する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/ は、a.jar を除くすべてを /somedir から /otherdir にコピーします。

関連情報