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


22

多数の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のマニュアルページを正しく理解している場合、上記のコマンドは実際には動作しません(動作しますか?)が、それは私が目指しているものを示しています。--devices rsyncオプションは、デバイスの内容ではなく、デバイス自体をコピーすることです。リモートサーバーと同期する前にVMイメージのローカルコピーを作成することは、ディスク領域がないためオプションではありません。

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

回答:


12

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


あなたのターゲットがデバイスであれば、パッチは次の場所にあります。bugzilla.redhat.com/show_bug.cgi?id=1193654
ジェイソンPyeron

16

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='root@backup.company.co.za';

初期シード:

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

最初は怖かったのですが、それを試してみたところ、本当にうまくいきました。
マーティン

なぜ@ sysadmin1138のread ARGV,$buf,1024代わりにread STDIN,$buf,1024?(私はstackoverflow.com/q/22693823/2987828に答えようとしていますが、ここではARGVを理解していません)。私は質問stackoverflow.com/q/22693823/2987828で毎日バリアントを使用していますが、うまく機能しています。
user2987828

1
perlmonks.org/bare/?node_id=492858を参照してくださいこれは、引数としてファイル名が指定されない限り、ARGVとSTDINが類似していることを示しています。
user2987828

9

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


6

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

マンページから:

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


ああ、それは私が探していたもののように見えます、ありがとう。
デビッドヒックス

Zumastorプロジェクトへのリンクは古くなっています。これは正しいものだと思います。shapor.com
Martin

2

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

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

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


1
私はそれを使用しています、正常に動作します。破損の原因を修正し、より信頼性の高いハッシュを使用する修正版があることに注意してください。
cmc

1

プレーンddでワイヤーを介して送信する空のスペースを最小限にしようとしている場合、sshにパイプする前にgzipにパイプするだけではできませんか?

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


必要な帯域幅を少し削減しましたが、60 GBと100 GBのディスクイメージがあり、gzipでも時間がかかりすぎました。
デビッドヒックス

@ Ophidian、SSHは圧縮を内部で処理することを知っておく必要があります。オプションがあります。
poige

1

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

たとえば、lvmスナップショットを使用したMySQLのパフォーマンス


確かに、私の最初の解決策は、毎日のスナップショットを設定し、前日のスナップショットとの差分を作成し、それをバックアップサーバーにdd-dingするだけでした。私はそれがそれほど単純ではないことを知るために最も覗き見されました。
デビッドヒックス

すなわち、多くの異なる方法で実装されているLVM薄いスナップショットと真ではないかもしれない
アレックスF

0

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

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

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

両方のツールを試して、意図した使用法により適した方を選択することを強くお勧めします。


0

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

ZVMの送受信に似ていますが、LVMスナップショット間の違いを同期し、シンプロビジョニングを使用してパフォーマンスへの影響を最小限に抑えます。

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


-1

このスクリプトには、いくつかの効率化が必要です。

  1. 少なくとも私のシステムでは、perlバッファーの読み取りは8kなので、8192ブロックサイズを使用します。
  2. lzopにフィードしているため、リモート出力バッファが「フル」になるまでローカルエンドがブロックされないように自動フラッシュします。

ssh -i /root/.ssh/rsync_rsa $ remote "perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ | = 1; \ $ / = \ 892}; print md5(\ $ ) '$ dev2 | lzop -c "| lzop -dc | perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ | = 1; $ / = \ 8192}; $ b = md5($); 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){STDOUT、\ $ s * 8192,1を探す; \ $ s = 0}; ARGVを読む、\ $ buf、8192; print \ $ buf} '1 <> $ dev2 "

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.