Comments
Description
Transcript
3. 可用性とスケーラビリティ
<第1.00版 2012年 9月> 3. 可用性とスケーラビリティ 本資料掲載事項は、ある特定の環境・使用状況においての正確性がIBMによって確認されていますが、すべての環境において同様の結果が得られる保証は ありません。これらの技術を自身の環境に適用する際には、自己の責任において十分な検証と確認を実施いただくことをお奨めいたします。 © Copyright IBM Japan Systems Engineering Co., Ltd. 2012 1 © 2012 IBM Corporation 内容 • HADR機能強化 • レプリケーション機能強化 • DB2 pureScale Feature機能強化 2 © 2012 IBM Corporation HADR機能強化 3 © 2012 IBM Corporation HADR機能強化内容 • マルチスタンバイ • ログ・スプーリング • HADR遅延再生 4 © 2012 IBM Corporation V10.1のHADR新機能の背景 • 迅速な引継ぎを実現できていた今までのHADRでも以下のような悩みがあった • 非同期モードを使っていても、スタンバイとの距離が遠い場合、トランザクションに影響がでる・・・ 災害対策向けの構成だと難しい・・・ • HADRを使っていると必ずスタンバイ側にはログが適用されてしまう、ユーザー側で反映させるタ イミングを制御したい・・・ • 可用性構成だけではなく、災害対策として複数拠点にスタンバイを作成したい、など ・超非同期モードでプライマリートラン ザクションへの影響を削減!! ・HADR遅延再生やログ・スプーリング 機能でスタンバイ側のReplayタイミン グを指定可能に!! ・Localにスタンバイ(可用性構成)、更 に異なる拠点にもスタンバイ(災対構 成)というマルチスタンバイ構成が可能 に!! 5 © 2012 IBM Corporation HADR(High Availability Disaster Recovery) • V8.2 プライマリーのみアクセス可能 • HADR新機能 • V9.5 • HADR PEER WINDOW提供 • TSAとの統合(db2haicu) Primary • V9.7 FixPack1 スタンバイも参照可能 • スタンバイ読み取り機能の提供 • V9.7 FixPack5 (V9.5FixPack8) Standby Primary Standby • 超非同期モードの追加 複数スタンバイ構成が可能 • V10.1 • 複数スタンバイのサポート • ログ・スプーリング • 遅延再生 Primary Standby 6 © 2012 IBM Corporation HADR同期モード HADR HADR send() receive() log writer log log file file Commit Succeeded 7 © 2012 IBM Corporation 参考)超非同期(SUPERASYNC)モード • 超非同期モードの特徴 • V9.5 FP8、V9.7FP5以降に追加された同期モード • 通常のシングルDBと同様に、トランザクションログをプライマリDBのディスクに書き込んだ 時点で、アプリケーションにCommitを返す • アプリケーションの応答時間へのHADRオーバーヘッドが最も尐ない同期モード • HADR用NW帯域が十分でない場合や、スタンバイ側の再生処理が遅延するような場合での 性能影響を軽減することが可能 • 考慮点 • データロストについて • プライマリDBの更新処理のみを保障するため、プライマリ側で障害が発生し、待機系に引き 継ぐ場合には、データロストが発生する可能性がある • HADRの状態について • 超非同期モードでは、HADRが、PEER状態または切断済みPEER状態にならないため、ログ ギャップを個別に監視する必要がある 8 © 2012 IBM Corporation HADR 複数スタンバイ プリンシパル・スタンバイ プライマリー 超非同期のみ 補助スタンバイ 補助スタンバイ • 全てのスタンバイDBは、プライマリーDBから直接接続される • プライマリーDBから補助スタンバイへ繋がるような数珠繋ぎは不可 • スタンバイ読み取り機能は全てのスタンバイDBでサポート • 引継ぎは、どのスタンバイDBからも実行可能 • 引継ぎ後、スタンバイDBのプライマリDBに関するDB構成パラメーター情報を 書き換え、新しいプライマリーDBを認識する • プリンシパル・スタンバイDBが不在の場合プライマリーのHADRを起動できない • by forceであれば起動可能 9 © 2012 IBM Corporation HADR 複数スタンバイ(メリット・制約) • 複数スタンバイ(最大3スタンバイDB)を構成可能 • HADRによって、ローカルサイトでの冗長化と、災対の両方を構築可能 • プライマリーの可用性をダウンさせずに、スタンバイにFix適用し、ローリングアップ グレードさせることが出来る • V9.7まではスタンバイのFix適用の際、一旦HADRを停止する必要があった • プリンシパル・スタンバイDB(PS)は、現行のスタンバイと同等 • プライマリーとPS間は全ての同期モードをサポート • TSAを使用して、自動引継ぎが可能 • プライマリーから補助スタンバイへの引継ぎは自動引継ぎ構成は未サポート • 最大2つの補助スタンバイDB(AS)をサポート • プライマリーとAS間は、超非同期モードのみサポート • プライマリーからの自動引継ぎはサポートしていない • PSと同様に、常に現在のプライマリDBからログが伝播される 10 © 2012 IBM Corporation 複数スタンバイの設定方法(ホストの指定) • 新しく提供された HADR_TARGET_LIST DB構成パラメーターを指定 • V10.1以前の1対1のHADRペアで起動したい場合には、設定不要 • スタンバイの台数が2台の場合はリストに2台分指定する • “|” を区切り文字にして、ホスト名またはIPアドレスを指定する 全てのリストは、現在のプライマ リーを指定している必要がある • 例) host1.ibm.com:4000|host2.ibm.com:4010 • HADR_TARGET_LIST は、プリンシパルと補助スタンバイの全てを指定 する • プライマリーDBで最初に指定されたホストが、プリンシパルスタンバイ となり、残りのDBは補助スタンバイになる • 全てのスタンバイが、リストにプライマリーを指定する必要がある プリンシパルスタンバイ HADR_TARGET_LIST = <myPrincSB:port>| <myAuxSB1:port>| <myAuxSB2:port> 補助スタンバイ HADR_TARGET_LIST = <myPrincSB:port>| <myAuxSB1:port>| <myAuxSB2:port> 補助スタンバイ プライマリー HADR_TARGET_LIST = <princSB:port>|<auxSB1:port>|<auxSB2:port> 11 HADR_TARGET_LIST = <myPrincSB:port>| <myAuxSB1:port>| <myAuxSB2:port> © 2012 IBM Corporation 複数スタンバイ の設定方法(同期モードの指定) • DB構成パラメーターHADR_SYNC_MODE は、プライマリーとプリンシパルスタンバイの 同期モードを指定する • HADR_SYNC_MODEが設定されていても、 スタンバイがプリンシパルか補助スタンバイ かを判断して、有効同期モード(effective sync mode )が設定される host2:11 (プリンシパルスタンバイ) HADR_TARGET_LIST = host1:10 HADR_SYNC_MODE = SYNC Effective sync mode = SYNC host3:12 (補助スタンバイ) HADR_TARGET_LIST = host4:13|host1:10 HADR_SYNC_MODE = SYNC Effective sync mode = SUPERASYNC host4:13 (補助スタンバイ) host1:10 (プライマリー) HADR_TARGET_LIST = host2:11|host3:12|host4:13 HADR_SYNC_MODE = SYNC 12 HADR_TARGET_LIST = host3:12|host1:10 HADR_SYNC_MODE = SYNC Effective sync mode = SUPERASYNC © 2012 IBM Corporation 4台構成のHADR環境の構築例 • host1,host2,host3,host4の4台でマルチスタンバイを構成する場合の手順 は以下のとおり • 手順1:host1でログの設定及びDBバックアップを取得する • 手順2:host1で取得したDBバックアップを各ノードに restore • 手順3:構成パラメーターの変更を各ノードにおいて実施 • 手順4:host2-4にてスタンバイとしてHADRを起動 • 手順5:host1にてプライマリーとしてHADRを起動 • 手順6:db2pdでロールを確認 13 © 2012 IBM Corporation HADR マルチスタンバイ構成図 Localサイト DRサイト DBサーバ Primary(host1:hadr_p) DBサーバ Aux1(host3:hadr_a1) HADR_TARGET_LIST =host2:hadr_s| host3:hadr_a1|host4:hadr_a2 HADR_TARGET_LIST= host4:hadr_a2| host1:hadr_p|host2:hadr_s Primaryになったら Aux2がPrincipal Primaryになったら 旧PrimaryがPrincipal 14 Primaryになったら Aux1がPrincipal DBサーバ Principal(host2:hadr_s) DBサーバ Aux2(host4:hadr_a2) HADR_TARGET_LIST= host1:hadr_p| host3:hadr_a1|host4:hadar_a2 HADR_TARGET_LIST= host3:hadr_a1| host1:hadr_p|host2:hadr_s © 2012 IBM Corporation 構築手順1:host1でログの設定及びDBバックアップを取得 する $ hostname host1 $ db2start 06/12/2012 13:44:01 0 0 SQL1063N DB2START の処理が正常に終了しました。 SQL1063N DB2START の処理が正常に終了しました。 $ db2 "update db cfg for sample using LOGARCHMETH1 DISK:/home/db2inst1/archive/" DB20000I UPDATE DATABASE CONFIGURATION コマンドが正常に完了しました。 $ db2 backup db sample to /QITWORK/bkup バックアップは成功しました。 このバックアップ・イメージのタイム・スタンプは 20120612135148 です。 $ ls -ltr total 315280 -rwxrwxrwx 1 db2inst1 db2test 161419264 Jun 12 13:51 SAMPLE.0.db2inst1.DBPART000.20120612135148.001 →各ノードにコピー 15 © 2012 IBM Corporation 構築手順2: host1で取得したDBバックアップを各ノードに restore $ hostname host2 $ db2 restore db sample from /QITWORK/bkup SQL2539W 警告! バックアップ・イメージ・データベースと同じ既存データベースをリストアします。デー タベース・ファイルは削除されます。 続けますか。 (y/n) y DB20000I RESTORE DATABASE コマンドが正常に完了しました。 →同様に、host3、host4で上記手順を実施 16 © 2012 IBM Corporation 構築手順3:構成パラメーターの変更を各ノードにおいて実施 Localサイト <host1> HADR_LOCAL_HOST: host1 DRサイト Primary <host3> HADR_LOCAL_HOST: host3 HADR_LOCAL_SVC: hadr_p HADR_REMOTE_HOST: host2 HADR_REMOTE_SVC: hadr_s SUPERASYNC Aux1 HADR_LOCAL_SVC: hadr_a1 HADR_REMOTE_HOST: host1 LOGINDEXBUILD : ON HADR_REMOTE_SVC: hadr_p HADR_REMOTE_INST: db2inst1 HADR_TARGET_LIST : host3:hadr_a1|host4:hadr_a2 | host2:hadr_s HADR_SYNCMODE:NEARSYNC LOGINDEXBUILD : ON HADR_REMOTE_INST: db2inst1 HADR_TARGET_LIST : host2:hadr_s|host3:hadr_a1|host4:hadr_a2 SYNC or NEARSYNC or ASYNC <host2> HADR_LOCAL_HOST: host2 Principal HADR_LOCAL_SVC: hadr_s HADR_REMOTE_HOST: host1 HADR_REMOTE_SVC: hadr_p HADR_REMOTE_INST: db2inst1 HADR_TARGET_LIST : host1:hadr_p|host3:hadr_a1|host4:hadr_a2 SUPERASYNC <host4> HADR_LOCAL_HOST: host4 Aux2 HADR_LOCAL_SVC: hadr_a2 HADR_REMOTE_HOST: host1 HADR_REMOTE_SVC: hadr_p HADR_REMOTE_INST: db2inst1 HADR_TARGET_LIST : host4:hadr_a2 | host3:hadr_a1| host2:hadr_s LOGINDEXBUILD : ON LOGINDEXBUILD : ON HADR_SYNCMODE:NEARSYNC 17 © 2012 IBM Corporation 構築手順3:構成パラメーターの変更を各ノードにおいて実施 • host1での変更例 $ hostname host1 $ db2 -tvf db2cfg_host1.txt update db cfg for sample using HADR_LOCAL_HOST host1 DB20000I UPDATE DATABASE CONFIGURATION コマンドが正常に完了しました。 update db cfg for sample using HADR_LOCAL_SVC hadr_p DB20000I UPDATE DATABASE CONFIGURATION コマンドが正常に完了しました。 update db cfg for sample using HADR_REMOTE_HOST host2 DB20000I UPDATE DATABASE CONFIGURATION コマンドが正常に完了しました。 HADR_TARGET_LIST以外は9.7以 前からのパラメーター update db cfg for sample using HADR_REMOTE_SVC hadr_s DB20000I UPDATE DATABASE CONFIGURATION コマンドが正常に完了しました。 update db cfg for sample using HADR_REMOTE_INST db2inst1 DB20000I UPDATE DATABASE CONFIGURATION コマンドが正常に完了しました。 update db cfg for sample using HADR_TARGET_LIST host2:hadr_s|host3:hadr_a1|host4:hadr_a2 DB20000I UPDATE DATABASE CONFIGURATION コマンドが正常に完了しました。 update db cfg for sample using LOGINDEXBUILD ON DB20000I UPDATE DATABASE CONFIGURATION コマンドが正常に完了しました。 →同様に、残りの3つのDBサーバーでパラメーターを設定 18 © 2012 IBM Corporation 構築手順4:host2-4にてスタンバイとしてHADRを起動 $ hostname host2 $ db2 start hadr on db sample as standby DB20000I START HADR ON DATABASE コマンドが正常に完了しました。 $ hostname host3 $ db2 start hadr on db sample as standby DB20000I START HADR ON DATABASE コマンドが正常に完了しました。 $ hostname host4 $ db2 start hadr on db sample as standby DB20000I START HADR ON DATABASE コマンドが正常に完了しました。 19 © 2012 IBM Corporation 構築手順5: host1にてプライマリーとしてHADRを起動 $ hostname host1 $ db2 start hadr on db sample as primary DB20000I START HADR ON DATABASE コマンドが正常に完了しました。 以上で、4台構成のHADRマルチスタンバイ構成が完成 20 © 2012 IBM Corporation 構築手順6: db2pdでロールを確認 $ hostname HADR_ROLE = PRIMARY host1 HADR_SYNCMODE = SUPERASYNC $ db2pd –hadr –db sample STANDBY_ID = 2 HADR_STATE = REMOTE_CATCHUP (以下抜粋して掲載。db2pdの詳細については後述。) PRIMARY_MEMBER_HOST = host1 STANDBY_MEMBER_HOST = host3 Database Member 0 -- Database SAMPLE -- Active HADR_CONNECT_STATUS = CONNECTED -- Up 0 days 01:23:49 -- Date 2012-06-13 15:10:35 HADR_ROLE = PRIMARY HADR_ROLE = PRIMARY HADR_SYNCMODE = NEARSYNC STANDBY_ID = 1 HADR_SYNCMODE = SUPERASYNC STANDBY_ID = 3 HADR_STATE = REMOTE_CATCHUP HADR_STATE = PEER PRIMARY_MEMBER_HOST = host1 PRIMARY_MEMBER_HOST = host1 STANDBY_MEMBER_HOST = host4 STANDBY_MEMBER_HOST = host2 HADR_CONNECT_STATUS = CONNECTED HADR_CONNECT_STATUS = CONNECTED ・・・確認ポイント 21 © 2012 IBM Corporation HADR マルチスタンバイ4台構成による引継ぎ例 • 引継ぎ例1: Primary→Aux1へ正常テークオーバー • Primary→Aux1へ正常テークオーバー • 引継ぎ後はAux1のターゲットリストの1番目に設定しているAux2が Principalとして稼動 • 引継ぎ例2:Primary→Principalへ強制テークオーバー • Primaryのインスタンスがダウン • Principalへ強制引継ぎ • 引継ぎ後、HADRは3台構成で稼動 22 © 2012 IBM Corporation 引継ぎ例1:Primary→Aux1へ正常テークオーバー • Primary→Aux1へ正常テークオーバーする手順は以下の とおり • 手順1:host3(Aux1)でtakeover hadrコマンドを実施 • 手順2:db2pdでロールが変更されていることを確認 23 © 2012 IBM Corporation 引継ぎ例1 イメージ図 Localサイト DBサーバ Primary(host1:hadr_p) HADR_TARGET_LIST =host2:hadr_s| host3:hadr_a1|host4:hadr_a2 DRサイト ① Primary から Aux1に TKO DBサーバ Aux1(host3:hadr_a1) HADR_TARGET_LIST= host4:hadr_a2| host1:hadr_p|host2:hadr_s ②Aux1として 稼動 ②Principal として稼動 ②Aux2として 稼動 24 DBサーバ Principal(host2:hadr_s) DBサーバ Aux2(host4:hadr_a2) HADR_TARGET_LIST= host1:hadr_p| host3:hadr_a1|host4:hadar_a2 HADR_TARGET_LIST= host3:hadr_a1| host1:hadr_p|host2:hadr_s © 2012 IBM Corporation 手順1:host3でtakeover hadrコマンドを実施 $ hostname host3 $ db2 takeover hadr on db sample DB20000I TAKEOVER HADR ON DATABASE コマンドが正常に完了しました。 25 © 2012 IBM Corporation 手順2: db2pdでロールが変更されていることを確認 $ hostname host3 HADR_ROLE = PRIMARY HADR_SYNCMODE = SUPERASYNC $ db2pd –hadr –db sample STANDBY_ID = 2 (以下抜粋して掲載。db2pdの詳細については後述。) HADR_STATE = REMOTE_CATCHUP Database Member 0 -- Database SAMPLE -- Active – Up 0 days 04:12:28 – Date 2012-06-13 16:02:33 PRIMARY_MEMBER_HOST = host3 STANDBY_MEMBER_HOST = host1 HADR_CONNECT_STATUS = CONNECTED HADR_ROLE = PRIMARY HADR_SYNCMODE = NEARSYNC STANDBY_ID = 1 HADR_STATE = PEER PRIMARY_MEMBER_HOST = host3 STANDBY_MEMBER_HOST = host4 HADR_CONNECT_STATUS = CONNECTED HADR_ROLE = PRIMARY HADR_SYNCMODE = SUPERASYNC STANDBY_ID = 3 HADR_STATE = REMOTE_CATCHUP PRIMARY_MEMBER_HOST = host3 STANDBY_MEMBER_HOST = host2 HADR_CONNECT_STATUS = CONNECTED 26 © 2012 IBM Corporation 引継ぎ例2:Primary→Principalへ強制テークオーバー • Primary→Principalへ強制テークオーバーする手順は以 下のとおり • 手順1:host1でdb2syscをkill(インスタンス障害) • 手順2:host2でtakeover hadr by forceコマンドを実施 • 手順3:db2pdでロールが変更されていることを確認 27 © 2012 IBM Corporation 引継ぎ例2 Localサイト DRサイト DBサーバ Primary(host1:hadr_p) DBサーバ Aux1(host3:hadr_a1) HADR_TARGET_LIST =host2:hadr_s| host3:hadr_a1|host4:hadr_a2 HADR_TARGET_LIST= host4:hadr_a2| host1:hadr_p|host2:hadr_s ①インスタン スダウン ③Aux1 として稼動 ②Primary から Principalに 強制TKO ③Aux2 として稼動 28 DBサーバ Principal(host2:hadr_s) DBサーバ Aux2(host4:hadr_a2) HADR_TARGET_LIST= host1:hadr_p| host3:hadr_a1|host4:hadar_a2 HADR_TARGET_LIST= host3:hadr_a1| host1:hadr_p|host2:hadr_s © 2012 IBM Corporation 手順1:host1でdb2syscをkill $ hostname host1 $ ps -ef | grep $ ps -ef | grep db2sysc db2inst1 13107338 16056502 0 10:53:34 - 0:09 db2sysc 0 db2inst1 16777396 16515236 0 13:06:17 pts/0 0:00 grep db2sysc $ kill -9 13107338 29 © 2012 IBM Corporation 手順2:host2でtakeover hadr by forceコマンドを実施 $ hostname host2 $ db2 takeover hadr on db sample by force DB20000I TAKEOVER HADR ON DATABASE コマンドが正常に完了しました。 30 © 2012 IBM Corporation 手順3: db2pdでロールが変更されていることを確認 $ hostname host2 HADR_ROLE = PRIMARY HADR_SYNCMODE = SUPERASYNC $ db2pd –hadr –db sample STANDBY_ID = 2 (以下抜粋して掲載。db2pdの詳細については後述。) HADR_STATE = REMOTE_CATCHUP Database Member 0 -- Database SAMPLE -- Active – PRIMARY_MEMBER_HOST = host2 Up 0 days 15:44:35 -- Date 2012-06-22 10:48:00 STANDBY_MEMBER_HOST = host3 HADR_CONNECT_STATUS = CONNECTED HADR_ROLE = PRIMARY HADR_SYNCMODE = NEARSYNC STANDBY_ID = 1 HADR_STATE = DISCONNECTED PRIMARY_MEMBER_HOST = host2 HADR_ROLE = PRIMARY HADR_SYNCMODE = SUPERASYNC STANDBY_ID = 3 HADR_STATE = REMOTE_CATCHUP STANDBY_MEMBER_HOST = host1 PRIMARY_MEMBER_HOST = host2 HADR_CONNECT_STATUS = DISCONNECTED STANDBY_MEMBER_HOST = host4 HADR_CONNECT_STATUS = CONNECTED 31 © 2012 IBM Corporation V10.1 HADRのモニター •DB2 V10.1では、HADRに関するモニターが強化されている •モニター方法は以下の2種類提供されている(取得できる情報は同じ) db2pd -hadr • V9.7よりも出力される情報が増えている • DBへの接続を必要としないため、プライマリ/主スタンバイ/補助スタンバイの全 てのサーバーで取得可能 • ただし、プライマリ上でしか、他のスタンバイの情報を取得することができない MON_GET_HADR表関数 • V10.1からの新規表関数 • DBへの接続を必要とし、select文で取得できるため、出力の絞込みができる • 読み取り専用スタンバイを使用しない場合は、スタンバイ側では取得できない 32 © 2012 IBM Corporation db2pd –hadr Database Member 0 -- Database SAMPLE -- Active -- Up 0 days 01:23:49 -- Date 201 2-06-13 15:10:35 • db2pd –hadr –db <dbname> Primary - PStandby • 取得コマンド・オプションはV9.7までと同様 • 出力形式と内容が大幅に変更された • プライマリー • 全スタンバイとプライマリの状況が表示される Primary – AStandby1 • スタンバイ(プリンシパル・補助) • db2pdを実行したスタンバイとプライマリとの状況のみ 出力される Database Member 0 -- Database SAMPLE -- Active Standby -- Up 0 days 03:20:45 -Date 2012-06-13 15:10:36 HADR_ROLE = STANDBY REPLAY_TYPE = PHYSICAL HADR_SYNCMODE = NEARSYNC STANDBY_ID = 0 LOG_STREAM_ID = 0 HADR_STATE = PEER PRIMARY_MEMBER_HOST = host1 PRIMARY_INSTANCE = db2inst1 PRIMARY_MEMBER = 0 STANDBY_MEMBER_HOST = host2 STANDBY_INSTANCE = db2inst1 STANDBY_MEMBER = 0 HADR_CONNECT_STATUS = CONNECTED HADR_CONNECT_STATUS_TIME = 2012-06-13 13:46:49.048533 (1339562809) HEARTBEAT_INTERVAL(seconds) = 2 HADR_TIMEOUT(seconds) = 10 TIME_SINCE_LAST_RECV(seconds) = 2 PEER_WAIT_LIMIT(seconds) = 0 LOG_HADR_WAIT_CUR(seconds) = 0.000 LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.000685 LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.010 LOG_HADR_WAIT_COUNT = 14 SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 131400 SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 65700 PRIMARY_LOG_FILE,PAGE,POS = S0000005.LOG, 13, 61194775 STANDBY_LOG_FILE,PAGE,POS = S0000005.LOG, 13, 61194775 HADR_LOG_GAP(bytes) = 0 STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000005.LOG, 13, 61194775 STANDBY_RECV_REPLAY_GAP(bytes) = 0 PRIMARY_LOG_TIME = 2012-06-13 14:16:57.000000 (1339564617) STANDBY_LOG_TIME = 2012-06-13 14:16:57.000000 (1339564617) STANDBY_REPLAY_LOG_TIME = 2012-06-13 14:16:57.000000 (1339564617) STANDBY_RECV_BUF_SIZE(pages) = 512 STANDBY_RECV_BUF_PERCENT = 0 STANDBY_SPOOL_LIMIT(pages) = 0 PEER_WINDOW(seconds) = 0 READS_ON_STANDBY_ENABLED = Y STANDBY_REPLAY_ONLY_WINDOW_ACTIVE = N (スタンバイ・ノードでdb2pd実行例) 33 Primary – AStandby2 HADR_ROLE = PRIMARY REPLAY_TYPE = PHYSICAL HADR_SYNCMODE = NEARSYNC STANDBY_ID = 1 LOG_STREAM_ID = 0 HADR_STATE = PEER PRIMARY_MEMBER_HOST = host1 PRIMARY_INSTANCE = db2inst1 PRIMARY_MEMBER = 0 STANDBY_MEMBER_HOST = host2 STANDBY_INSTANCE = db2inst1 STANDBY_MEMBER = 0 HADR_CONNECT_STATUS = CONNECTED HADR_CONNECT_STATUS_TIME = 2012-06-13 13:46:49.047726 (1339562809) HEARTBEAT_INTERVAL(seconds) = 2 HADR_TIMEOUT(seconds) = 10 TIME_SINCE_LAST_RECV(seconds) = 2 PEER_WAIT_LIMIT(seconds) = 0 LOG_HADR_WAIT_CUR(seconds) = 0.000 LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.000685 LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.010 LOG_HADR_WAIT_COUNT = 14 SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 131400 SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 65700 PRIMARY_LOG_FILE,PAGE,POS = S0000005.LOG, 13, 61194775 STANDBY_LOG_FILE,PAGE,POS = S0000005.LOG, 13, 61194775 HADR_LOG_GAP(bytes) = 0 STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000005.LOG, 13, 61194775 STANDBY_RECV_REPLAY_GAP(bytes) = 0 PRIMARY_LOG_TIME = 2012-06-13 14:16:57.000000 (1339564617) STANDBY_LOG_TIME = 2012-06-13 14:16:57.000000 (1339564617) STANDBY_REPLAY_LOG_TIME = 2012-06-13 14:16:57.000000 (1339564617) STANDBY_RECV_BUF_SIZE(pages) = 512 STANDBY_RECV_BUF_PERCENT = 0 STANDBY_SPOOL_LIMIT(pages) = 0 PEER_WINDOW(seconds) = 0 READS_ON_STANDBY_ENABLED = Y STANDBY_REPLAY_ONLY_WINDOW_ACTIVE = N HADR_ROLE = PRIMARY REPLAY_TYPE = PHYSICAL HADR_SYNCMODE = SUPERASYNC STANDBY_ID = 2 LOG_STREAM_ID = 0 HADR_STATE = REMOTE_CATCHUP PRIMARY_MEMBER_HOST = host1 PRIMARY_INSTANCE = db2inst1 PRIMARY_MEMBER = 0 STANDBY_MEMBER_HOST = host3 STANDBY_INSTANCE = db2inst1 STANDBY_MEMBER = 0 HADR_CONNECT_STATUS = CONNECTED HADR_CONNECT_STATUS_TIME = 2012-06-13 13:46:47.847248 (1339562807) HEARTBEAT_INTERVAL(seconds) = 2 HADR_TIMEOUT(seconds) = 10 TIME_SINCE_LAST_RECV(seconds) = 1 PEER_WAIT_LIMIT(seconds) = 0 LOG_HADR_WAIT_CUR(seconds) = 0.000 LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.000685 LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.010 LOG_HADR_WAIT_COUNT = 14 SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 131400 SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 65700 PRIMARY_LOG_FILE,PAGE,POS = S0000005.LOG, 13, 61194775 STANDBY_LOG_FILE,PAGE,POS = S0000005.LOG, 13, 61194775 HADR_LOG_GAP(bytes) = 0 STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000005.LOG, 13, 61194775 STANDBY_RECV_REPLAY_GAP(bytes) = 0 PRIMARY_LOG_TIME = 2012-06-13 14:16:57.000000 (1339564617) STANDBY_LOG_TIME = 2012-06-13 14:16:57.000000 (1339564617) STANDBY_REPLAY_LOG_TIME = 2012-06-13 14:16:57.000000 (1339564617) STANDBY_RECV_BUF_SIZE(pages) = 512 STANDBY_RECV_BUF_PERCENT = 0 STANDBY_SPOOL_LIMIT(pages) = 0 PEER_WINDOW(seconds) = 0 READS_ON_STANDBY_ENABLED = Y STANDBY_REPLAY_ONLY_WINDOW_ACTIVE = N HADR_ROLE = PRIMARY REPLAY_TYPE = PHYSICAL HADR_SYNCMODE = SUPERASYNC STANDBY_ID = 3 LOG_STREAM_ID = 0 HADR_STATE = REMOTE_CATCHUP PRIMARY_MEMBER_HOST = host1 PRIMARY_INSTANCE = db2inst1 PRIMARY_MEMBER = 0 STANDBY_MEMBER_HOST = host4 STANDBY_INSTANCE = db2inst1 STANDBY_MEMBER = 0 HADR_CONNECT_STATUS = CONNECTED HADR_CONNECT_STATUS_TIME = 2012-06-13 13:47:23.065051 (1339562843) HEARTBEAT_INTERVAL(seconds) = 2 HADR_TIMEOUT(seconds) = 10 TIME_SINCE_LAST_RECV(seconds) = 2 PEER_WAIT_LIMIT(seconds) = 0 LOG_HADR_WAIT_CUR(seconds) = 0.000 LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.000685 LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.010 LOG_HADR_WAIT_COUNT = 14 SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 131400 SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 65700 PRIMARY_LOG_FILE,PAGE,POS = S0000005.LOG, 13, 61194775 STANDBY_LOG_FILE,PAGE,POS = S0000005.LOG, 13, 61194775 HADR_LOG_GAP(bytes) = 0 STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000005.LOG, 13, 61194775 STANDBY_RECV_REPLAY_GAP(bytes) = 0 PRIMARY_LOG_TIME = 2012-06-13 14:16:57.000000 (1339564617) STANDBY_LOG_TIME = 2012-06-13 14:16:57.000000 (1339564617) STANDBY_REPLAY_LOG_TIME = 2012-06-13 14:16:57.000000 (1339564617) STANDBY_RECV_BUF_SIZE(pages) = 512 STANDBY_RECV_BUF_PERCENT = 0 STANDBY_SPOOL_LIMIT(pages) = 0 PEER_WINDOW(seconds) = 0 READS_ON_STANDBY_ENABLED = Y STANDBY_REPLAY_ONLY_WINDOW_ACTIVE = N (プライマリー・ノード上でのdb2pd実行例) © 2012 IBM Corporation (参考)V9.7以前のdb2pd –hadr出力例 34 © 2012 IBM Corporation DB2 V10.1でのdb2pd –hadr(出力例1/2) (補助スタンバイで取得したdb2pdの出力例) 補助スタンバイなので、モード はSUPERASYNC SUPERASYNCモードの 場合ステータスは常に REMOTE_CATCHUP 35 © 2012 IBM Corporation DB2 V10.1でのdb2pd –hadr(出力例2/2) • スタンバイ側でのログ受信やログ適用に関する詳細な情報が得られ るようになった • (例) • STANDBY_REPLAY_LOG_FILE,PAGE,POS(スタンバイ側での適用ログの位置情報) • STANDBY_RECV_REPLAY_GAP(スタンバイ側で受信したログと適用したログの差分情 報) • PRIMARY_LOG_TIME(プライマリ側での最新のトランザクションタイムスタンプ) • STANDBY_LOG_TIME(スタンバイ側で受信した最新のトランザクションタイムスタンプ) • STANDBY_REPLAY_LOG_TIME(スタンバイ側で適用された最新のトランザクションタイ ムスタンプ) (補助スタンバイで取得したdb2pdの出力例:抜粋) 36 © 2012 IBM Corporation MON_GET_HADR表関数の出力例 SELECT HADR_ROLE, STANDBY_ID, HADR_SYNCMODE,HADR_STATE, PRIMARY_LOG_TIME,STANDBY_LOG_TIME,STANDBY_REPLAY_LOG_TIME,STANDBY_REPLAY_DELAY,STANDBY_RECV_BUF_PER CENT,varchar(PRIMARY_MEMBER_HOST ,20) as PRIMARY_MEMBER_HOST, varchar(STANDBY_MEMBER_HOST ,20) as STANDBY_MEMBER_HOST from table(MON_GET_HADR(NULL)) HADR_ROLE STANDBY_ID HADR_SYNCMODE HADR_STATE PRIMARY_LOG_TIME STANDBY_LOG_TIME STANDBY_REPLAY_LOG_TIME STANDBY_REPLAY_DELAY STANDBY_RECV_BUF_PERCENT PRIMARY_MEMBER_HOST STANDBY_MEMBER_HOST ------------- ---------- ------------- ----------------------- -------------------------- -------------------------- -------------------------- -------------------- ----------------------- -------------------- -------------------PRIMARY 15.31.57.000000 1 NEARSYNC PEER 2012-06-13-15.31.57.000000 2012-06-13-15.31.57.000000 2012-06-130 +0.00000000000000E+000 host2 host1 PRIMARY 15.31.57.000000 2 SUPERASYNC REMOTE_CATCHUP 0 +0.00000000000000E+000 host2 2012-06-13-15.31.57.000000 2012-06-13-15.31.57.000000 2012-06-13host3 PRIMARY 15.31.57.000000 3 SUPERASYNC REMOTE_CATCHUP 0 +0.00000000000000E+000 host2 2012-06-13-15.31.57.000000 2012-06-13-15.31.57.000000 2012-06-13host4 3 レコードが選択されました。 37 © 2012 IBM Corporation ログ・スプーリング • ログ・スプーリングの機能を有効にすると、プライマリから転送されたログをスタンバ イ側に蓄積する • スタンバイにおけるReplayが遅延し、ログ受信バッファーが満杯になった場合にログをディスクに 蓄積する • HADR_SPOOL_LIMIT DB構成パラメーターにログ受信バッファーが満杯になった場合に、ディ スクに書き込まれる上限を指定(4Kページ単位) • スタンバイのログのReplay状況とプライマリからのログ受信状況を切り離すことが 可能 • どの同期モードでも使用可能 Primary Standby 超非同期 スタンバイで ログをスプール 38 38 © 2012 IBM Corporation ログ・スプーリングと超非同期のどちらを選択する? • ログ・スプーリング • スタンバイのReplay状況に関わらずログを受信可能 • プライマリー側で処理が一時的に高負荷状態になりスタンバイ側の処理が遅延 するときの影響を軽減可能 • どの同期モードでも選択可能 • 超非同期 • プライマリへの影響を全同期モードの中で最も軽微にするモード • N/Wが遅延している場合に特に有効 • 両方を使用することも可能 • N/Wとスタンバイサーバーの両方のパフォーマンスが悪い場合 • HADR遅延再生を使用する場合 39 39 © 2012 IBM Corporation HADR遅延再生 • HADR_REPLAY_DELAY DB構成パラメーターが提供された • Log_spoolingが前提 • スタンバイにログが反映されるまでの時間を指定する • 0の値はtime delayが行われないことを意味する(デフォルトの設定) • 超非同期を使用したスタンバイのみ有効 • マルチスタンバイの場合複数スタンバイ毎に遅延時間を変えることも可能 • 論理障害からの回復に役立つ • 重要な業務データを削除してしまったような場合に、回復可能になる • 指定した期間以内(スタンバイに誤操作が伝播される前)にエラーを発見し、HADRを停止し、ス タンバイDBを、障害発生前の時点までPoint in timeでRollforwardし回復させることが可能 Standby Primary 超非同期 スタンバイで ログをスプール 40 © 2012 IBM Corporation HADR機能拡張のまとめ • HADRで複数スタンバイをサポート • ローカルHA構成と、災対構成の両方をHADRで実現可能 • 超非同期モードで補助スタンバイと連携することでトランザクションへの影響を軽 微にする • Log Spooling機能の提供 • スタンバイ側のReplay処理が遅延している場合の影響を軽減することが出 来る • トランザクションが急激に増えた場合などに有効 • HADR遅延再生 • データ誤削除などをスタンバイに指定期間、伝播させないことが可能 • 論理障害発生時の復旧時間が早くなるケースがある 41 © 2012 IBM Corporation レプリケーション機能強化 42 © 2012 IBM Corporation 拡大するレプリケーションの活用法 情報系システム構築 DB2マイグレーションのデータ移 行 43 異なる業務間でのデータ連携 災対システム © 2012 IBM Corporation 内容 • IBM InfoSphere Data Replication V10.1.3 新機能 • DDLサポート 製品パッケージの名前 • Qキャプチャー停止ポイントの制御の強化 が変わりました。 • トリガーによるコンフリクト抑止 • LOBデータに関するパフォーマンス向上 • 異なるバージョン間の組合せ • Qレプリケーション • SQLレプリケーション • 制約事項 44 © 2012 IBM Corporation DDLサポートとは? • V10よりDDLをログに書き出しQキャプチャーがDDLを送信する • CREATE TABLE / DROP TABLE • ALTER TABLE (ADD COLUMN / ALTER COLUMN SET DATA TYPE) • DDL ステートメントのロギング • デフォルトでは設定は NOになっている (LOG_DDL_STMTS) = YES が必要 $ db2 get db cfg|grep DDL DDL ステートメントのロギング (LOG_DDL_STMTS) = NO DB2 ログ DB CREATE DROP T1 ALTER Log Read API SQLCapture QCapture サポート されませ ん 45 © 2012 IBM Corporation Qレプリケーション定義の自動化 例えば、T000、T001、T002、T003・・・ T499のように500表をサイトBにレプリ ケーションしたい場合、 サイトA 500表、それぞれ定義が必要になる。 基本的には定義→ACTIVATEを行う。 サイトB T○○○ T○○○ T○○○ T○○○ T○○○ T○○○ T○○○ T○○○ T○○○ T○○○ ※ACTIVATEは、その表のレプリケー ションをONにする操作。 V9.7まで ① サイトAにT500を追加(CREATE TABLE) V10.1新機能 ① 「T」から始まる表名は全てレプリケーションされる ように事前に設定 ② サイトAにT500を追加(CREATE TABLE) ② T500をレプリケーション定義(自動でサイトB にT500をCREATEすることは可能) ③ T500をACTIVATE ④ サイトAにT501を追加(CREATE TABLE) (自動でQレプリケーション定義。その後T500に更 新があると、自動でACTIVATE) (以降同様) (以降同様) 46 (自動でQレプリケーション定義。その後T500に更 新があると、自動でACTIVATE) ③ サイトAにT501を追加(CREATE TABLE) © 2012 IBM Corporation DDLをレプリケーションするための設定 • CREATE TABLE / DROP TABLEの場合 • スキーマ・レベルのサブスクリプションを作成しておく • CREATE SCHEMASUBコマンド • ASNCLPのみサポート(RCは未サポートです) • スキーマサブに登録された表がCREATEされると、サブスクリプション・プ ロファイルをもとにレプリケーション・ソース表として登録される • ALTER TABLEの場合 • ADD COLUMNは2つの方法があります • ADDCOLシグナルを使用 (V8からの機能) • REPL_ADDCOL設定値 (V10新機能) • 上記のいずれかをしない場合は列追加はターゲットへは反映されません。 • ALTER COLUMN SET DATA TYPE • 必要な設定はありません。V10以上でソース表が変更されるとターゲットへレ プリケーションされます。 • ただし、ターゲットがV10より低いバージョンの場合はQサブスクリプションが Diactivateされます • ターゲット表のREORGはQアプライが実施します 47 © 2012 IBM Corporation 参考) DDLをレプリケーションするためには (内部のしくみ) • キャプチャーは、変更されたソース表の履歴情報を常に保持しているため、さまざまな バージョンのソース表のログを読むことが出来ます。 • このために、新しい制御表を使っています • • • • IBMQREP_TABVERSION表 IBMQREP_COLVERSION表 Qサブスクリプションが活動化された後、ソース表が変更されるたびに上記の表に 行が挿入されます これらの制御表はSQLレプリケーションでも使用されています。 << ソース表の定義変更時の注意点!! >> • • TABVERSION、COLVERSION表には表名ではなくTABLEID(SYSIBM.SYSTABLESのオブジェク トID)が格納されています。TABLEIDはDROP/CREATEにより変更される可能性があるため、定義 変更をDROP/CREATEで実施している場合は、始めにCAPSTOPでQサブスクリプションを非活動 化し、定義変更後、CAPSTARTで活動化して下さい。活動化された時点で TABVERSION/COLVERSINOの既存の行は削除され、新しい情報が挿入されます。 上記は、SQLレプリケーションにおいても同じです。DROP/CREATEの前にCAPSTOPにより変更 収集を停止し、定義変更完了後にフルリフレッシュ、または手動フルリフレッシュにてレプリケーション を開始してください。 • • また、定義変更に関してテクニカルフラッシュが発行されています。(z/OS環境における問題) 「【障害情報】DB2 for z/OS V9 または V10をソースとして、Qレプリケーション、またはSQLレプリ ケーションを利用する場合は、いくつかの条件においてIIDR (旧IRS) V10 APAR PM63905以上が 必須となります」 • http://w3-06.ibm.com/jp/domino02/ise/ISEINFO.NSF/99a7d1be5103176a492563ef002002e5/51e9b533fc493ede49257a4500255f86?OpenDocument 48 © 2012 IBM Corporation 参考:サブスクリプションプロファイルとスキーマサブのサンプル CREATE SUBSCRIPTION OPTIONS unioptions1 SUBTYPE U HAS LOAD PHASE I CAPTURE_LOAD W SPILL_MODELQ "IBMQREP.SPILL.MODELQ" SUPPRESS DELETES N IBMQREP_SUBS_PROF REPLICATE ADD COLUMN Y IGNORE TRIGGERS CASCADE DELETES SET NULL CONFLICT ACTION Q ERROR ACTION S OWNER LIKE / NAME LIKE で指定する OKSQLSTATES sqlstate さらに、EXCLUDE OWNER /EXCLUDE NAME で特 定の表を除外することもできます。 LOAD TYPE 5 EXIST DATA APPEND; CREATE SCHEMASUB schemasub_uni1 SUBTYPE U REPLQMAP qmap1 FOR TABLES NAME LIKE "A%“ IBMQREP_SCHEMASUBS OPTIONS unioptions1; ※注 ASNCLPのみのサポートです。レプリケーション・センターはサポートされていません。 49 © 2012 IBM Corporation 参考:Qキャプチャー起動時のログ 2012-04-20-16.15.47.953000 <subMgr::handleSTARTSCHEMASUB> ASN7247I "Q Capture" : "ASN" : "WorkerThread" : Q キャプチャー・プログラムは、スキーマ・レベルの Q サブスクリ プション "SCSUB1" とそれに対応するプロファイルを正常にロードしました。 Q サブスクリプ ションはレプリケーション・キュー・マップ "QMAP1" を使用し、Q サブスクリプションが "A%" オブジェクトのスキーマ "%" で自動的に作成されるように指定します。 2012-04-20-16.15.48.609000 <subMgr:initAllSubs> ASN7000I "Q Capture" : "ASN" : "WorkerThread" : "1" サブスクリプションがアクティブです。 "0" サブスクリプションは非ア クティブです。新しい "0" サブスクリプションは、正常に活動化されました。新しい "0" サブ スクリプションは、活動化できず非アクティブになっています。 2012-04-20-16.15.48.625000 <asnqwk> ASN0572I "Q Capture" : "ASN" : "WorkerThread" : "mqpub 10.1.0 (Level s120403, PTF NT32101), DB2 v10.1.0" プログラムは正常に初期化されま した。 50 © 2012 IBM Corporation 参考: DDL自動検知確認 CREATE TABLE A1 (C1 INT NOT NULL PRIMARY KEY, C2 INT) DATA CAPTURE CHANGES DATA CAPTURE CHANGES属性をつけることを忘れない でください。 DATA CAPTURE CHANGES属性を忘れると、CREATE TABLEはレプリケーションされません。 2012-04-20-16.36.57.375000 <subMgr::publishDDL> ASN7210I "Q Capture" : "ASN" : "WorkerThread" : スキーマ・レベルの Q サブスクリプション "SCSUB1" に対応する Q サブス クリプション "A10001" が、送信キュー "Q1" およびレプリケーション・キュー・マップ "QMAP1" を使用するソース表 "AA327361.A1" に、正常に作成されました。 51 © 2012 IBM Corporation 参考:メッセージの確認 **** Message number: 4 **** Message size: 1128 qMsgHeader.msgFamily: QREP qMsgHeader.msgtype: ASNMQ_CREATESUB_MSG qMsgHeader.msgVersion: ASNMQ_VERSION700 subName: A10001 subId: 2 srcDbName: QSRC1 srcOwner: AA327361 srcName: A1 targetType: 1 subType: U conflictRule: K conflictAction: F errorAction: S subOkSqlStates: subGroup: initiatorNode: 0 sourceNode: 0 targetNode: 0 hasLoadPhase: I loadType: 0 modelQ: IBMQREP.SPILL.MODELQ schemaSubName: SCSUB1 originated from: CREATE TABLE DDL 52 **** Message number: 5 **** Message size: 1270 qMsgHeader.msgFamily: QREP qMsgHeader.msgtype: ASNMQ_DDL_MSG qMsgHeader.msgVersion: ASNMQ_VERSION700 qMsgHeader.msgDDLType: ASNMQ_DDL_GENERIC Default Schema: 'AA327361' Owner Name: 'AA327361' Function path: '"SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","AA327361"' subId: 2 objectType: 0 objectSchema: AA327361 objectName: A1 SQL codepage: 1208 SQL Text Length: 54 SQL Text: "create table a1 (c1 int not null primary key, c2 int) " DDL © 2012 IBM Corporation 参考:最初のDMLが発行されるとQサブスクリプションがACTIVATEされる ソース表へ更新が発生すると、Qサブスクリプションは活動かされます。 例)INSERT INTO A1 VALUES(1,1) Qキャプチャー実行ログ 2012-04-20-16.47.02.531000 ASN7010I "Q Capture" : "ASN" : "WorkerThread" : プログラムは、 ソース表 "AA327361.A1" の発行または Q サブスクリプション "A10001" (送信キュー "Q1"、発行また はレプリケーション・キュー・マップ "QMAP1") を正常に活動化しました。 Qアプライ実行ログ 2012-04-20-16.47.02.562000 ASN8999D Browser for queue 'Q1' received a 'ASNMQ_SUBSCHEMA_MSG' message. 2012-04-20-16.47.02.718000 ASN7606I "Q Apply" : "ASN" : "BR00000" : Q サブスクリプション "A10001" (受信キュー "Q1"、レプリケーション・キュー・マップ "QMAP1") がアクティブです。 53 © 2012 IBM Corporation Qキャプチャー停止ポイントの制御の強化 • ターゲットDBで静止点を確保するための機能 • ある時点までの変更が全てターゲットで適用されたこと (または伝送キューから除去されたこと) をQキャプチャー に知らせ停止することができるようになった STOP SIGNAL Q Capture STOP SIGNALを処理 Q Apply 最後までデータを反映したら教えてください データを全て反映 全て反映しました Qキャプチャー停止 54 © 2012 IBM Corporation Qキャプチャー停止ポイントの制御の強化 • Qキャプチャー・コマンド(asnqccmd)およびSIGNALで本機能を提供 • DATA_APPLIED ・・・ データがターゲットに反映されれば • DATA_SENT ・・・ データが伝送キューから除去されれば >>-asnqccmd--capture_server=db_name----+-----------------------+-> '-capture_schema=schema-' asnqccmdコマン ドのsyntax >+-stopq=+-qname-+-----+--------------------------------------+--> | '--ALL--' | | | | | '-captureupto=-+-'timestamp string'-+--' '-stop-------------' +-current_timestamp--+ '-eol----------------' >----------------------+-------------------------+--------------->< | | '-after=+-data_applied-+--' '-data_sent—---' INSERT INTO ASN.IBMQREP_SIGNAL( SIGNALの例 SIGNAL_TIME, SIGNAL_TYPE, SIGNAL_SUBTYPE, SIGNAL_INPUT_IN, SIGNAL_STATE) VALUES( CURRENT TIMESTAMP, 'CMD', 'STOPQ', 'Q1;CURRENT_TIMESTAMP;DATA_APPLIED', 'P') 55 © 2012 IBM Corporation 参考)実行ログのサンプル • 前ページのSIGNALを実行した例 SIGNAL実行時のQキャプチャーの実行ログ 2012-04-06-12.21.31.781000 ASN7178I "Q Capture" : "ASN" : "WorkerThread" : すべての送信キューが非ア クティブ (I) 状態にあります。STARTQ コマンドを使用して、非アクティブなキュー上でのレプリケーションま たはパブリッシングを再開することができます。 2012-04-06-12.21.31.781000 ASN7223I "Q Capture" : "ASN" : "WorkerThread" : stopafter オプションを使 用した stop または stopq コマンドに応じて、プログラムは、送信キュー "Q1" にパブリッシュされるすべて のトランザクションがターゲットで適用されるのを待ちます。 データが全て反映されたことを知らせるQアプライの実行ログ 2012-04-06-12.31.29.390000 ASN7224I “Q Apply” : “ASN” : “BR00000” : 受信キュー “Q1” (レプリ ケーション・キュー・マップ “QMAP1”) の Q アプライ・ブラウザー・スレッドは、送信キュー “Q1” にパ ブリッシュされた、コミット・シーケンス番号 “0000:0000:0000:2f68:0000:0000:0006:b2ba”、コミット・タ イム・スタンプ “2012-04-06-12.21.31.000001” までのすべてのトランザクションが適用されたことを Q キャプチャー・プログラムに通知しました。ブラウザー・スレッドはメッセージの処理を継続します。 Qアプライからの通知を受け取ったことを知らせるQキャプチャーの実行ログ 2012-04-06-12.31.30.062000 ASN7227I "Q Capture" : "ASN" : "WorkerThread" : 送信キュー "Q1" (レプリ ケーション・キュー・マップ "QMAP1") にパブリッシュされたすべてのトランザクションがターゲットで適用さ れました。 56 © 2012 IBM Corporation ターゲットDBで静止点が必要な理由 • 異なる業務のデータベース間をQレプリケーションで連携 • 生産管理側は、24時間稼働している • 受注管理側は、ある時点のデータを元にバッチ処理を行う 厳密に言えば、例えば受発注管理側は、生産管理側で21時までの更新データのみが必要な場合、 ・データ連携は21時までの更新データを処理して停止しなければいけない(21時1分の更新データを 処理してはいけない) ・受発注管理側では、停止した時点までの全てのデータが反映されてから、バッチを開始しなければ いけない 受発注管理 生産管理 Qレプリケーションに よるデータ連携 Q Capture 57 agent agent agent Q Apply © 2012 IBM Corporation 参考)これまでの静止点確保の方法 • データ連携停止は、「SIGNAL」で停止することで厳密なポイントで停止が可能 • SIGNALは更新ログに書かれ、それをQキャプチャーが処理する仕組み。そのためある業務処理 完了後に停止SIGNALを発行すれば、その業務処理全てをQキャプチャーが処理したことを保証 して停止できる SIGNAL表の更新 DB2 LOG アプリケーションからの更新 内容:STOP Q Capture MQPUT Q Capture 停止 「SIGNAL」までの更新を全てQキャプチャーが処理したことは保証できるが、それが全てターゲット側に反映され たかどうかはどのように保証するか? 方法: ・ダミーの表をレプリケーションさせる ・SIGNAL表への更新と同じトランザクションでダミー表を更新 ・ダミー表への更新がターゲット側に反映されていることを確認 ・IBMQREP_APPLYMON表のOLDEST_TRANS列の値から、ダミー表を更新した時間までがターゲット側に反映されたことを 確認。(Qアプライは通常並列で処理するため、ダミー表の更新のみでは追い越しが発生している可能性があるため) 58 © 2012 IBM Corporation レプリケーションにおけるトリガー処理 (V9.7まで) • DB2 V9.7までは、レプリケーション対象表にトリガーが存在するとデータのコ ンフリクトが発生していた • ターゲット側のトリガーを外すなどの考慮が必要 SERVER 2 SERVER 1 UPDATES DB2 TABLE 1 DB2 TABLE 2 TRIGGER database recovery log TABLE 1_cp Q Replication Capture TABLE 2_cp TRIGGER Apply コンフリクト! DB2 V9.7では、レプリケーション対象表にトリガーオブジェクトがある場合は、ソース、ターゲット で同じ構成をとることができなかった 59 © 2012 IBM Corporation レプリケーションにおけるトリガー処理 (V10新機能) • DB2 V10.1からは、レプリケーション対象表にトリガーが存在していても、データの コンフリクトは発生しない • キャプチャーパラメータまたはIBMQREP_SUBS表でIGNTRIGをYに設定する SERVER 1 UPDATES DB2 TABLE 1 TABLE 2 TRIGGER database recovery log IGNTRIG=Yに設定する ことで、TABLE2の更新 はキャプチャーしない SERVER 2 DB2 TABLE 1_cp Q Replication Capture TABLE 2_cp TRIGGER Apply データのコンフリクト は発生しない DB2 V10.1では、ターゲット側でトリガーを外すなどの考慮は必要なく、ソースとターゲットは同 じ構成をとることが可能 60 © 2012 IBM Corporation 設定方法 • IGNTRIGを設定する方法は2種類ある 方法1)Qサブスクリプション単位に指定 CREATE QSUB USING REPLQMAP QMAP1( SUBNAME QSUB2 TABLE2 OPTIONS HAS LOAD PHASE I SUPPRESS DELETES N START AUTOMATICALLY NO IGNORE TRIGGERS EXIST TARGET NAME TABLE2 CONFLICT ACTION F ERROR ACTION S LOAD TYPE 0); 方法2)QキャプチャーのパラメーターでIGNTRIG=Yを設定(Qキャプチャー単位) asnqcap capture_server=galidb1 capture_schema=asn IGNTRIG=Y logstdout=Y • パラメータ設定確認( IBMQREP_SUBS表を更新した場合) db2“select substr(SUBNAME,1,20) as SUBNAME,STATE,IGNTRIG,IGNCASDEL,IGNSETNULL from ASN.IBMQREP_SUBS” SUBNAME STATE IGNTRIG IGNCASDEL IGNSETNULL -------------------- ----- ------- --------- ---------TAB1SUB001 A N N N QSUB2 A Y N N 2 レコードが選択されました。 61 © 2012 IBM Corporation 参考)IGNTRIG=Y Qキャプチャーの設定とQサブスクリプションの設定のどちらが有効か? Qサブスクリプション設定で IGNTRIG 'N' Qサブスクリプション設定で IGNTRIG ‘Y' Qキャプチャーの設定で Qキャプチャーの設定で IGNTRIG IGNTRIG 'Y' 'N' トリガーによって更新されたデー タは トリガーによって更新されたデー タは レプリケーションされます レプリケーションされません トリガーによって更新されたデー タは トリガーによって更新されたデー タは レプリケーションされません レプリケーションされません コマンドラインからIGNTRIG=Nを指定しても、サブスクリプションで指定しているIGNTRIG=Yは上書きされない 62 © 2012 IBM Corporation 参考) 実行例(1/2): ソース環境 ターゲット環境 サブスクリプション定義 表:TABLE1 表:TABLE1_cp TAB1SUB001(TABLE1→TABLE1_cp) 表:TABLE2 表:TABLE2_cp TAB2SUB001(TABLE2→TABLE2_cp) トリガー* トリガー* *TABLE1、TABLE1_cpに更新が入るとTABLE2、TABLE2_cpのある列をupdateするトリガーを作成 Files¥IBM¥SQLLIB¥BIN>db2 “update ASN.IBMQREP_SUBS •C:¥Program IGNTRIGを設定する方法は3種類ある • set IGNTRIG='Y' where subname=‘TAB2SUB001’” IBMQREP_SUBS表を更新するIGNTRIG=Yを設定(サブスクリプション単位) C:¥Program Files¥IBM¥SQLLIB¥BIN>asnqcap capture_server=galidb1 capture_schema=asn IGNTRIG=Y logstdout=Y CREATE QSUB USING REPLQMAP GALIDB1_ASN_TO_GALIDB2_ASN • キャプチャーパラメータでIGNTRIG=Yを設定(キャプチャー単位) (SUBNAME TAB2SUB001 TABLE2 OPTIONS HAS LOAD PHASE I IGNORE TRIGGERS • asnclpのサブスクリプション定義に設定 (サブスクリプション単位) TARGET NAME TABLE2_cp); 63 © 2012 IBM Corporation 参考) 実行例(2/2): • パラメータ設定確認( IBMQREP_SUBS表を更新、サブスクリプションで設定した場合の確認方法) C:¥Program Files¥IBM¥SQLLIB¥BIN>db2 “select substr(SUBNAME,1,20) as SUBNAME,STATE,IGNTRIG,IGNCASDEL,IGNSETNULL from ASN.IBMQREP_SUBS” SUBNAME STATE IGNTRIG IGNCASDEL IGNSETNULL -------------------- ----- ------- --------- ---------TAB1SUB001 A N N N TAB2SUB001 A Y N N 2 レコードが選択されました。 • IGNTRIG=N(デフォルト)に設定した場合 • コンフリクトが発生し、EXCEPTION表に書かれます C:¥Program Files¥IBM¥SQLLIB¥BIN>db2 "select EXCEPTION_TIME,substr(RECVQ,1,20) as RECVQ,substr(SUBNAME,1,20) as SUBNAME,REASON,substr(TEXT,1,100) as TEXT from ASN.IBMQREP_EXCEPTIONS EXCEPTION_TIME RECVQ SUBNAME REASON TEXT -------------------------- -------------------- -------------------- ------------ -------------------------------------------------2012-04-19-17.40.22.484000 Q1 64 TAB2SUB001 DUPLICATE UPDATE "AHA03926"."TABLE2_cp" SET "COUNT" = 1 WHERE "COUNT" = 0 © 2012 IBM Corporation LOBデータに関するパフォーマンス向上 • Qキャプチャーはリカバリー・ログからLOB データを直接読み 取るようになりました • LOBデータがログに書かれていれば、Qキャプチャーが自動的に読み取ります • DB2 V10.1にて新しくdiagnostic logが書かれるようになり、 InlineでないLOBの ログも読取り可能となりました ※IRS for z/OS V10は、DB2 10 for z/OS 以降でサポートされるInlineのLOBのログからの読 取りが可能となった。 65 © 2012 IBM Corporation 従来のLOBレプリケーション Qレプリケーションでは、V9.7 FP2からInline LOBのレプリケーションが可能 DB2でのLOBデータのロギング • INLINE LENGTHの長さの範囲内の場合 row 行ログ LOB LOBログ V9.7~ Read OK • INLINEの指定がない、またはINLINE LENGTHの長さより長い場合 (LOBがログに書かれるかは、LOGGEDオプションに依存、XMLは常に書かれる) row 追加 LOBログ LOB QCAP V9.7 行ログ INLINE LENGTHで指定した長さ Read NG ロケータ QCAP V9.7 FP2でReadが可能になったのは、行ログ内のLOBログ 追加LOBログやログがない場合は、直接ソース表をreadして更新データを取得 LOBデータがInlineの長さの範囲内 Inline指定なし、またはLOBデータ がInlineの中さの範囲外 Logged 行ログ内 追加LOBログ Not Logged 行ログ内 ログされない ログからread可能 66 ログからreadできないのでソース表を照会 © 2012 IBM Corporation LOBレプリケーションと新機能誕生の背景 LOBデータを取得する元は、Qキャプチャーのパラメータの LOB_SEND_OPTIONによっても異なる • LOB_SEND_OPTIONと関係(V9.7(FP2~)の場合) Inline範囲内 Not Inline/Inline範囲外 LOB_SEND_OPTION Logged Not logged Logged Not logged I 行ログ 行ログ ソース表 ソース表 S ソース表 ソース表 ソース表 ソース表 • LOB_SEND_OPTION=I の場合(LOBデータはトランザクションメッセージに含まれる) • ログから取得できる場合はログから、できない場合はソース表からLOBデータを取得 • LOB_SEND_OPTION=Sの場合 (LOBデータは、トランザクションメッセージとは別のLOB専用メッセージ になる) • 常にソース表からLOBデータを取得 DB2 V10.1では、Qcapがソース表へアクセスしないようにしてほしいという リクワイアメントがあがった 67 © 2012 IBM Corporation V10.1での拡張機能 • V10.1のQCAPで、追加LOBログのReadができるようになった 行ログ V9.7~ Read OK LOBログ QCAP 追加 LOBログ 行ログ ロケータ V9.7 Read NG V10.1 Read OK! • LOB_SEND_OPTIONと関係(V10.1の場合) Inline範囲内 Not Inline/Inline範囲外 LOB_SEND_OPTION Logged Not logged Logged Not logged I 行ログ 行ログ 追加LOBログ ソース表 S 行ログ 行ログ 追加LOBログ ソース表 • LOB_SEND_OPTION=I 、S 両方共通 • ログがない場合を除き、ログから取得する LOBデータ更新データの取得時のパフォーマンスが向上! データベースへの接続不要! 68 © 2012 IBM Corporation 考慮事項 • LOBをログから読ませるためには、LOB_SEND_OPTIONは「I」でも「S」でもよいが、LOB はLOGGEDオプションが指定されていなければならない • NOT LOGGEDを指定してはいけない • • CREATE TABLE時のデフォルトはLOGGED NOT LOGGED/LOGGEDの属性は、後からALTERで変更できない • IN LINE LOBなのにLOB_SEND_OPTIONがSだと、INLINEからLOB部分を取り出すため に、Qキャプチャーは追加のメモリーが必要になるので、MAX_MESSAGE_SIZE内に収まる のであれば、敢えてLOB_SEND_OPTIONをSにすることは非推奨 • Event PublisherのXMLメッセージの場合は、V10.1での拡張はなし。 • よって LOB_SEND_OPTIONは「I」でなければログから読めない • LOB_SEND_OPTIONが「S」の場合は、ソース表から読む • DB2 V10.1より、XMLのログもLOBと同様にdiagnostic logが書かれるようになったが、Q レプリケーションとしては、V10.1での拡張はなし。 • XMLは常にログに書かれるが、内部フォーマットになっているため、INLINEであっても、Q キャプチャーはログから読めない • LOB_SEND_OPTIONがIでもSでもソース表から読む 69 © 2012 IBM Corporation Qレプリケーション バージョン間のサポート状況 (LUW) Qキャプチャー 10.1 Qアプライ 10.1 Qキャプチャー 9.7 9.7 Qアプライ 10.1 9.7 9.5 ※注 V10 Qキャプチャーは、V9.1、V9.5のQア プライへはレプリケーションできません。 9.1 Qキャプチャー 9.5 70 Qアプライ 10.1 Qキャプチャー 9.1 Qアプライ 10.1 9.7 9.7 9.5 9.5 9.1 9.1 © 2012 IBM Corporation 下位レベルへのレプリケーションはCompatibilityを設定 Qキャプチャー 10.1 Qアプライ 10.1 Qキャプチャー 9.7 9.7 Qアプライ 10.1 9.7 9.5 は、Qアプライに対してQキャプチャーのレベルの方が高いため、Qキャプチャー のCompatibilityをQアプライのレベルに合わせて動かす必要があります。ただし、 使用できる機能は低いレベルに依存します。 Qキャプチャー 9.5 71 Qアプライ 10.1 Qキャプチャー 9.1 9.1 Qアプライ 10.1 9.7 9.7 9.5 9.5 9.1 9.1 © 2012 IBM Corporation 参考)COMPATIBILITYの設定(IBMQREP_CAPPARMS表) Qキャプチャー 10.1 Qアプライ 10.1 9.7 COMPATIBILITYはQキャプチャのバージョンがQアプライに対して高い場合に考慮する設定で す。 レベルが低いQアプライは、高いレベルのMQメッセージを理解することができないため、Q キャプチャがQアプライのレベルに合わせてMQのメッセージを生成する必要があります。 このMQのメッセージレベルを設定するのが、COMPATIBLITYになります。 例)QキャプチャーがV10、QアプライがV9.7の場合 UPDATE Qキャプチャースキーマ.IBMQREP_CAPPARMS SET COMPATIBILITY=„0907‟ ※これによりV10のQキャプチャーであってもV10の新機能は使用できなくなります。 72 © 2012 IBM Corporation Qキャプチャー V10.1 for z/OSとの組合せ • IRS 10.1 for z/OS のQキャプチャがサポートするQアプライのバージョンは以下の通りです。 Qキャプチャー 10.1 (z/OS) Qアプライ 10.1(LUW) 10.1(z/OS) 9.7 V10 Qキャプチャー for z/OSは、 0901/0905のCompatilityをサポートし ています。 9.5 9.1 は、Qアプライに対してQキャプチャーのレベルの方が高いため、Qキャプチャー のCompatibilityをQアプライのレベルに合わせて動かす必要があります。ただし、 使用できる機能は低いレベルに依存します。 73 © 2012 IBM Corporation 参考) Qキャプチャー V10.1 for z/OSとの組合せ ALTER COLUMN SET DATA TYPEに関する注意点 Qキャプチャーfor z/OSで、ソース表に対してALTER TABLE のALTER COLUMN SET DATA TYPEを実施している 場合、Qアプライのバージョンによって振る舞いが変わりますのでご注意ください。 通常QキャプチャーはALTER COLUMN SET DATA TYPEをログから読むとQアプライに対してALTERメッセージと SCHEMAメッセージを送信します。しかし、V10より低いレベルのQアプライはALTERメッセージを理解できませ ん。 V10 Qアプライの場合 (compatibility =‘0907’) ALTER メッセージとSCHEMAメッセージがQアプライへ送信されターゲット表へ適用される。 V9.7 FP6以上 Qアプライの場合 (compatibility =‘0907’) ALTER メッセージとSCHEMAメッセージがQアプライへ送信されるが、QアプライはALTERメッセージを 無視する。 事前にターゲット表もALTERしておくことでSCHEMAメッセージを正常に処理する V9.7 FP5以下 Qアプライの場合 (compatibility =‘0907’) ALTER メッセージとSCHEMAメッセージがQアプライへ送信されるが、QアプライはALTERメッセージを 受け取り エラーとなりQサブスクリプションがDiactivateされる。V9.7の場合は、FP6以上が推奨です。 V9.5 Qアプライの場合 (compatibility =‘0905’) SCHEMAメッセージのみがQアプライへ送信される。 事前にターゲット表もALTERしておくことでSCHEMAメッセージを正常に処理する 74 V9.1 Qアプライの場合 (compatibility =‘0901’) ALTER メッセージとSCHEMAメッセージがQアプライへ送信されるが、QアプライはALTERメッセージを © 2012 IBM Corporation 参考)設定可能なCOMPATIBILITYの値 • 異なるバージョン間で設定するCOMPATIBLITYの値は以下の通りです。 QApply QCapture 10.1 10.1.3 (z/OS) (LUW) 0901 0901 0901 0905 0905 0905 0905 0901 0905 0907 0907 0907 0901 0905 0907* 0907* 0907* × × 0907 0907 1001 9.1 9.5 9.7 9.1 0901 0901 9.5 0901 9.7 10.1 (z/OS) 10.1.3 (LUW) DB2 LUW V10 のQキャプチャは、V9.7以降のQアプライとのみ、レプリケーション可能です。 * Qキャプチャのバージョンは、IBMQREP_CAPPARMSのARCH_LEVELに設定されています。 IRS V10 for z/OS のARCH_LEVELは、現在’100Z’となっており、z/OSでのみ有効な値です(将来的に’1001’になる予定)。 そのため、現在では、IRS V10 for z/OSとレプリケーションする場合、COMPATIBILITYは0907に設定されています。 75 © 2012 IBM Corporation SQLレプリケーション バージョン間のサポート状況 SQLキャプチャー SQLアプライ 10.1 (LUW) 10.1(LUW) SQLキャプチャー 10.1 (z/OS) SQLアプライ 10.1(LUW) 10.1(z/OS) 10.1(z/OS) 9.7 9.7 9.5 9.5 9.1 9.1 COMPATIBILITY 列の値を0801とすることで、旧バージョン のアプライとのレプリケーションが可能です V10 SQLキャプチャー for z/OSの ARCH_LEVELは以前のままの0801の ため、Compaibilityの設定は不要 ※DB2 pureScaleがソースの場合は、COMPATIBILITY 列の値は 1001であることが必要で、その場合 は、アプライも、V10.1以降であることが必要です。 76 © 2012 IBM Corporation 参考)SQLレプリケーションのCompatibility設定 http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.swg.im.iis.db.repl.sqlmig.doc/topics/iiy rsmigluw10compat.html 77 © 2012 IBM Corporation V10.1 GA時点での制約事項 • V 10.1 Q キャプチャーは、Compatibility 0901、0905 をサポートしていない • ソースが 9.7 またはこれ以前の場合には、リモート・キャプチャーにはバー ジョン 9.7 の Q キャプチャー・プログラムが必要 • CCD ターゲット表は 1001 の Compatibility ではサポートされない • バージョン 10.1 Q キャプチャー・プログラムで CCD ターゲット表を使用するに は、Compatibility を 0907 に設定してください。 • SQLレプリケーションはV10.1でもCCDターゲットをサポートします。 • DB2 pureScale® データベースとz/OS間のレプリケーションはできません。 78 © 2012 IBM Corporation DB2 pureScale Feature機能強化 79 © 2012 IBM Corporation 内容 • DB2 pureScale Featureとは何か • V10.1での機能強化 • 新機能①:パーティション表サポート • 新機能②:Current Member隠し列 • 新機能③:DB2 WLMの実装 • 新機能④:新しいモニタリング機能 • DB2 pureScaleに関するよくある質問 80 © 2012 IBM Corporation DB2 pureScale Feature登場の背景 ~既存のテクノロジーの限界を超える~ 経営者・技術者の期待 1 爆発的なトランザクション増加へ の備え 他社ディスク・シェア型 アーキテクチャーの限界 1 サーバ追加で思ったとおりスケー ルしない 2 スピーディかつ低コストなサービ 2 アプリ・データ分割でチューニング 3 サービスレベルを落とさない 3 障害・メンテナンス時にリカバリー ス拡張 運用 しなければスケールしない までの間、停止を伴う 「ノンストップ」、「スケーラビリティ」、「スピード」を追求した 新しいデータベース・インフラ技術 81 © 2012 IBM Corporation 高い可用性を実現するDB2のクラスター技術 比較のポイント DB2 pureScale Infosphere Warehouse(DPF) HADR アーキテクチャ アクティブ-アクティブ型 シェアードディスク型 アクティブ-アクティブ型 シェアードナッシング型 アクティブ-ホットスタンバイ型 概要 メインフレームのCFのアーキテク チャをSWの機能で実現し、可 用性と拡張性を向上 主に大規模情報系で活用 大量データを並列的に高速に 処理できる シンプルに可用性を向上 ログ転送のみによる二重化のた めパフォーマンス劣化が少ない 計画停止対策・ロー リングアップグレード 片系ずつの適用をアプリケー ションの停止なしに可能 片系ずつの適用が可能だが、 テークオーバーの考慮が必要 片系ずつの適用が可能。 テークオーバー処理が高速 障害対策 障害時に更新中のページ以 外のデータにアクセス可能 障害サーバーの復旧時間目 標は数十秒 N-1/Nのデータにアクセス可能。 障害サーバーの復旧時間目標 は1分前後 テークオーバー中は全体停止。 復旧時間目標は数十秒から1 分程度 大規模OLTP 統合DB 高信頼性 82 大規模DWH (大規模OLTP) 汎用的な OLTP/DWH © 2012 IBM Corporation DB2 pureScale の全体構成 アプリケーションはどこにでも接続 クライアント – 一つのデータベースとして利用 – 自動的なワークロードバランス シングル・データベース・ビュー DB2エンジン(メンバー)は筐体/LPARで稼動 – AIX on Power6・Power7 – SUSE Linux on System X,Red Hat on System X メン バー CF-Secondary CS CS メンバー メンバー CS メンバー CS CS をサポート CF- Primary 統合されたクラスター・サービス CS – 障害検知, 自動リカバリー, クラスター・ファイルシステム – Tivoli System Automation (TSA)、GPFS™ サーバー間通信 SAN接続(Fiber) ログ 超高速サーバー間通信 – RDMAサーバー間通信を最大限に活用 (InfiniBand) ログ ログ ログ – 10G Ethernetもサポート Cluster caching facility (CF) – ロックとバッファー管理を最適化 データ – セカンダリ への同期2重化により可用性を確保 データシェアリング・アーキテクチャー – データベースへの共有アクセス – General Parallel File System (GPFS) 83 © 2012 IBM Corporation DB2 pureScale採用のメリット① - 高いスケーラビリティ pureScaleと他社クラスタのスケーラビリティ pureScale vs. Oracle RAC Projected Transaction Scalability Transactoins per Minute Estimated スループット(トランザクション/分) 16,000,000 95%のスケール $1.28/tpm 14,000,000 $1.24/tpm 12,000,000 $1.20/tpm $1.15/tpm 10,000,000 $1.10/tpm DB2 pureScale on Power Systems 8,000,000 6,000,000 4,000,000 2,000,000 Oracle RAC on 他社クラスタ Nehalem $1.06/tpm $1.05/tpm $1.67/tpm $1.41/tpm $1.08/tpm 65%のスケール 0 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #サーバー数 Cluster Members Price per tpm includes 3-year total cost of acquisition of hardware, software, maintenance Price does not include storage or networking 84 © 2012 IBM Corporation DB2 pureScale採用のメリット② - 高い可用性 障害範囲の極小化 障害サーバー以外はアクセスを継続 DB2 DB2 DB2 DB2 • 障害サーバーへの接続は稼動中のサーバーに 再分配 Log 障害サーバーが障害発生時に更新中のデー タ以外は全面的にアクセス可能 CF Log Log データ Log CF リカバリー処理の自動化 データベースサーバーの障害 全面復旧までの時間の高速化 障害が発生したサーバーで実行中のトランザ クションも、問題の検知も含めて短時間で復 旧させることが可能 回復中にはインフライトデータののみをロック 利用できるデータの割合(%) 統合されたクラスター製品により障害検 知からリカバリー処理までを自動化 100 50 Time (~seconds) 85 © 2012 IBM Corporation 新機能①:DB2 pureScale環境にてパーティション表を利用可能 • DB2 pureScale環境において大規模データの管理が容易になる • v9.7以前から利用可能な機能、v10の新機能のいずれも利用可能 • パーティションの高速なアタッチとデタッチ • 仕掛り中のクエリーがあっても、アタッチ、デタッチ可能 • パーティション単位での管理 • 更新が頻繁に発生する区分のみを高い頻度でバックアップ、再編成、再圧縮、等 • 区分限定スキャンにより大規模表のクエリー時間短縮 • 検索条件からスキャン対象のパーティション(表、索引)を特定 履歴表A 表スペース1 1月 1月 表スペース2 表スペース3 表スペース4 2月 3月 4月 区分の デタッチ 5月 5月 区分の アタッチ 1月 86 表スペース5 保存期間を過ぎた データの高速な削除 5月 LOAD済み 表の追加 © 2012 IBM Corporation パーティション表を利用する場合の運用 LOAD時間短縮のために、メンバーで並列に実行さ せてから、アタッチさせることが可能 • V10.1新機能であるアタッチ時のset integrity回避を使用することで、 より高速に完了させることが可能。 メンバー並列で、パーティションごとに再編成が可能 • 1つのメンバー内でも同時に複数パーティションに対して並列実施 可能 • ただし、パーティション索引が張られている表に対してのみ実行可能 87 © 2012 IBM Corporation パーティション表活用によるメンバー間の競合緩和 • 課題:同じ索引ページやデータページへのインサートが集中すると、メンバー間 の競合によって処理性能が伸びなくなる • 複数メンバーから同じページにデータ挿入が発生すると、データの整合性確保のため、最新のページがメン バー間でやり取りされる • RDMAを利用したpureScaleでは、競合他社製品よりも影響は尐ないが、大規模クラスター環境では、このメン バー間の競合のために十分な性能が出ない可能性がある。 ●単調増加する列が索引キーになっている例 Member1 Member0 INSERT INTO T1 VALUES (10, CURRENT TIMESTAMP) INSERT INTO T1 VALUES (20, CURRENT TIMESTAMP) 実行DDL CREATE TABLE T1 (C1 INT, C2 TIMESTAMP); 索引X1 CREATE INDEX X1 ON T1 (C2); 表T1 88 各メンバーから常に最大の値が挿 入されるため、索引の最終ページに アクセスが集中する © 2012 IBM Corporation パーティション表活用によるメンバー間の競合緩和(続き) • 競合緩和の解決①:メンバーIDが自動的にセットされる列を区分化列とした パーティション表を使う。 • V10.1より新しく利用可能になった”CURRENT MEMBER”をデフォルト値とした隠し 列を定義し、その列を区分化列とする。 • 区分化された表と索引を各メンバー毎に用意することができるため競合が発生しない ●メンバーIDで分割したパーティション表 Member1 Member0 INSERT INTO T1 VALUES (10, CURRENT TIMESTAMP) INSERT INTO T1 VALUES (20, CURRENT TIMESTAMP) 実行DDL CREATE TABLE T1 (C1 INT, C2 TIMESTAMP, C3 SMALLINT WITH DEFAULT CURRENT MEMBER IMPLICITLYHIDDEN) PARTITION BY RANGE (C3) (STARTING 0 ENDING 1 EVERY 1 ) ); CREATE INDEX X1 ON T1 (C2); 89 索引X1 表T1 各メンバーから常に最大の値が挿 入されるが、挿入の発生するメン バー毎にターゲット索引と表が分か れているため、競合が発生しない。 © 2012 IBM Corporation 新機能②:隠し列の活用によるメンバー間の競合緩和 • 競合緩和の解決②:メンバーID隠し列(CURRENT MEMBER)を索引の第1 キーに指定する • ユニーク索引やタイムスタンプ列のように、キーがパーティション化しにくい場合 に”CURRENT MEMBER”隠し列を第1キーに指定する • メンバーごとに索引を局所化し、メンバー間での同一ページのやりとりを回避でき る ●各メンバーIDが第1キーとなる局所化された索引の更新 Member0 Member1 INSERT INTO T1 VALUES (10, CURRENT TIMESTAMP) INSERT INTO T1 VALUES (20, CURRENT TIMESTAMP) 実行DDL CREATE TABLE T1 (C1 INT, C2 TIMESTAMP, C3 SMALLINT WITH DEFAULT CURRENT MEMBER IMPLICITLYHIDDEN) ); 0 1 索引X1 CREATE INDEX X1 ON T1 (C3,C2); 表T1 90 ID=0 ID=1 各メンバーから常に最大の値が挿 入されるが、挿入の発生するメン バー毎にターゲットページが分かれ ているため、競合が発生しない。 © 2012 IBM Corporation 新機能③:DB2 WLMの実装 • DB2 pureScale において、DB2 WLMが利用可能になった。 • 利用例:同じデータを使用するシステムを統合した場合に、優先度の高い 処理は、他の処理の影響を受けずに、一定のパフォーマンスを担保させる。 業務A APサーバー 業務B APサーバー 業務C APサーバー Active Node Active Node Active Node Active Node DBMS DBMS DBMS DBMS Cluster Cluster Cluster Cluster データ連携に伴うバッチ処理の負 荷に対して、高優先度のオンライン トランザクションへの影響を小さく することが可能。 91 業務E APサーバー CFNode Node CF DBMS DBMS 優先度の高い業務や、要件に合わせて柔 軟にリソースの優先度制御することが可能。 データ連携 DWHなど 業務D APサーバー ・・・ © 2012 IBM Corporation 新機能④:新しいモニタリング表関数の提供 • CF上のGroup Buffer Pool(GBP)が適正サイズ確認のための表関数を提供 • MON_GET_GROUP_BUFFERPOOL表関数 • ページ登録やGBPへのページ書き込み時に空きスペースが無かった場合に発生するエラー (GBP_FULL)の発生回数を報告 • 実行シンタックス MON_GET_GROUP_BUFFERPOOL (メンバーID) • 戻り値 列名 データタイプ 説明 MEMBER SMALLINT メンバーID NUM_GBP_FULL BIGINT GBP_FULLエラーの発生回数 • 評価方法 • 1分間に1回以上のGBP_FULL増加があった場合には、GBPの大きさを拡大することを検討 ●実行例 SELECT SUM(T.NUM_GBP_FULL) AS NUM_GBP_FULL FROM TABLE(MON_GET_GROUP_BUFFERPOOL(-2)) AS T NUM_GBP_FULL -----------123 1 record(s) selected. 92 © 2012 IBM Corporation DB2 pureScaleに関するよくある質問 (1) • DB2 pureScaleのライセンスはどのサーバーに課金されますか? • DB2メンバーのサーバーに、DB2 pureScaleのライセンスが課金されます。 • CFサーバーには、DB2 pureScaleのライセンスは課金されません。 • DB2 pureScaleを使用するために必要なライセンスは? • DB2 Advanced Enterprise Server Edition + DB2 pureScale Feature • DB2 Enterprise Server Edition + DB2 pureScale Feature • DB2 Workgroup Server Edition (クラスターの全サーバーで合計4CPUソケットまで) • DB2 Database Enterprise Developer Edition • DB2 pureScaleとは別に、GPFSやTSAの購入が必要ですか? • いいえ、必要ありません。 DB2 pureScaleにGPFSやTSAのライセンスおよびモジュールが含まれます。 DB2 pureScaleを導入するとGPFSやTSAが同時に導入されます。 93 © 2012 IBM Corporation DB2 pureScaleに関するよくある質問 (2) • Oracle互換モードはDB2 pureScaleと組み合わせて使用できますか? • Oracle互換モード(Oracle対応PL/SQL、SQL、トリガー、ファンクション、デー タ型など)はDB2 pureScaleと組み合わせて使用できます。 • DB2 pureScaleの制約は? • 現時点(2012/09)で、以下機能はDB2 pureScaleと組合わせて使用できませ ん。機能向上として今後随時追加される予定です。 • MDC(多次元クラスター表) • 差分/増分バックアップ • オンラインでの表・索引の再編成(インプレース再編成)[オンライン表移動プロシー ジャーで代用可能] • オンラインでのDB2のFix Pack適用 • オンラインでのメンバー追加 • 自動ストレージ以外のコンテナー(従来のSMS、DMSコンテナー) • HADR [参考:災害対策としてレプリケーション機能やストレージコピーが使用可能] • DB2 Text Search / Net Search Extender / Spatial Extender 94 © 2012 IBM Corporation DB2 pureScale Featureのまとめ • DB2 pureScaleは、高い拡張性と可用性を併せ持つ新しいク ラスターDBソリューションである • 表/索引の設計によりホットスポットの回避が可能になった • パーティション表の活用 • Current member隠し列の活用 • DB2 WLMにより、メンバーごとのリソース制御が可能になった • 同一データを使用する複数システムの統合により、業務間の 優先度を調整可能 • DB2 pureScale用の新しいモニタリング機能により、パフォー マンスのボトルネックを調査可能な情報が増えた 95 © 2012 IBM Corporation