私は2台の異なるコンピュータで使用される大容量ファイル(2〜3GB、バイナリ、文書化されていない形式)を持っています(通常はデスクトップシステムで使用されますが、旅行中はラップトップの上に置きます)。 rsync を使用してファイルを前後に転送します。
私は時々このファイルを少しずつ更新しますが、変更された量は100kB未満です。これは両方のシステムで発生します。
私が理解したのは、rsyncの問題は、ソースとターゲットの間でファイルが変更されたと思われる場合はファイル全体を転送することです。私の場合、ファイルの小さな部分が変わると、時間の無駄のように感じました。私はソースとターゲットの転送エージェントが最初にファイル全体をチェックサムし、結果を比較するプロトコルを想定します。彼らはファイル全体のチェックサムが異なることに気づき、ファイルをAとBの2つの部分に分割し、別々にチェックサムを計算しました。
ああ、Bは両方のコンピュータで同じです。その半分は無視しましょう。ここで、AをA1とA2に分割します。ところでA2だけ変わりました。 A2をA2IとA2IIに分割して比較などを行います。たとえば、ソースとターゲットが3つの異なるセクション(それぞれ1 MB)を見つけるまでこの操作を繰り返し実行し、そのセクションのみを転送してターゲットファイルの正しい場所に挿入します。今日の高速SSDとマルチコアCPUを使用すると、これらの並列化は非常に効率的です。
だから私の質問は、今日このように動作する(または想像することはできませんが、同様の結果を提供する他の方法で)使用できるツールはありますか?
説明要求が発行されました。私は主にMacを使用しているので、ファイルシステムはHFS +です。通常、私はこのようにrsyncを起動します。
rsync -av --delete --progress --stats
- この場合、SSHを使用する場合もあり、rsyncdを使用する場合もあります。 rsyncdを使用するときは、次のように起動しますrsync --daemon --verbose --no-detach
。
2番目の説明:小さな変更がある両方の場所に存在するファイルのデルタのみを送信するか、rsyncが実際にこの機能を提供するツールを要求します。 rsyncの私の経験は、ファイル全体を転送することです(しかし、これを説明する答えは次のとおりです。rsyncは、デルタのみを転送するためにrsyncサーバーが必要です。そうしないと(ssh-shellを使用するなど)、ファイル全体を送信しますが、多くの場合変更されました)。
答え1
Rsyncはデルタを使用しませんが、単一のプロセスとしてソースファイルとターゲットファイルを担当する場合は、ファイル全体が転送されます。ソースコンピュータとターゲットコンピュータで別々のクライアントプロセスとサーバープロセスが実行されている場合は、デルタを転送できます。
rsyncが唯一のプロセスでデルタを送信しないのは、デルタを送信するかどうかを決定するためにソースファイルとターゲットファイルを読み取る必要があるためです。完了したら、ファイルを直接コピーできます。
このコマンド形式を使用する場合、rsyncプロセスは1つだけです。
rsync /path/to/local/file /network/path/to/remote/file
このコマンド形式を使用すると、2つのrsyncプロセス(ローカルホストとリモートホストに1つずつ)があり、増分を使用できます。
rsync /path/to/local/file remote_host:/path/to/remote/file
答え2
説明セクションでman rsync
:
Rsyncは、高速でさまざまなファイルコピーツールです。リモートシェルを介して別のホストに/からローカルにコピーしたり、リモートrsyncデーモンに/からコピーしたりできます。これは、動作のさまざまな側面を制御するための多くのオプションを提供し、コピーするファイルセットを指定する際の優れた柔軟性を可能にします。 元のファイルと宛先にある既存のファイルの差だけを転送してネットワークに転送されるデータ量を減らす増分転送アルゴリズムとして知られています。
だからそれは「いいえ」です。
答え3
これを最適化するには、RAID-1(ミラー)を使用できます。両方が変わっておかしいこともありますが、rsync
使い方もおかしいですね。この問題を処理する方法を説明する必要があります。
dd if=/dev/zero of=/path/to/syncfile.img bs=1M count=3500
近い将来、同期ファイルが増加するサイズよりわずかに大きいファイルを作成することができます()。- 次に、ファイルの上部にループデバイス()を配置します
losetup /dev/loop5 /path/to/syncfile.img
。 - 両方のシステムでこれを行います。
- 変更を他のシステムと同期させる必要があるシステムでは、
nbd
ネットワークブロックデバイス()を介して他のシステムのブロックデバイスを使用できるように設定できます。 - 2 つのブロックデバイスに RAID-1 アレイを作成します。
mdadm create /dev/md5 --raid-devices=2 --level=raid1 --bitmap=/path/to/ext3volume/sync-bitmap --assume-clean /dev/loop5 --write-mostly /dev/path/to/nbd
。--bitmap=/path/to/ext3volume/sync-bitmap
後でアレイを組み立てるときに必要です。 - RAIDにファイルシステムを作成
mke2fs -j /dev/md5
し、どこかにマウントします。 - ファイルをボリュームにコピーします。これはインターネット接続が良好な状態で行われるべきです。おそらく、ファイルの内容をブロックデバイスに直接書き込むよりスマートな方法があるかもしれませんが、これはローカルで行うことができますが、ファイルの内容がファイルシステムのメタデータと混在しているので、どうすればいいのかわかりません。
これで、ネットワークブロックデバイスの接続を切断できます。これにより、両方ともRAID-1のパフォーマンスが低下します。同期するには、次のことが必要です。 1. 同期システムで RAID をマウント解除して固定します。 2. nbdをリセットします。 3. 同期ソースシステムの RAID に nbd をホット追加します。
これにより、2つのブロックデバイスが同期されます。しかし、ビットマップのおかげで、ソースシステムは、相手から読み取らずにどのデータを転送する必要があるかを知ることができます。
質問
握っている。これですべてを書き留めたので、これが両方の変更(他の領域)には適用されないことに気づきました(大丈夫です)。--build
代わりに使用することができます--create
(これにより、ローカルブロックデバイスが両方のホストのマスターであるかのように偽装することができます)。
双方向の変更を処理する方法に応じて、ビットマップファイルをバックアップし(両方のRAIDが停止している間)、双方向にのみ同期を実行できます。または(変更を一方向にのみ記録したい場合)、または悪い場合は、同期を実行してRAIDを停止し、ローカルビットマップをリモートビットマップに置き換えてから再同期します(その後、ビットマップファイルを同期します)。確かに面白いでしょう。
LVMスナップショット
LVMスナップショットは同様の操作を実行できます。