解決策 1:
RSync には 'write-device' および 'copy-device' パッチがありますが、小さいイメージ (1 ~ 2GB) でのみうまく機能します。 RSync は、より大きな画像で一致するブロックを探すのに何年も費やしますが、40GB 以上のデバイス/ファイルではほとんど役に立ちません。
以下を使用して 1MB ごとのチェックサム比較を実行し、一致しない場合はコンテンツを単純にコピーします。これを使用して、パブリック インターネットを介して、米国の仮想ホスト上のサーバーを英国のバックアップ システムにバックアップします。 CPU アクティビティはほとんどなく、スナップショットのパフォーマンス ヒットは数時間後にのみ発生します:
スナップショットを作成:
lvcreate -i 2 -L 25G /dev/vg_kvm/company-exchange -n company-exchange-snap1
export dev1='/dev/mapper/vg_kvm-company--exchange--snap1';
export dev2='/dev/mapper/vg_kvm-company--exchange';
export remote='[email protected]';
初期シード:
dd if=$dev1 bs=100M | gzip -c -9 | ssh -i /root/.ssh/rsync_rsa $remote "gzip -dc | dd of=$dev2"
毎晩の増分バックアップ (変更されたブロックのみを送信):
ssh -i /root/.ssh/rsync_rsa $remote "
perl -'MDigest::MD5 md5' -ne 'BEGIN{\$/=\1024};print md5(\$_)' $dev2 | lzop -c" |
lzop -dc | perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_);
read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 | lzop -c |
ssh -i /root/.ssh/rsync_rsa $remote "lzop -dc |
perl -ne 'BEGIN{\$/=\1} if (\$_ eq\"s\") {\$s++} else {if (\$s) {
seek STDOUT,\$s*1024,1; \$s=0}; read ARGV,\$buf,1024; print \$buf}' 1<> $dev2"
スナップショットを削除:
lvremove -f company-exchange-snap1
解決策 2:
標準の rsync にはこの機能がありませんが、rsync-patches tarball (copy-devices.diff) にパッチがあり、http://rsync.samba.org/ftp/rsync/After appling and recompile からダウンロードできます。 、 --copy-devices オプションでデバイスを再同期できます。
解決策 3:
特に LVM スナップショットでこれを行うことに興味がある人は、私の lvmsync ツールを気に入るかもしれません。このツールは、スナップショットで変更されたブロックのリストを読み取り、それらの変更のみを送信します。
解決策 4:
Zumastor Linux Storage Project を見てください。これは、ddsnap ツールを介してバイナリ「rsync」を使用して「スナップショット」バックアップを実装しています。
マンページから:
ddsnap は、複数の同時スナップショットを効率的に保持できるブロック レベルのスナップショット機能を使用して、ブロック デバイスのレプリケーションを提供します。 ddsnap は、2 つのスナップショット間で異なるスナップショット チャンクのリストを生成し、その違いをネットワーク経由で送信できます。ダウンストリーム サーバーで、更新されたデータをスナップショット ブロック デバイスに書き込みます。
解決策 5:
blocksync と呼ばれる python スクリプトがあります。これは、2 つのブロック デバイスを ssh 経由でネットワーク経由で同期し、変更のみを転送する簡単な方法です。
- blocksync.py をリモート ホストのホーム ディレクトリにコピーします
- リモート ユーザーが sudo できるか、自分自身が root であることを確認してください
- ローカル ユーザー (root?) がソース デバイスとリモート ホストへの ssh を読み取れることを確認してください
- 呼び出し:
python blocksync.py /dev/source [email protected] /dev/dest
最近ハッキングしてクリーンアップし、rsync (Adler-32) と同じ高速チェックサム アルゴリズムを使用するように変更しました。