Oracle WebLogic ServerでJDBC GridLinkデータソースを使用する方法

Pas ApicellaおよびFrances Zhao

2011年3月公開

Oracle WebLogic ServerOracle Real Application Clusters(RAC)をサポートするには、マルチ・データソース(MDS)ソリューションと、Oracle WebLogic 11g Release 1(10.3.4)で新しく導入されたOracle WebLogic Active GridLink for RAC、という2つの実装があります。 このHow-Toドキュメントでは、これら2つのアプローチを比較していきます。

マルチ・データソース

Oracle WebLogic Server JDBCサブシステムは、Oracle WLSバージョン9.0以降でOracle RACをサポートしていますが、最初はOracle9i RAC向けに開発されました。このサポートは、マ ルチ・データソースと呼ばれる特定の種類のデータソース構成を前提としています。マルチ・データソースは1つ以上の個別データソー スを抽象化したデータソースであり、指定されたポリシーに従って、各メンバー・データソースに対するJDBC接続を提供します。Oracle RACのマルチ・データソース構成では、それぞれのメンバー・データソースが特定のRACインスタンスに対する接続を取得する必要があります。

マルチ・データソース・ソリューションにはさまざまな制約があります。 第一に、構成が複雑になります。 Oracle RACマルチ・データソースはn+1個のJDBCモジュールを必要とします。ここで、nはクラスタに含まれるノード数を示します。Oracle RACサービス構成では、定義されたサービスごとに独立したマルチ・データソースが必要になります。また、構成自体が静的であるため、RACクラスタ・ト ポロジが変更された場合にデータソースを追加または削除するには、管理者の介入が必要になります。

接続プーリングは、マルチ・データソースにおいて個々のJDBC接続の状態を判断するためと、RACクラスタ・トポロジの変更を検出するために使用される メカニズムです。個々の接続に対してSQL操作を実行することはできますが、実行時のオーバーヘッドが高くなり、RACノード障害の検出が遅延する可能性 があるという代償を伴います。

マルチ・データソース実装で採用されているラウンドロビン方式のロードバランシングによって、すべてのメンバー・データソース間で均等に負荷が分散されま すが、Oracle RACインスタンス間でパフォーマンスや応答時間の特性が異なる場合、よりきめ細かい制御が望まれます。 それぞれのMDSはXAアフィニティを提供しています。複数のMDSがグローバル・トランザクションにエンリストされている場合、それぞれ異なるRACイ ンスタンスから接続が取得される可能性があります。この場合、同じグローバル・トランザクションの複数のブランチがそれぞれ別のRACインスタンスによっ て処理される結果となります。この処理は最近のOracle RACバージョンでサポートされてはいますが、パフォーマンスの観点から見ると、最適な処理とは言えません。

Oracle GridLink for Oracle RAC

Oracle WebLogic Server 10.3.4では、単一データソース実装でOracle RACクラスタをサポートする方法が導入されました。 このデータソースはFANイベントに応答して、高速接続フェイルオーバー(FCF)、ランタイム接続ロードバランシング(RCLB)、RACインスタンス の正常終了を実行します。またグローバル・トランザクションIDレベルでXAアフィニティがサポートされています。 WebLogic Active GridLink for RACと呼ばれる新機能は、WebLogic Server内のGridLinkデータソースとして実装されています。

WebLogic Serverのワーク・マネージャおよびタイマー・マネージャ実装を利用して、内部タスクのスケジューリングとタイマー・イベント処理を実行することでリ ソース利用率と管理性を向上するため、WebLogic ServerにはJavaライブラリUniversal Connection Pool(UCP)が統合されています。UCPのRAC統合機能は、FCF、RCLB、アフィニティといった機能を提供するため、Oracle RACデータソース実装によって利用されてきました。

Oracle RACサポートを統合し、簡素化するため、WebLogic ServerではOracle RAC機能のサポート向けに拡張された単一データソースを提供しています。Oracle WebLogic Server内で提供される単一接続プール/データソースを利用して、制限を受けない方法でデータベース・サービスを消費することができます。 これは、Oracle RACとのより緊密な統合を提供するための重要な基盤となります。

Oracle WebLogic Server内でこの単一データソース実装を利用すると、データソースの接続ターゲットとして、制限されることなくデータベース・サービスを全面的に使用 できるようになります。プール内の接続に対するアクティブ管理は、接続プール自体に構成された静的な設定(最小/最大キャパシティ、タイムアウトなど) と、接続プールがRAC ONS(Oracle Notification Service)サブシステムから取得するリアルタイム情報に基づいて行われます。このサブシステムによって、RACクラスタ内のあらゆる状態変化が"ク ライアント"に通知されます。

高速接続フェイルオーバー

GridLinkデータソースは高速接続フェイルオーバーを使用することで、次の機能を提供します。

  • 迅速な障害検出機能を提供します。
  • 無効な接続を強制終了し、接続プールから削除します。
  • Oracle RACノードの計画停止時および計画外停止時に、正常終了を実行します。
  • ノードの追加や削除など、トポロジ内の変化に適応します。
  • すべてのアクティブなOracle RACインスタンスに対して、実行時の作業リクエストを分散します(クラスタの再結合を含む)。

ランタイム接続ロードバランシング

スループットの向上とリソース使用の効率化を実現するため、Oracle Databaseはランタイムのロードバランシング・サービスを提供しています。このサービスは、DBAによって設定されたパフォーマンス目標に基づい て、複数のRACインスタンス間で接続を分散します。ロードバランシングのアドバイザリ・サービスによってFANイベントが発行され、接続の転送先に関す るアドバイスを含むクラスタの最新状態がクライアントに通知されます。 GridLinkデータソースはXA環境と非XA環境にロードバランシング機能を提供します。 GridLinkデータソースはランタイム接続ロードバランシングを使用することで、データベースによって発行されたOracle FANイベントに基づいて、Oracle RACインスタンスに対する接続を分散します。 これによって、データベース・トポロジに関係なく、GridLinkデータソースを介してデータベース接続がロードバランシングされるため、データソース 構成が簡素化され、パフォーマンスが向上します。

WebLogic Serverでランタイム接続ロードバランシングを利用すると、次の利点があります。

  • CPU、可用性、応答時間などのバックエンドのノード機能に基づいて、負荷分散を調整できます。
  • Oracle RACトポロジ内の変化に対応できます。
  • プールされた接続を管理することで、パフォーマンスとスケーラビリティを向上できます。

XAアフィニティ

XAアフィニティは、グローバル・トランザクションのコンテキスト内で実行される単一RACクラスタ上のすべてのデータベース操作が、 同じRACインスタンスに送られるように保証するパフォーマンス機能です。 アフィニティは、個別のデータソースではなくグローバル・トランザクションIDに基づいて確立されるため、同じRACクラスタ内に構成された異なるデータ ソースから取得された接続が、すべて同じRACインスタンスに関連付けられるようになります。

UCPによって提供されるアフィニティ機能を利用することで、複数のデータソースに対して同じWebLogic Serverインスタンスからアクセスしているか、別々のWebLogic Serverインスタンスからアクセスしているかに関係なく、GTRIDに基づいて接続が割り当てられます。Last Logging Resourceの2フェーズ・コミット最適化はRACデータソースでサポートされる予定であり、XAアフィニティにも対応する予定です。 XAトランザクションに対する最初の接続要求はRCLBを使用してロードバランシングされ、アフィニティ・コンテキストが割り当てられます。 その後のすべての接続要求は、最初の接続のアフィニティ・コンテキストを使用して、同じOracle RACインスタンスに転送されます。

ここからは、GridLinkデータソースの構成とそのアプリケーションでの使用が簡単に実行できる様子を紹介します。GridLinkデータソースをア プリケーションで使用することで、高速接続フェイルオーバーやランタイム接続ロードバランシング、XAアフィニティといった優れた機能を利用できるように なります。

Oracle RACクラスタの確認

JDBC GridLinkデータソースを作成する前に、SQL*Plusと各種のコマンドを使用して、有効なOracle RAC 11g Release 2 SCANが設定されていることを確認する必要があります。

  1. RACノードの1つにログインし、該当するサービスのtnsnames.oraエントリを確認します。 有効なサービスがすでに作成されている場合、$ORACLE_HOME/network/admin/tnsnames.oraファイルに次のようなエン トリが含まれます。

    pas_srv =
     (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = apctcsol1)(PORT = 1521))
      (LOAD_BALANCE = YES)
      (CONNECT_DATA =
       (SERVER = DEDICATED)
       (SERVICE_NAME = pas_srv)
      )
     )
  2. 次に示すとおり、SQL*Plusでテストを実行して接続を確認します。

    [oradb1@auw2k3 admin]$ sqlplus scott/tiger@pas_srv SQL*Plus: Release 11.2.0.2.0 Production on Tue Feb 1 09:23:03 2011
    Copyright (c) 1982, 2010, Oracle.  All rights reserved.
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Data Mining and Real Application Testing options
    SQL>
  3. 次に示す問合せを実行し、クラスタ内で接続しているインスタンスを確認します。

  4. ステップ2とステップ3を何度か繰り返して、クラスタ内の異なるインスタンスに接続していることを確認します。 次の出力結果から、異なるノード上にある、auw2k3auw2k4と いう2つのインスタンスに接続したことが分かります。

    SQL> col "Instance" format a25
    SQL> col "Hostname" format a25
    SQL> col "Service" format a25
    SQL>
    SQL> select sys_context('userenv', 'instance_name') as "Instance",
      2         sys_context('userenv', 'server_host') as "Hostname",
      3         sys_context('userenv', 'service_name') as "Service"
      4  from dual;
    Instance      Hostname      Service
    ------------------------- ------------------------- -------------------------
    A11           auw2k3        pas_srv
  5. 次の3つのコマンドを実行して、SCANリスナーが実行中であることを確認します。

    [oradb1@auw2k3 admin]$ srvctl
    config scan_listener

    SCAN Listener LISTENER_SCAN1 exists. Port: TCP:1521
    [oradb1@auw2k3 admin]$ srvctl status
    scan_listener

    SCAN Listener LISTENER_SCAN1 is enabled
    SCAN listener LISTENER_SCAN1 is running on node auw2k3
    [oradb1@auw2k3 ~]$ srvctl config scan
    SCAN name: apctcsol1, Network: 1/10.187.80.0/255.255.254.0/eth1
    SCAN VIP name: scan1, IP: /apctcsol1.au.oracle.com/10.187.80.129

JDBC GridLinkデータソースの作成

  1. 次のようなURLを使用して、WebLogicコンソールへログインします。

    http://<host>:<port>/console

  2. Domain Structure」ツリーの下の「Services」 ノードを開きます。
  3. Data Sources」をクリックします。
  4. New」ボタンの隣の「^」 ボタンをクリックして3つのメニュー・オプションを表示し、「Gridlink Data Source」 を選択します。
  5. 次の情報を入力します。

    名前:jdbc/gridlinkDS
    JNDI名:jdbc/gridlinkDS

  6. 次に示すとおり、Is this XA driver?チェック・ ボックスのチェックは付けないままにします。

    wls-jdbc-gridlink-howto-f1
  7. Next」をクリックします。
  8. Transaction Optionsページの設定をデフォルト のままにし、「Next」をクリックします。
  9. Enter complete JDBC URL」チェック・ ボックスを選択します。 ここではSCANを 使用しているため、これがもっとも簡単な接続方法になります。
  10. Next」をクリックします。
  11. 次のように、完全なJDBC URLを入力します。 サービスを利用していることを示すため、JDBC URLのサービス名の先頭にスラッシュを付けてください。 SCANは常にサービスを使用します。

    書式:
    jdbc:oracle:thin:@{scan-listener-host}:{scan-listener-port}/{service-name}
    例:
    jdbc:oracle:thin:@apctcsol1.au.oracle.com:1521/pas_srv

    次に示すように、SCANホスト/ポートを特定するためにクラスタ内の任意のRACインスタンスに接続する方法があります。

     

    SQL> show parameter remote_listener 
    NAME               TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    remote_listener    string      apctcsol1:1521
    SQL>

  12. 次に示すように、データベース接続のユーザー名とパスワードを入力します。

     

    wls-jdbc-gridlink-howto-f2
  13. Next」をクリックします。
  14. 次のとおりに「Test All Listeners」ボタンをク リックして、設定が有効であることを確認します。
    wls-jdbc-gridlink-howto-f3

     

  15. Next」をクリックします。
  16. ONSクライアント構成の場合、次のとおりに各RACノードとリモートONSポートを追加します。

    auw2k3.au.oracle.com:6200
    auw2k4.au.oracle.com:6200

    この時点で、リモートONSポートが正しいことを確認することが非常に重要です。 確認するには、次に示すように、CRS_HOMEからonsctl debugの出力を取得します。

     

    [oragrid@auw2k3 grid]$ onsctl debug
    HTTP/1.1 200 OK
    Content-Length: 2608
    Content-Type: text/html
    Response:

    == auw2k3:6200 17995 11/01/31 21:31:05 ==
    Home: /u01/app/11.2.0/grid

    ======== ONS ========
    IP ADDRESS           PORT TIME          SEQUENCE  FLAGS
    --------------------------------------- -----  --------    
    10.187.80.187        6200  4d4607c1     00000002  00000008

    Listener:

    TYPE        BIND ADDRESS               PORT     SOCKET
    --------    ---------------------------------------      
    Local       127.0.0.1                  6100      5
    Remote      any                        6200      7
    Remote      any                        6200      -

    Servers: (1)

    INSTANCE NAME           TIME     SEQUENCE   FLAGS       DEFER
    ----------------------------------------    --------     --------     
    dbInstance_auw2k4_6200  4d4607c1 0000000e   00000002     0
    10.187.80.185 6200

    Connection Topology: (2)

    IP                   PORT VERS  TIME
    ---------------------------------------
    10.187.80.187        6200 4     4d4607c1=
    **                          
    10.187.80.185        6200
    10.187.80.185        6200 4     4d4607c1
                               **                          
    10.187.80.187 6200
    Server connections:

    ID       CONNECTION ADDRESS   PORT  FLAGS  SENDQ  REF WSAQ
    -------- --------------------------------------- -----  
    0        10.187.80.185        6200  010405 00000  001

    Client connections:

    ID       CONNECTION ADDRESS   PORT  FLAGS  SENDQ REF SUB W
    -------- --------------------------------------- -----  
    1            internal         0     01008a 00000 001 002
    3            127.0.0.1        6100  01001a 00000 001 001
    5            127.0.0.1        6100  01001a 00000 001 001
    6            127.0.0.1        6100  01001a 00000 001 001
    7            127.0.0.1        6100  01001a 00000 001 000
    request      127.0.0.1        6100  03201a 00000 001 000

    Worker Ticket: 2058/2058, Last: 11/01/31 21:30:47

      THREAD       FLAGS
      --------     --------
      b5d1db90     00000012
      b5d15b90     00000012
      b5d0db90     00000012

    Resources:

      Notifications:
        Received: Total 16 (Internal 2), in Receive Q: 0
        Processed: Total 16, in Process Q: 0

      Pool Counts:
        Message: 1, Link: 1, Ack: 1, Match: 1

  17. 次に示すように、設定を確認して「Next」をクリックします。 このHow-ToドキュメントではOracle Walletは使用しません。

     

    wls-jdbc-gridlink-howto-f4
  18. 次に示すように、「Test All ONS Nodes」をク リックして、RACノード上のリモートONSポートと通信できることを確認します。

     

    wls-jdbc-gridlink-howto-f5
  19. Next」をクリックします。
  20. 次に示すように、管理対象サーバーのターゲットとしてJDBC GridLinkデータソースを選択します。 ここでは、appleと いう名前の管理対象サーバーを使用します。

     

    wls-jdbc-gridlink-howto-f6
  21. Finish」をクリックします。
  22. 次のようにJDBC GridLinkデータソースが作成されていることを確認します。

     

    wls-jdbc-gridlink-howto-f7
  23. 最後に、GridLinkデータソースの初期キャパシティとして5つの接続が割り当てられていることを確認します。確認するに は、新しく作成されたデータソースをクリックします。
  24. Connection Pool」タブをクリックします。
  25. Initial Capacityを5に設定し、Maximum Capacityを50に設定します。
  26. Save」をクリックします。 新しく作成されたデータソースは、次のようになります。

     

    <?xml version = '1.0' encoding = 'UTF-8'?>
    <?jdbc-data-source xmlns="http://xmlns.oracle.com/weblogic/jdbc-data-source"
        xmlns:sec="http://xmlns.oracle.com/weblogic/security"
        xmlns:wls="http://xmlns.oracle.com/weblogic/security/wls"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.oracle.com/weblogic/jdbc-data-source
        http://xmlns.oracle.com/weblogic/jdbc-data-source/1.0/jdbc-data-source.xsd">
      <?name>jdbc/gridlinkDS<?/name>
      <?jdbc-driver-params>
        <?url>jdbc:oracle:thin:@apctcsol1.au.oracle.com:1521/pas_srv<?/url>
        <?driver-name>oracle.jdbc.OracleDriver<?/driver-name>
        <?properties>
          <?property>
            <?name>user<?/name>
            <?value>scott<?/value>
          <?/property>
        <?/properties>
        <?password-encrypted>{AES}V1hP4cnmf/riMy6IQmYzFa57tMup1zorD1EYftoN4PQ=<?/password-encrypted>
      <?/jdbc-driver-params>
      <?jdbc-connection-pool-params>
        <?initial-capacity>5<?/initial-capacity>
        <?max-capacity>50<?/max-capacity>
        <?capacity-increment>1<?/capacity-increment>
        <?test-table-name>SQL SELECT 1 FROM DUAL<?/test-table-name>
        <?statement-cache-size>10<?/statement-cache-size>
        <?statement-cache-type>LRU<?/statement-cache-type>
      <?/jdbc-connection-pool-params>
      <?jdbc-data-source-params>
        <?jndi-name>jdbc/gridlinkDS<?/jndi-name>
        <?global-transactions-protocol>OnePhaseCommit<?/global-transactions-protocol>
      <?/jdbc-data-source-params>
      <?jdbc-oracle-params>
        <?fan-enabled>true<?/fan-enabled>
        <?ons-node-list>auw2k3.au.oracle.com:6200,auw2k4.au.oracle.com:6200<?/ons-node-list>
        <?ons-wallet-file><?/ons-wallet-file>
      <?/jdbc-oracle-params>
    <?/jdbc-data-source>

     

データソースのテスト

次のデモを使用すると、JDBC GridLinkデータソースをWebアプリケーションから検証できます。

  1. ファイル・システムにgridlink_ha.zipファイルをダウンロードし、解凍します。
  2. 管理対象サーバーにgridlank_ha.warファイルをデプ ロイします。 デプロイが完了すると、WebLogicコンソールは次のように表示されます。

     

    wls-jdbc-gridlink-howto-f8
  3. 次のURLを使用して、アプリケーションを起動します。

    http://<host>:<port>/gridlinkha/
  4. ここで、次に示すとおりに5つの接続を取得し、JDBC GridLinkデータソースのテストを実行して、Oracle RACノード間でのロードバランシングを確認します。 このHow-Toドキュメントの手順に従っている場合、データソースのロケーションは正しい名前にデフォルト設定されていますが、それ以外の場合は指定し たJNDIロケーションを入力します。

     

    wls-jdbc-gridlink-howto-f9
  5. Test JDBC GridLink Data Source」ボタンをクリックします。

     

    wls-jdbc-gridlink-howto-f10 
  6. ここで、次に示すとおりに、Oracle RACインスタンスの1つを停止します。 次の例では、強制終了を実行してインスタンス・クラッシュをシミュレートします。

    [oradb1@auw2k3 admin]$ sqlplus / as sysdba
    SQL*Plus: Release 11.2.0.2.0 Production on Tue Feb 1 09:34:50 2011

    Copyright (c) 1982, 2010, Oracle.  All rights reserved.


    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Data Mining and Real Application Testing options

    SQL> shutdown abort; ORACLE instance shut down.
    SQL>

       

  7. テストを再実行し、今回はJDBC GridLinkデータソースからこのインスタンスがこれ以上返されないことを確認します。 ノードauw2k3が存在しないことが分かります。  

     

    wls-jdbc-gridlink-howto-f11
  8. 先ほど停止したインスタンスを再起動します。
    SQL> startup; ORACLE instance started.

    Total System Global Area  790941696 bytes
    Fixed Size                  1347084 bytes
    Variable Size             587203060 bytes
    Database Buffers          197132288 bytes
    Redo Buffers                5259264 bytes
    Database mounted.
    Database opened.
    SQL>
    <
  9. Webテストを再実行し、対象インスタンスがJDBC GridLinkデータソースに含まれていることを確認します。

    wls-jdbc-gridlink-howto-f12
  10. ここで、次のようなURLを使用してコンソール・アプリケーションにログインし、データソースのアクティビティを監視します。

    http://<host>:<port>/console

  11. Domain Structure」ツリーの下の「Services」 ノードを開きます。
  12. Data Sources」をクリックします。
  13. jdbc/gridlinkDS」をクリックします。
  14. Monitoring」タブをクリックします。
  15. GridLinkデータソースのターゲットとして指定した管理対象サーバーをクリックします。
  16. 次のように、GridLinkデータソースが接続されているインスタンスが表示されます。

    wls-jdbc-gridlink-howto-f13

グラフィカル表示を確認するには、次の手順に従います。

  1. http://<host>:<port>/console/dashboard へ移動します。
  2. GridLinkデータソースのターゲットとして指定した管理対象サーバーの「+」 アイコンをクリックします。
  3. JDBC Data Sources for {管理対象サーバー名}」 をクリックします。
  4. 画面上部にある「Start」 アイコンをクリックし、監視を開始します。 テストを数回実行していくつかの接続を取得した後で、次のグラフを確認します。

    wls-jdbc-gridlink-howto-f14

結論

Oracle WebLogic 10.3.4とGridLinkデータソースについて、詳しくは次のリンクを参照してください。