シナリオ: Db2 pureScale 環境での HADR のデプロイ
このシナリオでは、現在 Db2 pureScale Feature を使用している ExampleFlightsExpress (EFE) というオンライン旅行サービス用の高可用性災害時リカバリー (HADR) セットアップの計画、構成、およびデプロイについて説明します。 すべてのステップは、ダウン時間を伴わずに完了することができます。
背景
EFE は、以下の 2 つの理由で Db2 pureScale Feature の使用を選択しました。
- 連続可用性。 顧客が文字通り 1 日 24 時間 週 7 日サービスにアクセスしているオンライン小売業のビジネスでは、ダウン時間は致命的です。
- 拡張容易性。 一年の時期によって顧客からの需要が大幅に増減するため、EFE では容易に、しかも機能停止を伴うことなく処理能力を追加できなければなりません。
計画
EFE は、会社の本社 (サイト A) を HADR 1 次クラスターのロケーションとし、そこから 500 マイル (800 キロ) 離れた支社 (サイト B) をスタンバイ・クラスターのロケーションとすることにしています。 この 2 つのサイトは WAN で接続します。 環境に関するその他の詳細は以下のとおりです。
- データベース名: hadr_db
- すべてのホストでのインスタンス所有者: db2inst
- HADR の 1 次側とスタンバイ側の通信に使用する TCP ポート: 4000
- SQL クライアント/サーバー通信に使用する TCP ポート: 8000
- 1 次クラスター上の クラスター・キャッシング・ファシリティー (ID 128 および 129) および メンバー (ID 0、1、2、および 3) のホスト: cfp0、 cfp1、 p0、 p1、 p2、および p3
- スタンバイ・クラスター上の クラスター・キャッシング・ファシリティー および メンバー のホスト: cfs0、 cfs1、 s0、 s1、s2、および s3
- 優先再生メンバー
- すべての 1 次側のメンバーで生成されたログの再生は、スタンバイ側の 1 つのメンバーだけが一貫して行います。 したがって、EFE の DBA は、1 次クラスターとスタンバイ・クラスターのどのメンバー・ホストが最大のメモリーおよび CPU リソースを持つかを判別し、それらのメンバーを優先再生メンバーとして指定します。 1 次側でもこの計画を行わなければならない理由は、1 次データベースで障害が発生して、そのデータベースがスタンバイとして再統合された場合、指定されたメンバーがすべての再生を実行することになるためです。 これに該当するのは、1 次側では p0、スタンバイ側では s0 です。いずれの場合も、メンバー 0 はホストの常駐メンバーです。
- 同期モード
- EFE の DBA は、同期モードを ASYNC (デフォルト)、SYNC、NEARSYNC、および SUPERASYNC のどれにするかを選択する必要があります。 そのために、DBA は WAN を分析し、ネットワーク・スループットが 300 メガビット/秒であること、そして往復時間が 80 ミリ秒であることを判別します。次に、DBA はロギング・レートを測定します。クラスター・レベルでのロギング・レートは 20 MB/秒であると測定されました。 ネットワーク・スループットは、このロギング・レートをサポートするには十分であり、ピーク時のロギング・レートを 37 MB/秒に達するまで許容するため、ASYNC が適切なモードということになります。 スループットがロギング・レートに近い場合には、SUPERASYNC のほうが適切な選択になります。SUPERASYNC では、トランザクションのピーク期間中に、1 次がスタンバイのかなり先に進むことができるためです。
- スケーリングに関する考慮事項
- EFE は、一年のピーク期間中に一時メンバーを追加する傾向があります。メンバー・トポロジーは HADR ペアの間で共通していなければならないため、EFE はスタンバイをスケールアウトする方法を決定しなければなりません。 EFE が新しいホストで新規メンバーを追加することにより 1 次クラスターを大きくすることを決定した場合、EFE は既存のホストに新規メンバーを追加することによるスタンバイ・クラスターでの追加コストを回避できます。 この場合、スタンバイが新しい 1 次としてテークオーバーすると、データベースの処理能力が低下する結果となりますが、このコスト節約は、潜在的な不利に値するものです。
HADR の構成
DBA は以下のステップを実行します。
- DBA は、以下のようにして、1 次データベースになる hadr_db のオンライン・バックアップを取得します。
db2 BACKUP DB hadr_db online TO backup_dir
- DBA は、以下のコマンドを発行して、対象のスタンバイ・クラスターにバックアップをリストアします。
db2 RESTORE DB hadr_db FROM backup_dir
- DBA は 1 次データベースに、スタンバイ・クラスターと同期モードを指定する、クラスター・レベルの HADR パラメーターを設定します。 特に重要なのは、リモート・メンバーをリストする hadr_target_list パラメーターです。 hadr_target_list にリストする必要があるのは、1 つのリモート・メンバーだけです。 Db2 は、リストされたメンバーとの初回の連絡後に、他のメンバーのアドレスを取得します。 ただし、複数のアドレスを入力しておくと、唯一リストされているメンバーで障害が発生したときにクラスター相互間で接続できないという単一障害点を防ぐことになります。 DBA は次のコマンドを実行します。
スタンバイは 1 つしかないため、hadr_remote_host パラメーターには、hadr_target_list パラメーターと同じアドレスのグループを指定します。db2 "UPDATE DB CFG FOR hadr_db USING HADR_TARGET_LIST {s0:4000|s1:4000|s2:4000|s3:4000} HADR_REMOTE_HOST {s0:4000|s1:4000|s2:4000|s3:4000} HADR_REMOTE_INST db2inst HADR_SYNCMODE async"
- DBA は 1 次データベースに、各メンバーのアドレスとポートを識別する、メンバー・レベルの HADR パラメーターを設定します。
- メンバー 0 の場合:
db2 "UPDATE DB CFG FOR hadr_db MEMBER 0 USING HADR_LOCAL_HOST p0 HADR_LOCAL_SVC 4000"
- メンバー 1 の場合:
db2 "UPDATE DB CFG FOR hadr_db MEMBER 1 USING HADR_LOCAL_HOST p1 HADR_LOCAL_SVC 4000"
- メンバー 2 の場合:
db2 "UPDATE DB CFG FOR hadr_db MEMBER 2 USING HADR_LOCAL_HOST p2 HADR_LOCAL_SVC 4000"
- メンバー 3 の場合:
db2 "UPDATE DB CFG FOR hadr_db MEMBER 3 USING HADR_LOCAL_HOST p3 HADR_LOCAL_SVC 4000"
- メンバー 0 の場合:
- DBA はスタンバイ・データベースに、1 次クラスターと同期モードを指定する、クラスター・レベルの HADR パラメーターを設定します。
db2 "UPDATE DB CFG FOR hadr_db USING HADR_TARGET_LIST {p0:4000|p1:4000|p2:4000|p3:4000} HADR_REMOTE_HOST {p0:4000|p1:4000|p2:4000|p3:4000} HADR_REMOTE_INST db2inst HADR_SYNCMODE async"
- DBA はスタンバイ・データベースに、各メンバーのアドレスとポートを識別する、メンバー・レベルの HADR パラメーターを設定します。
- メンバー 0 の場合:
db2 "UPDATE DB CFG FOR hadr_db MEMBER 0 USING HADR_LOCAL_HOST s0 HADR_LOCAL_SVC 4000"
- メンバー 1 の場合:
db2 "UPDATE DB CFG FOR hadr_db MEMBER 1 USING HADR_LOCAL_HOST s1 HADR_LOCAL_SVC 4000"
- メンバー 2 の場合:
db2 "UPDATE DB CFG FOR hadr_db MEMBER 2 USING HADR_LOCAL_HOST s2 HADR_LOCAL_SVC 4000"
- メンバー 3 の場合:
db2 "UPDATE DB CFG FOR hadr_db MEMBER 3 USING HADR_LOCAL_HOST s3 HADR_LOCAL_SVC 4000"
- メンバー 0 の場合:
HADR の開始
他の HADR 環境での場合と同じく、最初にスタンバイ・データベースを開始する必要があります。 START HADR コマンドを発行するために使用したメンバーが優先再生メンバーに指定されるため、DBA は以下のコマンドを発行します。
- スタンバイ側のメンバー 0 から実行するコマンド:
db2 START HADR ON DB hadr_db AS STANDBY
- 1 次側のメンバー 0 から実行するコマンド:
db2 START HADR ON DB hadr_db AS PRIMARY
HADR が稼働中であるかどうかを判別するために、DBA は 1 次側から MON_GET_HADR 表関数を呼び出します。
select LOG_STREAM_ID, PRIMARY_MEMBER, STANDBY_MEMBER, HADR_STATE
from table (mon_get_hadr(-2))
LOG_STREAM_ID PRIMARY_MEMBER STANDBY_MEMBER HADR_STATE
------------- -------------- -------------- -----------------------
0 0 0 PEER
1 1 0 PEER
2 2 0 PEER
3 3 0 PEER
DBA は、優先再生メンバーであるスタンバイ・メンバー 0 が実際に現在の再生メンバーであることを確認するために、以下を参照します。STANDBY_MEMBER設定します。 1 次側のすべてのメンバーはスタンバイ・メンバーに接続されているため、すべてのログ・ストリームはスタンバイ側の同じメンバーを報告します。役割の切り替え
DBA は、役割の切り替えを実行する必要があります。 つまり、現在のスタンバイ側が 1 次の役割をテークオーバーし、現在の 1 次側がスタンバイの役割をテークオーバーするということです。 これにより、サイト A でクラスターのシャットダウンを必要とする一部の保守が可能になります。 この手順は、データベースに現在接続されているアプリケーションへの影響を最小限に抑えるために、使用量が少ない時間に行われます。
- DBA は、1 次側のいずれのメンバーも異常な状態でないことを確認します。
SELECT ID, varchar(STATE,21) AS STATE, varchar(HOME_HOST,10) AS HOME_HOST, varchar(CURRENT_HOST,10) AS CUR_HOST, ALERT FROM SYSIBMADM.DB2_MEMBER ID STATE HOME_HOST CUR_HOST ALERT ------ --------------------- ---------- ---------- -------- 0 STARTED p0 p0 NO 1 STARTED p1 p1 NO 2 STARTED p2 p2 NO 3 STARTED p3 p3 NO 4 record(s) selected.
- DBA は、すべてのログ・ストリームがピア状態であることを確認します。
select LOG_STREAM_ID, PRIMARY_MEMBER, STANDBY_MEMBER, HADR_STATE from table (mon_get_hadr(-2)) LOG_STREAM_ID PRIMARY_MEMBER STANDBY_MEMBER HADR_STATE ------------- -------------- -------------- ----------------------- 0 0 0 PEER 1 1 0 PEER 2 2 0 PEER 3 3 0 PEER
- サイト B で、DBA がメンバー 0 に対して TAKEOVER HADR コマンドを実行します。
このコマンドが完了すると、新しいスタンバイ側のメンバー 0 (優先再生メンバー) が再生メンバーとして選択され、スタンバイ・クラスターの他のメンバーでは、データベースがシャットダウンします。 新しい 1 次側では、データベースはメンバー 0 でのみ活動化されます。 他のメンバーは、クライアント接続によって活動化されるか、DBA がそれぞれのメンバーに対して明示的に ACTIVATE DATABASE コマンドを実行した場合に活動化されます。 自動クライアント・リルートは、すべての新規クライアントをサイト B に送信します。TAKEOVER HADR ON DB hadr_db
- サイト A で、DBA はスタンバイ側のデータベースを非活動化します (これにより、このデータベースは HADR スタンバイとしての役割を保持します)。
DEACTIVATE DATABASE hadr_db
- サイト A で、DBA がスタンバイ側の Db2 を停止します。
db2stop
- サイト A で、DBA が必要な保守を行います。
- サイト A で、DBA がスタンバイ側で Db2 を開始します。
db2start
- サイト A で、DBA がスタンバイ側のデータベースを活動化します。
データベースは、再生メンバーを 1 つ持つ HADR 1 次データベースとして活動化されます。ACTIVATE DATABASE hadr_db
- 元のセットアップに戻すには、DBA はサイト A のメンバー 0 に対して TAKEOVER
HADR コマンドを発行します。
TAKEOVER HADR ON DB hadr_db
フェイルオーバー
DBA は、フェイルオーバーを実行する必要があります。 つまり、サイト A で予期しない障害が発生した場合は、サイト B のスタンバイ・データベースが、1 次データベースの役割をテークオーバーしなければなりません。 Db2 pureScale 環境での HADR の重要な違いは、フェイルオーバーを自動化するための IBM® Tivoli® System Automation for Multiplatforms (SA MP) の使用がサポートされていないことです ( Db2 pureScale クラスターでの高可用性を確保するために既に使用されています)。 いずれにしても、このシナリオでは、DBA は、障害に対するこの種の応答についての手動制御を必要とします。
- DBA は、サイト B のスタンバイ・データベースから強制テークオーバーを実行します。
スタンバイ・データベースは、無効化メッセージを送信して 1 次データベースをシャットダウンします。 ログ・シッピングおよびログ取り出しを停止した後、スタンバイ・データベースはそのログ・パスにあるすべてのログの再生を実行します。 最後に、スタンバイ・データベースが新しい 1 次データベースになります。TAKEOVER HADR ON DB hadr_db BY FORCE
- DBA は、新しい 1 次データベースに対して db2pd コマンドを実行して、このデータベースが 1 次の役割をテークオーバーしたことを確認します。
db2pd -hadr -db hadr_db
- DBA は、障害の原因に対処してサイト A を稼働中にした後に、古い 1 次データベースをスタンバイとして再統合しようと試みます。
START HADR ON DB hadr_db AS STANDBY
- DBA は、HADR_CONNECT_STATUS フィールドおよび HADR_STATE フィールドをチェックして、データベースが接続されていること、およびデータベースがピア状態またはリモート・キャッチアップ状態になっていることを確認することにより、サイト A がスタンバイになったことを検証します。
2 つのサイトでのデータベースのログ・ストリームは分岐しているため、データベースは切断済みとして示されます。 DBA が、古い 1 次のいずれかのメンバーの diag.log ファイルを調べると、そこに、サイト A のデータベースを新しい 1 次データベースと整合させることができないというメッセージが示されています。db2pd -hadr -db hadr_db
- DBA は、データベースをドロップし、それをサイト A の HADR スタンバイ・データベースとして再初期化する必要があります。
- データベースをドロップします。
DROP DATABASE DB hadr_db
- サイト B でデータベースのバックアップを取ります。
BACKUP DATABASE DB hadr_db ONLINE TO backup_dir
- バックアップ・イメージをサイト A にリストアします。
db2 RESTORE DB hadr_db FROM backup_dir
- サイト A のデータベースに、クラスター・レベルとメンバー・レベルの構成パラメーターを設定します。
db2 "UPDATE DB CFG FOR hadr_db USING HADR_TARGET_LIST {s0:4000|s1:4000|s2:4000|s3:4000} HADR_REMOTE_HOST {s0:4000|s1:4000|s2:4000|s3:4000} HADR_REMOTE_INST db2inst HADR_SYNCMODE async"
- メンバー 0 の場合:
db2 "UPDATE DB CFG FOR hadr_db MEMBER 0 USING HADR_LOCAL_HOST p0 HADR_LOCAL_SVC 4000"
- メンバー 1 の場合:
db2 "UPDATE DB CFG FOR hadr_db MEMBER 1 USING HADR_LOCAL_HOST p1 HADR_LOCAL_SVC 4000"
- メンバー 2 の場合:
db2 "UPDATE DB CFG FOR hadr_db MEMBER 2 USING HADR_LOCAL_HOST p2 HADR_LOCAL_SVC 4000"
- メンバー 3 の場合:
db2 "UPDATE DB CFG FOR hadr_db MEMBER 3 USING HADR_LOCAL_HOST p3 HADR_LOCAL_SVC 4000"
- メンバー 0 の場合:
- データベースをドロップします。
- DBA は、メンバー 0 を優先再生メンバーとして指定することを決定し、サイト A のメンバー 0 から START HADR コマンドを実行します。
db2 START HADR ON DB hadr_db AS STANDBY
- DBA は、サイト A がスタンバイになったことを検証するために、HADR_CONNECT_STATUS および HADR_STATE フィールドをチェックして、データベースが接続されていること、および 1 次にキャッチアップしていることを確認します。
db2pd -hadr -db hadr_db
- DBA は、前のセクションで説明した役割の切り替えを実行することで、元のセットアップに戻すことができます。