More info...

2009-12-22

MySQLバックアップ頂上決戦!! LVMスナップショット vs InnoDB Hot Backup

先日のMyNAのイベントにて、「InnoDB Hot Backup(もしくはXtra Backup)のようなツールとLVM等でスナップショットを取るのはどちらが最強のバックアップたり得るか?」という感じの内容の議論がなされていたのだが、確かにこれは答えるのが難しい永遠のテーマである。永遠のテーマだからこそ漢のロマンがある!!というわけで、今日はそれぞれのバックアップ方法について仕組みを説明しつつ私の見解を述べたいと思う。(見解≠結論ではない点には注意して頂きたい。結論を出すのは貴方なのだから!!)


スナップショットによるバックアップ

スナップショットを使えばとある瞬間のディスクやファイルシステムのデータをいつでも後から参照することができる。しかもスナップショットの作成は一瞬だ。スナップショット機能を活用すれば最強のオンラインバックアップソリューションが出来るだろう。

しかし、スナップショットでバックアップを取るなんて危険な操作じゃないのか?!と不安に思われる方もいらっしゃるかも知れない。MySQL Serverが稼働中にいきなりデータだけをとってくるのだから、そのような疑問を持たれるのは頷ける。しかし仕組みさえ分かればスナップショットによるバックアップは怖くないということが分かるはずだ。そこで、まずはスナップショットによるバックアップの仕組みについて説明する。スナップショットを取る際の要件は次の通りである。
  • 全てのデータを単一のボリュームに置くこと。つまり、一回のスナップショット操作でバックアップが取れることだ。
  • ディスク装置やLVMでは事前にスナップショット領域を準備しておかなければならない。
これらの要件を満たせば、スナップショットをそのままバックアップとして利用することが出来るのである。

InnoDBをスナップショットでバックアップ

スナップショットを取った瞬間のデータとはどのようなものだろうか?その事を理解してもらうため次の図を見て欲しい。これは、MySQL実行中におけるInnoDBのバッファプールとテーブルスペース(データファイル)、およびログファイルの関係を模式的に表したものである。



更新はまずバッファプールに行われ、その内容がログに記録される。そしてテーブルスペースへ書き込まれていないページは、ダーティページとしてバッファプール内に保留される。ログへの書き込みはシーケンシャルなので高速だが、テーブルスペースへの書き込みはランダムアクセスになるので低速だからだ。従って、ダーティページは後からまとめてテーブルスペースへ書き込まれる。ログファイルにおいて、ダーティページの書き込みが全て完了した地点がチェックポイントとなる。という寸法である。(もっと細かく説明するとややこしくなるのでここでは以上の説明に止めておく。)

ここでスナップショットを実行すると、どのようなデータが取れるのだろうか?もちろん、「データファイルへ書き込まれていない更新を含んだログファイル」と「データファイル」である。ここで得られるデータはMySQLがクラッシュしたり、サーバーが突然落ちてしまったときに得られるデータとまったく同じであり、このデータを用いてmysqldを起動するとInnoDBのクラッシュリカバリが行われる。mysqld起動直後は次のような状態になるだろう。



InnoDBはリカバリ処理時にログファイルから「データファイルへ書き込まれていない更新」を読み込んで、データファイルへ適用しなければならない。これがいわゆるRedoである。(他にもUndo処理やIndex Mergeが走ったりするが、説明がややこしくなるので割愛する。)

クラッシュリカバリを実行していてはリストアに掛かる時間が長くなってしまうじゃないか?!と思うかも知れない。確かにその通りなので、他のマシンへデータファイルとログファイルをコピーして、そこでそのデータを用いてmysqldを起動し、クラッシュリカバリを完了させておくと良いだろう。

さらに、スナップショットで得られたバックアップに対してバイナリログを使ったロールフォワードリカバリを行う事もできる。ロールフォワードリカバリを行うには、バイナリログのファイル名と位置情報が必要だが、InnoDBはその情報をログファイル内に記録しており、再起動後のエラーログには次のようにログファイル名と位置が出力されるのだ!

InnoDB: Last MySQL binlog file position 0 1272, file name ./mysql-bin.000001

後はここで得られた情報を使って、mysqlbinlogコマンドでバイナリログを適用すれば良い。クラッシュセーフなInnoDBは安全にいつでもスナップショットでバックアップを取ることが出来るのである。従って、InnoDBのバックアップは次のような手順で実施出来る。
  1. スナップショットを取得
  2. スナップショットからデータを安全な場所にコピー
  3. スナップショットを破棄
なお、スナップショットの取得や破棄の方法については、LVMやZFS、ディスク装置などのマニュアルを参照して欲しい。

MyISAMをスナップショットでバックアップ

MyISAMの場合はどうだろうか?こちらの場合話はもっと簡単で、一瞬だけFLUSH TABLES WITH READ LOCKコマンドを使ってデータを全てディスクへ書き出した後にスナップショットを取れば良い。このコマンドによって得られたRead Lockはmysqld全体をread-onlyにして、UNLOCK TABLESが実行されるかロックを保持しているセッションが切れるまで継続する。また、MyISAMはInnoDBと違ってバイナリログの位置情報を記録するような仕組みは持っていないので、ロールフォワードリカバリを行いたい場合には別途情報を記録しておく必要があるだろう。

以上をまとめると、MyISAMのバックアップは次のような手順で実施出来る。
  1. FLUSH TABLES WITH READ LOCK
  2. SHOW MASTER STATUS(バイナリログ情報の表示)
  3. syncコマンドを実行(ZFSでは不要)
  4. スナップショットを取得
  5. UNLOCK TABLES
  6. スナップショットからデータを安全な場所にコピー
  7. スナップショットを破棄
ここで一工夫するならば、SHOW MASTER STATUSの代わりにFLUSH LOGSコマンドを実行することである。FLUSH LOGSコマンドを使うとログファイルが切り替わるため、ロールフォワードリカバリ時には新しいログの先頭から適用すれば良く、リカバリ作業がよりシンプルになるだろう。また、FLUSH TABLES WITH READ LOCKはわりと重い処理なので、負荷が低い時間帯を見計らって実行するのが良いだろう。

ハイブリッドな環境をバックアップ

MyISAMとInnoDBの両方を使っている場合はどのようにバックアップすれば良いだろうか。細かい説明は抜きにするが、MyISAMの場合と同じ手順でバックアップすることが出来るので作業手順は割愛する。スナップショットを使えばバックアップは楽勝である。

じゃあInnoDB Hot Backupは?

InnoDB Hot Backup(以下ibbackup)やXtra Backupは、InnoDBのファイルフォーマットを認識して高速にオンラインバックアップするツールである。ibbackupは、まず全てのデータファイルをコピーするのだが、当然MySQL Serverが動いている最中なのでコピー中もデータファイルが更新されることになるだろう。そのため、データファイルは先頭と最後尾では一貫性が崩れている状態になってしまうのだが、ibbackupはこの問題を解消するためにログファイルも一緒にバックアップし、ログファイルの情報を元に(木下氏の言葉を借りると)「つじつまを合わせる」ことによってデータファイルを一貫性のある状態にしてしまうのである。もちろん、ログファイルの内容は全てデータファイルに適用される。

従って、ibbackupによって取得したバックアップは、「ibbackupコマンド完了時のものになる」という特徴がある。スナップショットによるバックアップは、スナップショット取得時のものになるのと対照的だ。Xtra Backupも基本的には同じ動作原理である。

InnoDB Backupには、innobackupというコマンドが付属している。このコマンドを利用すると、InnoDBだけでなくMyISAMのバックアップも行ってくれる。もちろん一貫性のあるバックアップを取得可能である。(詳細はマニュアルを参照して頂きたい。)

で、どっちがいいの?

結局はどちらを使ってもそれほど変わらないというのが俺の見解だ。好きな方を使ってくれ!と言いたいが、そんなことを言うと身も蓋もないので、それぞれのメリットとデメリットを以下に挙げておく。後は自分で判断して運用に合う方を利用して頂けると幸いである。(もちろんmysqldumpやレプリケーションを用いたバックアップなど、他のバックアップソリューションの検討も忘れないようにしたい。)とりあえず、いずれも高速なバックアップソリューションでありほぼ互角なので、高速性という点については割愛する。

スナップショットの利点・欠点・特徴
  • バックアップの内容はスナップショット実行時のデータ。狙った時間にバックアップが可能なのでスケジュールが組みやすい。
  • 瞬時にスナップショットが取れる。スナップショットがあれば、コピーが完了していなくてもバックアップとして利用することが出来る。(すぐにmysqldをその時点から再開することが可能。)
  • ディスク装置側でスナップショットがサポートされていれば超高速。
  • OS側でもLVMやZFSなどのツールあり。
  • スナップショット用の領域を事前に準備しておく必要がある。(ZFSのように必要ない場合もある。)

InnoDB Hot Backupの利点・欠点・特徴
  • スナップショット用の領域が不要。事前にバックアップを計画していなくても、後からインストールしてibbackupを実行するだけでいつでもバックアップ出来る手軽さがある。
  • OSやプラットフォームは問わない。スナップショット対応のディスク装置、ファイルシステム、ボリューム管理ソフトウェアなど一切不要。
  • バックアップの内容はコマンド完了時のデータ。Point-In-Timeリカバリをしたい場合には、バックアップに掛かる時間を計算しておく必要あり。
  • 有償ソフトウェアであること。Xtra Backupは無料かつGPLv2だが人柱になる勇気が必要。

解説は以上である。

バックアップはデータベース管理者にとって最も重要なテーマの一つであり、それはMySQL利用時でも変わらない。MySQLには様々なバックアップ手法が存在するが、スナップショットやInnoDB Hot Backupによるバックアップはデータ容量が増してきた昨今では必須のバックアップ手法であると言える。是非これらのバックアップ手法を活用してバックアップ運用を盤石にして万が一に備えて欲しい。そうして読者諸君の心労が少しでも和らげば幸いである。

0 件のコメント:

コメントを投稿