web-dev-qa-db-ja.com

ほぼ同一の2つの巨大なファイルを同期する

異なるボリュームに2つの300 GBファイルがあります。

  • 暗号化されたローカルバックアップ
  • NAS上の暗号化された「リモート」バックアップ。

設計上、これらの2つのファイルのサイズは同じであり、コンテンツのmostly(> 90%)も同じです...

これらのファイルを「rsync」するための効率的なツールがあり、異なるセクションのみをコピーするので、ターゲットファイルはソースと同一になりますか?

おそらくブロックのチェックサムを構築してそれを把握するものかもしれませんが、私にはわかりません...(cp -f...よりも効率的なものは、ソースファイル全体を取得して上書きすることもできます)

7
Frank Nocke

rsyncを使用してこれを行うことができます。

--no-whole-fileまたは--no-Wパラメーターは、ファイルレベルの同期ではなくブロックレベルの同期を使用します。


テストケース

/dev/randomおよび次のようにWebサイトから大量のテキストファイルを使用してランダムテキストファイルを生成しました。これらの4つのファイルは、すべてのコンテンツで異なります。 tf_2.datはターゲットファイルです。

~/logs/rs$ ls -tlh    
-rw-rw-r-- 1 vayu vayu 2.1G  二  25 23:11 tf_2.dat
-rw-rw-r-- 1 vayu vayu 978M  二  25 23:11 a.txt
-rw-rw-r-- 1 vayu vayu 556K  二  25 23:10 file2.txt
-rw-rw-r-- 1 vayu vayu 561K  二  25 23:09 nt.txt

次に、rsyncを使用してそれらを別のハードディスクにコピーしました(宛先は空です)。

rsync -r --stats rs/ /mnt/raid0/scratch/t2

次の統計が受信されました。

Number of files: 5 (reg: 4, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 4
Total file size: 3,260,939,140 bytes
Total transferred file size: 3,260,939,140 bytes
Literal data: 3,260,939,140 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 3,261,735,553
Total bytes received: 92

sent 3,261,735,553 bytes  received 92 bytes  501,805,483.85 bytes/sec
total size is 3,260,939,140  speedup is 1.00

次に、ファイルをマージして、約60%の古いデータを持つ新しいファイルを作成します。

cat file2.txt a.txt >> tf_2.dat

次に、2つのフォルダーを同期します今回は--no-Wオプションを使用します

rsync -r --no-W --stats rs/ /mnt/raid0/scratch/t2

Number of files: 5 (reg: 4, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 4
Total file size: 4,289,593,685 bytes
Total transferred file size: 4,289,593,685 bytes
Literal data: 1,025,553,047 bytes
Matched data: 3,264,040,638 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 1,026,127,265
Total bytes received: 611,604

sent 1,026,127,265 bytes  received 611,604 bytes  21,169,873.59 bytes/sec
total size is 4,289,593,685  speedup is 4.18

大きなデータが一致し、高速化されていることがわかります

次に、再試行します。今回は、変更が〜2%になるように、いくつかのシェルファイルをターゲット(tf_2.dat)にマージします。

cat *.sh >> rs/tf_2.dat

そして、rsyncを使用して再度同期します。

rsync -r --no-whole-file --stats rs/ /mnt/raid0/scratch/t2


Number of files: 5 (reg: 4, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 4
Total file size: 4,289,727,173 bytes
Total transferred file size: 4,289,727,173 bytes
Literal data: 178,839 bytes
Matched data: 4,289,548,334 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 541,845
Total bytes received: 690,392

sent 541,845 bytes  received 690,392 bytes  43,236.39 bytes/sec
total size is 4,289,727,173  speedup is 3,481.25

大きな一致と高速化により、高速同期が実現します。

11
ankit7540

https://bitbucket.org/ppershing/blocksync を使用することもできます(免責事項:私はこの特定のフォークの作成者です)。 rsyncに勝る利点は、ファイルを1回だけ読み取ることです(デルタ転送を開始する前にチェックサムを計算せずに2つのファイルが異なるとrsyncが確信できない限り、160GBのハードドライブを2回読み取ります)良い戦略ではありません)。注意点-現在のバージョンのblocksyncは、RTTの短い接続(localhost、LAN、ローカルWiFiなど)で良好に機能しますが、長距離での同期には特に役立ちません。

1
user3584196