Middleware
WebLogic Server
Pas ApicellaおよびFrances Zhao
2011年3月公開
Oracle WebLogic ServerでOracle 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 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 Databaseはランタイムのロードバランシング・サービスを提供しています。このサービスは、DBAによって設定されたパフォーマンス目標に基づい て、複数のRACインスタンス間で接続を分散します。ロードバランシングのアドバイザリ・サービスによってFANイベントが発行され、接続の転送先に関す るアドバイスを含むクラスタの最新状態がクライアントに通知されます。 GridLinkデータソースはXA環境と非XA環境にロードバランシング機能を提供します。 GridLinkデータソースはランタイム接続ロードバランシングを使用することで、データベースによって発行されたOracle FANイベントに基づいて、Oracle RACインスタンスに対する接続を分散します。 これによって、データベース・トポロジに関係なく、GridLinkデータソースを介してデータベース接続がロードバランシングされるため、データソース 構成が簡素化され、パフォーマンスが向上します。
WebLogic Serverでランタイム接続ロードバランシングを利用すると、次の利点があります。
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アフィニティといった優れた機能を利用できるように
なります。
JDBC GridLinkデータソースを作成する前に、SQL*Plusと各種のコマンドを使用して、有効なOracle RAC 11g Release 2 SCANが設定されていることを確認する必要があります。
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)
)
)
次に示すとおり、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>
次に示す問合せを実行し、クラスタ内で接続しているインスタンスを確認します。
ステップ2とステップ3を何度か繰り返して、クラスタ内の異なるインスタンスに接続していることを確認します。 次の出力結果から、異なるノード上にある、auw2k3とauw2k4と いう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
次の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データソースの作成
次のようなURLを使用して、WebLogicコンソールへログインします。
http://<host>:<port>/console
名前:jdbc/gridlinkDS
JNDI名:jdbc/gridlinkDS

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


[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




<?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アプリケーションから検証できます。


[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>

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>
<

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

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

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