本文へジャンプ

Oracle RAC構成における2フェーズ・コミット時の考慮点 (WAS-08-013)

WAS V6.xにおいて、Oracle RACを構成した環境で2フェーズ・コミットを実行する場合には注意が必要です。

内容/目次

更新ログ

(2009/03/18 16:22) Oracle 11gの情報を追加。

【概要】
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 実行される

    WAS-08-013_Fig1.jpg
    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側での負荷分散」をご参照下さい。

      WAS-08-013_Fig2.jpg
      Fig. 2
        【参考】WAS側での負荷分散
          DTPサービスを複数構成して、WAS側で構成したDTPサービスを使い分けることで負荷を軽減することが可能です。
           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)))

          WAS-08-013_Fig3.jpg
          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フェーズ・コミット処理を実行できましたので、ご報告します。

          ibm.com以外のサイトへのリンクOracle XAを使用したアプリケーションの開発
          ibm.com以外のサイトへのリンクOracle Databaseリファレンス: GLOBAL_TXN_PROCESSES

          【参考情報】
          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の商標です。 他の会社名、製品名およびサービス名等はそれぞれ各社の商標です。

            ソフトウェアサポート

            ソフトウェア製品のサポート技術情報

            ハードウェアサポート

            ハードウェア製品のサポート技術情報