異なるボリュームに2つの300 GBファイルがあります。
設計上、これらの2つのファイルのサイズは同じであり、コンテンツのmostly(> 90%)も同じです...
これらのファイルを「rsync」するための効率的なツールがあり、異なるセクションのみをコピーするので、ターゲットファイルはソースと同一になりますか?
おそらくブロックのチェックサムを構築してそれを把握するものかもしれませんが、私にはわかりません...(cp -f
...よりも効率的なものは、ソースファイル全体を取得して上書きすることもできます)
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
大きな一致と高速化により、高速同期が実現します。
https://bitbucket.org/ppershing/blocksync を使用することもできます(免責事項:私はこの特定のフォークの作成者です)。 rsyncに勝る利点は、ファイルを1回だけ読み取ることです(デルタ転送を開始する前にチェックサムを計算せずに2つのファイルが異なるとrsyncが確信できない限り、160GBのハードドライブを2回読み取ります)良い戦略ではありません)。注意点-現在のバージョンのblocksyncは、RTTの短い接続(localhost、LAN、ローカルWiFiなど)で良好に機能しますが、長距離での同期には特に役立ちません。