ダウンタイムが許されないシステムにおける可用性の確保は、最重要課題である。ストレージやHAクラスタの導入が必要になるだろう。(編集局)
前回はデータベースの可用性について、バックアップ/リカバリという観点で解説しました。しかし、バックアップ/リカバリだけでは十分な可用性が得られない場合もあります。例えば、テープ装置などにバックアップを保存している場合は、テープから必要なバックアップイメージを読み込んでDB2へリストアする時間が必要です。さらに、最新の状態へ戻すにはロールフォワードが必要です。テープ装置の種類やデータベースの容量にもよりますが、一定時間はシステムが止まってしまうことが容易に想像できます。
そこで今回は、「データベース(システム)を止めない」ことをテーマに、HAクラスタやストレージの遠隔コピー機能を使った高可用性/ディザスタ・リカバリについて解説します。
まずは、データベースの障害について前回の復習をしましょう。データベースの障害は、以下の4つに大別できました。
それぞれの障害に対するバックアップ/リカバリ方式は、以下の表のようにまとめることができました。
想定される障害 | バックアップ/リカバリ方式 | |
---|---|---|
データベースの論理障害 | DB2クラッシュ・リカバリー(DB2機能) DB2バックアップ/リストア(DB2機能) |
|
ストレージ・ディスク障害 | DB2バックアップ/リストア(DB2機能) ローカル・コピー機能(ハード/ソフト機能) |
|
サーバの障害 | DB2クラッシュ・リカバリー(DB2機能) ローカル・フェイルオーバー(HAクラスタ) レプリケーション(DB2機能) ログ・シッピング(DB2機能) |
|
サイト全体の障害 | DB2クラッシュ・リカバリー(DB2機能) DB2バックアップ/リストア(DB2機能) グローバル・フェイルオーバー(HAクラスタ) 遠隔コピー機能(ハード/ソフト機能) レプリケーション(DB2機能) ログ・シッピング(DB2機能) |
|
前回はDBMSの機能としてのバックアップ/リストアを中心に紹介しましたが、今回はストレージのコピー機能を使ったバックアップ/リカバリを紹介します。
最近の大容量ストレージは、サーバに負荷を掛けない高速なコピー機能を持ったものが主流になっています。IBM ESS(Enterprise Storage Server)のFlashCopyや日立SANRISEのShadowImage、EMC SymmetrixのTimeFinderなどがそれに当たります。
コピー方式やリカバリ方式はさまざまですが、どれも論理ボリューム単位(LU)でデータを高速にコピーすることが可能です。特にデータ量が膨大で、止められないシステムのバックアップ/リカバリには最適なソリューションです。
前回も触れたように、コピー機能を使う際に注意が必要なのは、トランザクション中にディスクをコピーするとトランザクションの整合性が取れなくなってしまうということです。そこでデータの整合性を保つために、DB2からのI/Oを止めてディスクの書き込みの静止点を取る必要があります。
DB2には、set write suspend/resumeというコマンドが用意されています。このコマンドは、suspendが発行された時点でDB2からディスクへのI/Oを止め、DB2としてI/Oの静止点を取って整合性を保ちます。
コピー対象となるのは、以下の4つです。
差分をコピーするタイプの場合は、事前にデータの再同期を行っておきます。なるべくI/Oサスペンドの状態を短くするためにあらかじめデータを再同期しておくことで、同期を切り離すときだけI/Oをサスペンドさせるのです。
1.データベースのI/Oをサスペンド状態にする
$ db2 connect to sample データベース接続情報 データベース・サーバ = DB2/LINUX 8.1.4 SQL 許可 ID = DB2INST1 ローカル・データベース別名 = SAMPLE $ db2 set write suspend for db DB20000I SET WRITE コマンドが正常に終了しました。
2.syncの実行
syncコマンドを使うことを推奨するストレージもあるので、必要に応じてsyncを発行します。
3.データの再同期を切断する(もしくはデータの高速コピーを実行)
4.データベースのI/Oを再開
$ db2 set write resume for db DB20000I SET WRITE コマンドが正常に終了しました。 $ db2 connect reset DB20000I SQL コマンドが正常に終了しました。
ここで注意が必要なのは、suspendとresumeは同一コネクションから発行する必要があるということです。簡単なのは、1〜4の一連のコマンドを1つのシェルから実行することです。例えばrootユーザーにsysadm、sysctrl、sysmaintのいずれかの特権を与え、suspendとresumeをrootユーザーで行うのも1つの方法です。
では、リカバリはどうすればよいのでしょうか? コピーで取得した分割ミラーには3つの使用方法があります。
●スナップショット・データベース[snapshot]
ミラーリングされたデータベースは、バックアップ元のデータベースの複製として、別のサーバで利用可能です。リストア対象は、以下の4つです。
以下の手順でリストアを行います(注)。
注:本番で使用しているサーバをプライマリ・サーバ、バックアップ機として待機しているサーバをセカンダリ・サーバとします。
1.ディスク領域のマウント
バックアップしたディスク領域をセカンダリ・サーバでマウントします。この際、マウントポイントをプライマリ・サーバに合わせます。
2.データベース・マネージャーの開始
$ db2start 01/28/2004 03:31:15 0 0 SQL1063N DB2START の処理が正常に終了しました。 SQL1063N DB2START の処理が正常に終了しました。
3.データベースの初期化
$ db2inidb sample as snapshot DBT1000I ツールは正常に完了しました。
これで、サスペンドした瞬間のスナップショット・データベースをセカンダリ・サーバで利用できます。
●スタンバイ・データベース[standby]
ロールフォワード・ペンディング状態にし、アクティブ・ログを適用して極力最新の状態に戻します。リストア対象は、以下の3つです。
以下の手順でリストアを行います。
1.ディスク領域のマウント
バックアップしたディスク領域をセカンダリ・サーバでマウントします。この際、マウントポイントをプライマリ・サーバに合わせます。
2.データベース・マネージャーの開始
$ db2start 01/28/2004 03:31:15 0 0 SQL1063N DB2START の処理が正常に終了しました。 SQL1063N DB2START の処理が正常に終了しました。
3.データベースの初期化
$ db2inidb sample as standby DBT1000I ツールは正常に完了しました。
4.ロールフォワードの実行
$ db2 rollforward db sample to end of logs ロールフォワード状況 入力データベース別名 = sample 状況を返したノードの数 = 1 ノード番号 = 0 ロールフォワード状況 = DB 作業中 次に読み込むログ・ファイル = S0000001.LOG 処理したログ・ファイル = S0000000.LOG - S0000000.LOG 最後にコミットしたトランザクション = 2004-01-27-18.45.19.000000 DB20000I ROLLFORWARD コマンドが正常に終了しました。
5.プライマリ・サーバからアーカイブ・ログを転送
6.4〜5を定期的に繰り返す
7.ロールフォワードの終了
セカンダリ・サーバのデータベースを使用する際に、ロールフォワードを終了します。
$ db2 rollforward db sample complete ロールフォワード状況 入力データベース別名 = sample 状況を返したノードの数 = 1 ノード番号 = 0 ロールフォワード状況 = 非ペンディング 次に読み込むログ・ファイル = 処理したログ・ファイル = S0000000.LOG - S0000001.LOG 最後にコミットしたトランザクション = 2004-01-27-18.45.19.000000 DB20000I ROLLFORWARD コマンドが正常に終了しました。
最新のログを適用することで、セカンダリ・サーバでも最新状態のデータを利用できます。
●バックアップ・イメージ[mirror]
この方式は、バックアップしたディスクイメージをプライマリ・サーバに戻してリストアします。コピーしたイメージをプライマリ・サーバに戻す以外の手順は、スタンバイ・データベースと同じです。
この方式のリストア対象は、以下の2つです。
以下の手順でリストアを行います。
1.バックアップしたデータを戻す
2.データベース・マネージャーの開始
$ db2start 01/28/2004 03:31:15 0 0 SQL1063N DB2START の処理が正常に終了しました。 SQL1063N DB2START の処理が正常に終了しました。
3.データベースの初期化
$ db2inidb sample as mirror DBT1000I ツールは正常に完了しました。
4.ロールフォワードの実行と完了
$ db2 rollforward db sample to end of logs and complete ロールフォワード状況 入力データベース別名 = sample 状況を返したノードの数 = 1 ノード番号 = 0 ロールフォワード状況 = 非ペンディング 次に読み込むログ・ファイル = 処理したログ・ファイル = S0000000.LOG - S0000001.LOG 最後にコミットしたトランザクション = 2004-01-27-18.50.42.000000 DB20000I ROLLFORWARD コマンドが正常に終了しました。
この方式もスタンバイ・データベースと同様、最新のログを適用することで、セカンダリ・サーバでも最新状態のデータを利用できます。
以上が、ストレージの高速コピー機能を使ったバックアップ/リストアです。
Copyright © ITmedia, Inc. All Rights Reserved.