内容/目次
|
更新ログ |
【概要】
WebSphere Application Server (以下WAS) V6.0/V6.1/V7.0において、Oracle RAC 10gを構成した環境で2フェーズ・コミットを実行する場合には注意が必要です。
【対象のお客様】
WAS V6.0/V6.1/V7.0
対象となるレベルの詳細情報については、下記対象製品をご参照ください。
【対象製品】
対象プラットフォーム:AIX, Windows, Linux, Solaris, HP-UX, i5/OS (OS/400), z/OS
対象エディション:すべてのエディション
対象バージョン:WAS 6.0/6.1/7.0
お使いのWASのバージョン、Fixレベルの確認方法については、こちらの文書をご参照ください。
【WAS FAQ】WAS V6でのバージョン、Fixレベル確認方法 (Link)
【問題内容】
Oracle RACを構成した環境において、XA アプリケーションを実行すると、異なるRACインスタンス上で xa_prepare/xa_rollback/xa_commit 要求が実行されてしまう可能性があります。
Oracle RACでは、「ノード間で同一ブランチの xa_prepare/xa_rollback/xa_commit 要求を実行することができない」といった制限があるため、異なるRACインスタンス上で xa_prepare/xa_rollback/xa_commit 要求が実行された場合は、問題が発生します。
<発生する問題>
ORA-24756: トランザクションが存在しません。
原因: 無効なトランザクション識別子またはコンテキストが使用されました。または、トランザクションは完了しています。
処置: トランザクションが完了していない場合は、有効な識別子を指定してコールを再試行してください。
<参考> 問題が発生する例
RACインスタンス障害によりフェイルオーバーが発生した場合
RAC1
1.xa_start
2.SQL処理の実行
3.xa_end
4.xa_prepare
※障害発生
RAC2
1.xa_commit
※異なるインスタンス上で xa_commit が実行される
Fig.1
DTP サービスを構成する
DTPサービスを構成すると、Oracle RAC はサービスが分散トランザクション用であると認識し、障害時のリカバリーを自動化することができます。
- srvctl add service -d <dbname> -s <servicename> -r <primary nodes> -a <alternate nodes>
-d:データベースの一意の名前
-s:サービス名
-r:優先インスタンスのリスト
-a:使用可能インスタンスのリスト
DTPサービスを構成した場合の考慮点
DTPサービスを構成した場合、全てのブランチが特定のRACインスタンス(優先インスタンス)で実行されます。
そのため、片方のRACインスタンスに負荷が集中してしまいますので、WAS側で負荷を分散できるようなデータソースの定義を検討することをお勧めします。
詳細は、次項「【参考】WAS側での負荷分散」をご参照下さい。
Fig. 2
WAS #1 : 「RAC1」 を優先インスタンスに設定
WAS #2 : 「RAC1」 を優先インスタンスに設定
WAS #3 : 「RAC1」 を優先インスタンスに設定
WAS #4 : 「RAC2」 を優先インスタンスに設定
WAS #5 : 「RAC2」 を優先インスタンスに設定
<手順>
1.DTPサービスを複数構成する
RAC1を優先インスタンスとするサービスと、RAC2を優先インスタンスとするサービスを作成する。
- srvctl add service -d <dbname> -s <serviceA> -r <RAC1> -a <RAC2>
srvctl add service -d <dbname> -s <serviceB> -r <RAC2> -a <RAC1>
2.データ・ソースを複数定義する
リソース > JDBC > データ・ソース > {データソース名} > URL
WAS #1~WAS #3はserviceAを使用するよう定義する
- jdbc:oracle:thin:@(DESCRIPTION=(ENABLE=BROKEN)(ADDRESS_LIST=(FAILOVER=ON)(LOAD_BALANCE=OFF)
(ADDRESS = (PROTOCOL = TCP)(HOST = RAC1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = RAC2)(PORT = 1521)))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=serviceA)))
WAS #4~WAS #5はserviceBを使用するよう定義する
- jdbc:oracle:thin:@(DESCRIPTION=(ENABLE=BROKEN)(ADDRESS_LIST=(FAILOVER=ON)(LOAD_BALANCE=OFF)
(ADDRESS = (PROTOCOL = TCP)(HOST = RAC2)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = RAC1)(PORT = 1521)))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=serviceB)))
Fig.3
【補足1】
<DTPサービスについて>
グローバル・トランザクションの参加者は全て1つのRACインスタンス上でブランチを作成できるようにするサービスであり、以下の利点があります。
・RACインスタンス障害の検出
・RACインスタンスのフェイルオーバーとフェイルバック
<DTPサービス構成手順について>
1.優先インスタンスの定義
- SRVCTLを使用してサービスを作成し、優先インスタンスに1つのインスタンスのみを定義します。
AVAILABLEインスタンスには、任意の数を定義できます。
例.データベースrac用の単一のサービスrac_xa01を作成。当サービスの優先インスタンスは、RAC1です。
srvctl add service -d rac -s rac_xa01 -r RAC1 -a RAC2, RAC3
2.サービスの開始
- srvctl start service –d rac –s rac_xa01
3.DTPサービスの有効化
- DTPパラメータにTRUEを設定して(デフォルトはFALSE)、分散トランザクション処理用のサービスとしてマーク付けを行う
EXECUTE DBMS_SERVICE.MODIFY_SERVICE(service_name =>'rac_xa01', DTP=>TRUE);
上記にて、サービスrac_xa01を提供するRAC1との接続に失敗した場合、提供されていた単一のサービスは、RAC2やRAC3などの他のインスタンスの1つにフェイルオーバーされます。
<LOAD_BALANCE>
LOADBALANCE=ONの場合は、接続先リストにあるRACインスタンスにランダムに割り振られます。
LOADBALANCE=OFFの場合は、接続先リストに指定した順に割り振られます。
【補足2】
Oracle RAC 11g環境にて、2フェーズ・コミット処理を実現するGLOBAL_TXN_PROCESSESパラメーターが追加されました。
WASV7 - Oracle RAC 11g環境にて検証したところ、DTPサービスを構成しなくても、問題なく2フェーズ・コミット処理を実行できましたので、ご報告します。
【参考情報】
・Configuring Oracle Real Application Clusters (RAC) to run with WebSphere Application Server when using two-phase commit (2PC) [Link]
・Part 3: Handling two-phase commit in WebSphere Application Server using Oracle RAC (Link)
・WebSphere Application Server V6.1による基幹システム設計ワークショップ資料 -> DB接続設計(pdfファイルへのリンク) 「P60 Oracle RAC FCF概要(Oracle 10g)」
添付資料
文書情報
有効期限: 2013年3月27日
資料番号: WAS-08-013
掲載内容について
当サイトは、お客様の問題解決のためのヒントとしてご利用ください。 当サイトにおける記載内容は、お客様固有の問題に対し、適切であるかどうか、また、正確であるかどうかは十分検証されていません。 結果について、いかなる保証も責任も負いかねますので、あらかじめご了承ください。
商標について
IBM、IBM(logo)、developerWorks、Lotus、PartnerWorld、Rational、Tivoli、 WebSphereはIBM Corporationの商標です。 他の会社名、製品名およびサービス名等はそれぞれ各社の商標です。
