バックアップの設計

【図解】snapshot(シャドウコピー)とバックアップの違い,VMwareやWindowsでの使い方,差分を使う仕組みについて

スナップショットとは

スナップショットは「COW(Copy on Write)」という機能を応用した技術です。

あるタイミングでのファイルシステム上のフォルダ配下、もしくはボリューム全体のビットの状態を写真のように時間軸で切り抜いて保存しておく機能です。

バックアップを取得する際、例えばファイルAとファイルBの一部分は互いに同じ情報を持つ必要があるとします。ファイルAを取得し終わり、ファイルBを取得する前にAとBが更新された場合、バックアップデータとして持っている情報ではAとBで不整合が発生してしまい、うまく復元できない可能性があります

そのため、スナップショットを使い、ある時間でのファイルAとファイルBの状態を写真で取得し、その写真を元にコピーすることで整合性を保つことができます。スナップショットの動作としては以下のようになります。

スナップショットは差分を管理する

例えばファイル A とファイル B のスナップショットを撮ると、ファイル A'(ダッシュ)、ファイル B'(ダッシュ)、および、スナップショットキャッシュ (スナップショットの管理領域) が生成されます。ただし、これらは初期状態では情報量を持ちません。ファイル A'は実体は無く、ファイル Aへの参照情報のみ持ちます。ファイル B'も同様です。そしてスナップショットキャッシュには、ファイル A や B で情報が更新された際に、その変更分だけ情報が格納されます

そしてスナップショットをサポートしているファイルシステムでは、あるブロック単位 (例えば 1 KByte 単位) で変更が有るかどうかを示すフラグ (ビット) を用意しており、ファイルに更新があった場合はそのブロックのそのフラグを 1 にした上で更新し、さらにスナップショットキャッシュに元の情報を書き込みます。

そしてスナップショット上のファイルA'やB'を取得したい場合は、そのフラグが 0 であればファイル A や B の情報を取得し、フラグが 1 であればスナップショットキャッシュの情報を取得します。

スナップショットのイメージバックアップへの適用

このスナップショットを使うことで、一貫性のあるバックアップが取得できるため、前述のオンライン方式のイメージバックアップが可能となります。具体的にはWindows Server BackupではVSS(Volume Shadow copy Service)というスナップショットを取ることで、オンラインでのバックアップを可能としています。また、VMware等の仮想環境では、仮想サーバ自体が(vmdkファイル等の)ファイルとして管理できるので、ハイパーバイザーが仮想サーバのスナップショットを取得し、それをファイルとしてコピーすることで、障害時の復旧が可能なイメージバックアップがオンラインで取得可能です。

スナップショット(VSS: ボリュームシャドウコピー)の単体利用

スナップショットは単体でも頻繁に使われています。例えば毎日夜間に1回スナップショットを取得すれば、万が一データを誤って消してしまった場合であっても、夜間の時点に戻すことができます。

例えば、あるファイルサーバ上でスナップショットを取ったファイル、もしくはフォルダは、WindowsPC の Explorer でそのサーバ上のファイルやフォルダを右クリックし、プロパティを開き、「以前のバージョン」タブをクリックすると、スナップショット取得時点の情報が出てきますので、「復元」ボタンを押せば元に戻すことができます

下記の例では毎日 12 時と 23 時にスナップショットを取得した場合の例です。「開く」ボタンを押すと、復元する前に中身を確認することができます。

つまり、スナップショット単体の機能は、「ユーザの誤操作によるデータ消失からの復旧」には最適です。

また、VMware のような仮想サーバ環境においては、仮想サーバのパッチ適用時の「システム不具合からの復旧」にはよく利用されています。パッチ適用前に仮想サーバのスナップショットを取得し、OS のソフトウェア的な不具合が発生した際には元に戻す、という使い方です。VMware から見たら仮想サーバは 1 つのファイルであるため、このようなことができます。(さらに言うと、VMware 等の仮想ソリューションの場合は、ディスク領域だけでなくメモリ領域もスナップショットを取得することで、サーバ稼働中の状態に巻き戻すことも可能となります。)

しかし、これらの動きから分かるように、スナップショットは元データが破壊されてしまった場合は元に戻せません。なのでバックアップではない、と主張する人もいます。

その主張もある観点からは正しいですが、このサイトではバックアップの定義としてシステム障害以外への対応も想定しているため、バックアップと考えます。

仮想サーバのスナップショット

仮想サーバのスナップショットは、パッチ適用等、仮想サーバの設定に手を加える前に取得すると非常に便利です。万が一、その設定変更がうまく行かない場合は、設定変更前に速やかに戻すことができます。

ただし、利用にあたっては注意が必要です。

特に、サーバ稼働中にスナップショットを取得 (メモリ領域もスナップショットを取得) し、そのスナップショットから元に戻す場合は、物理サーバで例えると、急に電源を引き抜いた後に起動させるのと同じ行為であり、ファイルシステムの破損等の障害に繋がります。

最近の仮想基盤システムではオプションで、メモリの状態も保存できるため、そうした場合は比較的問題は発生しにくいです。ですが、DBサーバでの取得やファイル書き込みの多いタイミングでの取得は避けるべきです。

なので、基本手順としては以下が良いでしょう。

  1. 仮想サーバをシャットダウン
  2. スナップショットを取得
  3. 仮想サーバを起動し、パッチ適用など設定変更を実施
  4. 万が一うまく行かない場合は再度仮想サーバをシャットダウンし、スナップショットで元の状態に戻し、起動
  5. うまく行った場合も行かなかった場合も、頃合いを見てスナップショットを削除

最後のスナップショット削除は、スナップショット取得中は、前述の通り管理領域の書き込みがあるため、これの領域が大きくなるとパフォーマンスが落ちるためです。

不要なスナップショットはなるべく消すように心掛けましょう。

コメント

タイトルとURLをコピーしました