rsyncに似たプログラムですが、共有キャッシュディレクトリまたはソースを使用していますか?

rsyncに似たプログラムですが、共有キャッシュディレクトリまたはソースを使用していますか?

rsyncを使用すると、ファイルまたはデータデルタ(差分)をソースとターゲットの間で直接比較できます。

ソース、ターゲット、および共有ローカル「キャッシュ」間のデルタを比較する代替プログラムはありますか?遠くにあるとsource 遅く、地域であればdestination高速ですlocal-shared-cache

たとえば、次のような状態があるとします。

source:
largeFile.txt
largeFile2.txt
largeFile3.txt

destination:
largeFile.txt

local-shared-cache:
largeFile3.txt

パスを無視してファイルに集中するだけですsourcedestinationlargeFile2.txt largeFile3.txt

しかしlargeFile3.txt、実際にはすでに存在しているので、local-shared-cache「incremental」sourceはからのみに変更されますlargeFile2.txt。このキャッシュを使用する実装は潜在的により遅いですsource


1つの方法は、トレントプロトコル(すべてのファイルがトレントになる)を使用することです。そのトレントがすでにローカルリポジトリに「存在する場合」をダウンロードする必要はありません。しかし、このソリューションを実装してテストする必要があります(これらのソフトウェアがすでに存在していることを願っています)。

別のオプションはZFSスナップショット同期でもあります。


私が実際に達成したいことは何ですか?

基本的に、私たちは大量のビッグデータを含む多くのソフトウェアプロジェクトを持っており、開発者はローカル開発のためにプロジェクトとすべてのデータを複製する必要があります。プロジェクトのサイズが10GBで、ダウンロードに20分かかります。これで、開発者が同様のプロジェクトを複製する必要がある場合は、2つのプロジェクト間の差分/差がその一部に過ぎなくても、10 GB / 20分の費用を費やす必要があります。

最初のrsyncを実行した後、その上でrsyncを実行できませんか?違いはありますか?

もちろん、プロジェクト1を最初にrsync / cloneしてから、それに基づいてプロジェクト2をrsync / cloneすることができますが、「基本」レプリカを見つける必要がある場合はすぐに混乱する可能性があります。また、2つのプロジェクトではなく、複数のプロジェクトに共通の資産が分散しているかどうかは考慮しません。たとえば、10個のプロジェクトがあり、それぞれに共通ファイルが含まれている場合はどうすればよいですか? 10個の要素をすべて順に並べて、すべての共通要素を「作る」でしょうか?複雑に見えますね。

前の例を続けて... 2番目のプロジェクトがあるとしましょう。largeFile.txt largeFile3.txt largeFile4.txt. largeFile5.txt

私は基本的にlargeFile4.txt. largeFile5.txt

したがって、このアプローチを使用すると、最初のrsyncを実行し、LargeFile2.txt、LargeFile3.txtをインポートし、2番目のプロジェクトで別のrsyncを実行してLargeFile4.txtとLargeFile5.txtを取得できます。しかし、その後、rsyncを使用して必要なすべてのファイルを順番に「構築」してから、不要なファイルをすべて削除する方法を調べる必要があります。処理とディスク処理がたくさん必要なようです。

ベストアンサー1

rsyncを使用すると、ファイルまたはデータデルタ(差分)をソースとターゲットの間で直接比較できます。

不要。ネットワーク接続で使用する場合にのみrsyncデルタを使用してください。ローカルファイルシステムの一部として見える2つのディレクトリ/ファイル間で使用している場合は、rsyncデルタを使用せずに古いファイルの完全なコピーを作成します。

# Will use deltas
rsync -a /path/to/source/  remoteHost:/path/to/destination

# Will copy changed files in their entirety
rsync -a /path/to/source/  /network/path/for/remoteHost/destination

したがって、デルタを使用すると仮定すると、ファイルの変更された部分のみが転送されるため、通常はキャッシュを使用する必要はありません。

ただし、最初にファイルを転送し、そのファイルのかなりの部分が他のファイルと似ていることがわかっている場合、および--fuzzy/--link-dest--copy-dest使用してrsync助けを受けることができます。

また、次のターゲットディレクトリにコピーすることもできますnewoldoldoldstuffnewnewstuff

rsync -av --copy-dest /full/path/to/oldstuff/ --fuzzy --fuzzy /path/to/file/new remoteHost:/path/to/newstuff/

--copy-destパスが相対パスの場合は、パスの宛先ディレクトリに相対的であることに注意してくださいremoteHost。通常、パスを--copy-dest絶対パス(たとえばで始まる/)に設定するか、"$PWD"リモートシステムのログインディレクトリに基づいて設定するのが最善です。

コマンドに2つの-vフラグを追加すると、このデバッグ出力が提供され、レプリケーションの基礎rsyncとして使用されることが確認されます。oldnew

rsync --dry-run -aivvv --copy-dest "$PWD"/t/dst/oldstuff/ --fuzzy --fuzzy t/src/new remoteHost:t/dst/newstuff/

opening connection using: ssh remotehost rsync --server -vvvnlyyogDtpre.iLsfxC "--log-format=%i" --copy-dest /home/roaima/t/dst/oldstuff/ . t/dst/newstuff/  (10 args)
sending incremental file list
[sender] make_file(new,*,0)
send_file_list done
send_files starting
server_recv(2) starting pid=11407
recv_file_name(new)
received 1 names
recv_file_list done
get_local_name count=1 t/dst/newstuff/
generator starting pid=11407
delta-transmission enabled
recv_generator(new,1)
[generator] make_file(/home/roaima/t/dst/oldstuff/old,*,1)
fuzzy basis selected for new: /home/roaima/t/dst/oldstuff/old
send_files(1, t/src/new)
<f+++++++++ new
generate_files phase=1
send_files phase=1
recv_files(1) starting
recv_files(new)
recv_files phase=1
generate_files phase=2
send_files phase=2
send files finished
total: matches=0  hash_hits=0  false_alarms=0 data=0
recv_files phase=2
recv_files finished
generate_files phase=3
generate_files finished

sent 65 bytes  received 515 bytes  386.67 bytes/sec
total size is 2,147,483,648  speedup is 3,702,558.01 (DRY RUN)
[sender] _exit_cleanup(code=0, file=main.c, line=1207): about to call exit(0) (DRY RUN)

おすすめ記事