web-dev-qa-db-ja.com

LVMスナップショットをバックアップサーバーに同期する

いくつかのLinuxサーバーで実行されているいくつかのXen仮想マシンがあります。これらのVMは、/ dev/xenVG/SERVER001OSなどの行に沿ってデバイス名とともにLinux LVMボリュームにディスクイメージを保存します。必要に応じてVMを復元できるように、これらのディスクイメージの定期的なバックアップを取りたいと思います(LVMデバイスは、2台の物理マシン間でDRBDを使用して既にミラーリングされています。

どうすればいいですか?明らかに、最初のステップはLVMデバイスのスナップショットを作成することですが、可能な限り最も効率的な方法でバックアップサーバーにデータを転送するにはどうすればよいですか?デバイス全体を単純にコピーできます。

dd if=/dev/xenVG/SERVER001OS | ssh administrator@backupserver "dd of=/mnt/largeDisk/SERVER001OS.img"

...しかし、それは多くの帯域幅を必要とします。リモートサーバー間でディスクブロック全体のコンテンツを同期するためのrsyncのようなツールはありますか?何かのようなもの:

rsync /dev/xenVG/SERVER001OS backupServer:/mnt/largeDisk/SERVER001OS.img

Rsyncのmanページを正しく理解していれば、上記のコマンドは実際には機能しません(動作しますか?)が、私が目指していることを示しています。 --devices rsyncオプションは、デバイスの内容ではなく、デバイス自体をコピーすることです。 VMイメージをリモートサーバーと同期する前にローカルコピーを作成することは、ディスク領域がないためオプションではありません。

ブロックデバイスとリモートサーバー上のバックアップファイルを同期できる便利なユーティリティはありますか?必要に応じて作成できますが、既存のソリューションの方が適しています。これを行うrsyncオプションを見逃しましたか?

22
David Hicks

標準のrsyncにはこの機能がありませんが、rsync-patches tarball(copy-devices.diff)にパッチがあり、 http://rsync.samba.org/ftp/rsync/からダウンロードできます) アプリケーションを適用して再コンパイルした後、-copy-devicesオプションを使用してデバイスをrsyncできます。

12
Balázs Pozsár

RSyncには「書き込みデバイス」と「コピーデバイス」のパッチがありますが、これらは小さなイメージ(1〜2 GB)でのみ機能します。 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
16
David Herselman

特にLVMスナップショットでこれを行うことに関心のある人は、スナップショット内の変更されたブロックのリストを読み取り、それらの変更のみを送信する私の lvmsync ツールが好きかもしれません。

9
womble

Zumastor Linux Storage Project を見てください。これは ddsnap ツールを介してバイナリ「rsync」を使用した「スナップショット」バックアップを実装しています。

マンページから:

ddsnapは、複数の同時スナップショットを効率的に保持できるブロックレベルのスナップショット機能を備えたブロックデバイスレプリケーションを提供します。 ddsnapは、2つのスナップショット間で異なるスナップショットチャンクのリストを生成し、その違いをネットワーク経由で送信できます。ダウンストリームサーバーで、更新されたデータをスナップショットブロックデバイスに書き込みます。

6
rkthkr

pythonと呼ばれるスクリプト blocksync があります。これは、sshを介してネットワーク経由で2つのブロックデバイスを同期し、変更のみを転送する簡単な方法です。

  • Blocksync.pyをリモートホストのホームディレクトリにコピーします。
  • リモートユーザーがSudoを実行できるか、または自身がrootであることを確認してください
  • ローカルユーザー(root?)がソースデバイスとリモートホストへのSSHを読み取れることを確認します。
  • 呼び出し:python blocksync.py /dev/source user@remotehost /dev/dest

最近ハッキングしてクリーンアップし、rsyncと同じ高速チェックサムアルゴリズムを使用するように変更しました( Adler-32 )。

2
rcoup

LVMスナップショットを持つシステムのパフォーマンスは、スナップショットの数に比例することに注意してください。

lvmスナップショットでのMySQLパフォーマンス

1
James

プレーンなddを使用して回線を介して送信する空のスペースの量を最小限に抑えようとしている場合、sshにパイプする前にそれをgzipにパイプするだけではいいのではないでしょうか?

例えばdd if =/dev/xenVG/SERVER001OS | gzip | ssh administrator @ backupserver "dd of =/mnt/largeDisk/SERVER001OS.img.gz"

1
Ophidian

数年検索した後、最近、サーバー間で LVMスナップショットを同期 するためのツールを作成しました。最小限のIOを使用し、同期が行われている間にシステムを実行できるように設計されています。

これは、LVMスナップショット間の違いを同期し、シンプロビジョニングを使用してパフォーマンスへの影響が最小限になるという点で、ZFS送信/受信に似ています。

フィードバックをお願いしますので、ご覧ください。

0
David B

David Herselman's answer に加えて、次のスクリプトはローカルデバイスと同期します。

Perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};print md5($_)' $dev2 |
  Perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_);
    read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 |
   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

私の知る限り、両方のスクリプトは最初に lists.samba.org に投稿されました。

0
Martin

これは古い質問ですが、2つのブロックデバイスを効率的に同期する2つの非常に便利なツールについては誰も触れていません。

bothツールで遊んで、目的の使用法により適した方を選択することを強くお勧めします。

0
shodanshok