Oracle Tuxedo アプリケーションの設定

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

Tuxedo を Oracle Real Application Clusters (RAC) と共に使用

ここでは、以下の内容について説明します。

 


概要

Oracle Real Application Clusters (RAC) は、複製された Oracle データベース サービスを使用して同一の Oracle データベースにアクセスするマシンのクラスタ化をサポートします。Oracle RAC を使用すると、物理的に異なる Oracle サーバ マシン上に存在する複数のインスタンスから同一の Oracle データベースに同時アクセスできます。また、失敗したデータベース インスタンスを別の場所にフェイルオーバすることが可能です。

ただし、XA トランザクション環境でこれらの複製やフェイルオーバの機能を利用したり、最適な RAC パフォーマンスを実現したりするには、トランザクション モニタ側に Oracle RAC 用の特殊サポートが必要になります。これは Oracle 10g では、同一 XA トランザクション内の複数の RAC インスタンスから同一データベースにアクセスすることは許可されないためです。

注意 : Oracle 11g では、同一 XA トランザクション内の複数の RAC インスタンスから同一データベースにアクセスできますが、特定の XA トランザクション内でのアクセスがすべて同一 RAC インスタンスから発生する場合は、パフォーマンスが向上する可能性があります。

さらに Oracle 10gR1 では、RAC インスタンス間のトランザクション フェイルオーバの準備に、トランザクション モニタが必要です。

Tuxedo 10g リリース 3 (10.3) には Oracle RAC 用のトランザクション モニタ サポートが用意されており、管理者は個々の RAC インスタンスに関連付けるグループのリストを指定できます。これにより、同じ RAC データベースの異なるインスタンスに関連付けられたグループが、同一トランザクションに参加しないことが保証されます。Tuxedo の Oracle RAC 用サポートには、Oracle 10gR1 の使用時に必要な、RAC フェイルオーバ イベントを Tuxedo トランザクション マネージャ サーバ (TMS) プロセスに通知する機能も含まれています。

このため、TMS は RAC フェイルオーバ回復の必要に応じて、Oracle 10gR1 の準備されたトランザクションのリストを Oracle から再取得できます。

注意 : Oracle 10gR2 を使用している場合には、管理者は Oracle DTP サービスを使用して Oracle RAC システムにアクセスする必要があります。この DTP サービス名は、関連付けられる Tuxedo グループの OPENINFO 文字列に指定されていなければなりません。Oracle 10gR2 はサービス名を検証し、必要に応じてサービス名を代替インスタンスに移行します。
注意 : Oracle 11g 以降のリリースを使用している場合は、特別なコンフィグレーションを行わなくても、必要に応じてサービス名が透過的かつ自動的に代替インスタンスに移行されます。

 


制限事項

 


前提条件

ソフトウェア要件

プラットフォーム固有のソフトウェア要件については、『OracleTuxedo システムのインストール』の「Tuxedo 10g リリース 3 (10.3) プラットフォーム データ シート」を参照してください。

 


Oracle RAC を使用するための Tuxedo のコンフィグレーション

Tuxedo で Oracle RAC をサポートするためには、次の 2 つの作業が必要です。

以下のコマンドおよび環境変数は、Tuxedo の Oracle RAC サポートのコンフィグレーションでのみ使用されます。

トランザクション伝播のコンフィグレーション

Oracle 10gR1 では、同一 XA トランザクション内の複数の RAC インスタンスから同一データベースにアクセスすることは許可されません。さらに Oracle 10gR1 では、RAC インスタンス間のトランザクション フェイルオーバの準備に、トランザクション モニタが必要です。

Oracle 10gR2 では、複数の異なる RAC インスタンスが RAC 内の異なるトランザクション ブランチで動作できますが、トランザクション ブランチが異なるインスタンス上にある場合は、それらのブランチは疎結合され、ロックを共有しません。最適なコミット パフォーマンスを実現するには、所定の XA トランザクション内では単一の RAC インスタンスのみを使用することが重要です。

このため、XA トランザクションを単一の RAC インスタンスに関連付けることは、Oracle 10gR2 でも引き続き重要になります。Oracle XA での RAC の使用の詳細については、『Oracle Database Application Developer's Guide - Fundamentals』の「Developing Applications with Oracle XA」の章を参照してください。

TUXRACGROUPS 環境変数は、Tuxedo グループを Oracle RAC コンフィグレーションの特定のインスタンスと関連付けます。これにより、同一 RAC コンフィグレーションの異なるインスタンスに含まれるグループが、同一 XA トランザクション内に混在するのを防止できます。

注意 : Oracle 10g を使用している場合は、単一のトランザクションが複数の Oracle RAC インスタンスにまたがらないようにします。各トランザクションに参加するグループは、そのトランザクションの開始時に決定されます。個々のトランザクションは、各 RAC コンフィグレーションの 1 つの特定のインスタンスに割り当てられます。この割り当てでは、RAC コンフィグレーションの各インスタンスに含まれるグループが、それぞれ等しい数のトランザクションに割り当てられます。
注意 : Oracle 11g では、複数の異なる RAC インスタンスが RAC 内の異なるトランザクション ブランチで動作でき、トランザクション ブランチが異なるインスタンス上にある場合は、それらのブランチは密結合され、ロックとリソースを共有します。したがって、Oracle 11g を使用している場合は TUXRACGROUPS 環境変数は必要ありません。この環境変数は Oracle 11g でも機能し、この環境変数を使用して Tuxedo グループを Oracle RAC コンフィグレーションの特定のインスタンスに関連付けることができます。

TUXRACGROUPS

TUXRACGROUPS 環境変数により特定の RAC コンフィグレーションに関連付けられるグループが指定され、同一トランザクション内のサービス呼び出しが同一 RAC コンフィグレーションの異なるインスタンスとして識別される複数のグループに送信されるのを防止します。
警告 : TUXRACGROUPS 環境変数を使用する場合は、この環境変数をコンフィグレーション内のすべてのマシン上で設定する必要があり、すべてのマシン上で同じグループ セットを同じ順番で指定しなければなりません。
警告 : この制限事項を守らないと、一貫性のないグループ セットがトランザクション内に含まれるおそれがあります。この不整合はコミット時に調整グループによって検出され、トランザクションがロールバックされて、エラー メッセージが userlog に送られます。

TUXRACGROUPS の構文

TUXRACGROUPS 環境変数は、Oracle RAC グループ コンフィグレーションの定義に使用します。構文は次のとおりです。

TUXRACGROUPS="G1,G2,…,Gm;H1,H2,…,Hn[;…]:I1,I2,…,Io;J1,J2,…,Jp[;…][:…]"

カンマ (,) 区切りのリスト

Oracle RAC コンフィグレーションの同一インスタンスに含まれるグループを指定します。カンマ区切りのリスト内に指定した複数のグループは、同一トランザクション内で共に使用できます。
注意 : 一般的には、1 つのデータベース インスタンスに関連付けられたすべてのサービスは、単一グループ内に配置されます。そのため通常は、TUXRACGROUPS の値にカンマは必要ありません。

セミコロン (;) 区切りのリスト

Oracle RAC コンフィグレーションの異なるインスタンスに含まれるグループ セットを指定します。同一 RAC データベース コンフィグレーションの異なる RAC インスタンスに含まれるグループは、同一トランザクション内で共に使用することはできません。
TUXRACGROUPS 環境変数は、Oracle RAC コンフィグレーションの異なるインスタンスに関連付けられたグループを指定するための変数です。そのため、TUXRACGROUPS 環境変数を使用するすべてのアプリケーションで、環境変数の値に少なくとも 1 つのセミコロンが必要です。

コロン (:) 区切りのリスト

任意の Oracle RAC コンフィグレーションに関する情報と、別の Oracle RAC コンフィグレーションに関する情報と区別するために使用します。コロンで区切られた個々の Oracle RAC データベース コンフィグレーションは、相互に完全に独立しています。
注意 : 一般的には、1 つの RAC データベース コンフィグレーションのみを指定します。そのため通常は、TUXRACGROUPS の値にコロンは必要ありません。

TUXRACGROUPS の例

この節では、4 つの異なる Oracle RAC グループ コンフィグレーションの定義例を示します。

例 1 : 単純なコンフィグレーション

TUXRACGROUPS="G1;G2"

図 6-1 は、単純な Oracle RAC コンフィグレーションの例です。

この例では、1 つの Oracle データベース (ORA1) に対して 2 つの Oracle RAC インスタンスが存在し、各インスタンスにそれぞれ 1 つのグループが含まれています。

この場合、同じトランザクション要求を GROUP1GROUP2 の両方に送信することはできません。これは、各グループが同一の Oracle RAC データベース コンフィグレーションにマップされた異なるインスタンスを介してデータベース サービスにアクセスするためです。

図 6-1 (ORA1) 単純なコンフィグレーション

(ORA1) 単純なコンフィグレーション

例 2 : 1 つの Oracle RAC インスタンスに複数のグループ (ファイル内に複数あり)

TUXRACGROUPS="GROUP1;GROUP2:GROUP3;GROUP4,GROUP5"

図 6-2 は、1 つのインスタンスに複数のグループを追加した例です。

この例では、2 つの Oracle データベース ORA1ORA2 が存在しています。ORA1 はマシン固有のサービス ORA1SITE1ORA1SITE2 を、ORA2 はマシン固有のサービス ORA2SITE1ORA2SITE2 を提供します。このコンフィグレーションは、Oracle RAC コンフィグレーションの各インスタンスに関連付けられたグループに、ほぼ同数のトランザクションを割り当て、同じサービスをコンフィグレーションすることを目的としています。

この場合、同じトランザクション要求を GROUP1GROUP2 の両方に送信することはできません。これは、各グループが同一の Oracle RAC データベース コンフィグレーションにマップされた異なるインスタンスを介してデータベース サービスにアクセスするためです。GROUP3GROUP4、または GROUP3GROUP5 についても同様で、同じトランザクションをこれらのグループの両方に送信することはできません。

GROUP4GROUP5 は、どちらも同じ Oracle RAC データベース コンフィグレーションの同じデータベース サービスにアクセスするため、これらのグループは共に使用できます。また、GROUP1GROUP4 は、それぞれ異なる RAC データベース コンフィグレーションにアクセスするため、これらのグループも共に使用できます。このコンフィグレーションに GROUP6 も含まれており、GROUP6 が Oracle RAC グループでなければ、いずれのグループとも組み合わせて使用できます。

注意 : 各 Oracle RAC インスタンスに含まれるグループの数は、同一である必要はありません。
図 6-2 (ORA2) 1 つの Oracle RAC インスタンス内に複数のグループが存在

(ORA2) 1 つの Oracle RAC インスタンス内に複数のグループが存在

UBBCONFIG ファイルの *GROUPS セクションと *SERVERS セクションは、次のようになります。

コード リスト 6-1 UBBCONFIG ファイルの *GROUPS セクションと *SERVERS セクションの例
*GROUPS
DEFAULT: TMSNAME=TMS_ORA TMSCOUNT=2
GROUP1    LMID=SITE1   GRPNO=1
OPENINFO="ORACLE_XA:Oracle_XA+Acc=P/scott/tiger+SqlNet=ORA1SITE1+SesTm=100+LogDir=.+MaxCur=5"
GROUP2    LMID=SITE2   GRPNO=2
OPENINFO="ORACLE_XA:Oracle_XA+Acc=P/scott/tiger+SqlNet=ORA1SITE2+SesTm=100+LogDir=.+MaxCur=5"
GROUP3    LMID=SITE1   GRPNO=3
OPENINFO="ORACLE_XA:Oracle_XA+Acc=P/scott/tiger+SqlNet=ORA2SITE1+SesTm=100+LogDir=.+MaxCur=5"
GROUP4    LMID=SITE2   GRPNO=4
OPENINFO="ORACLE_XA:Oracle_XA+Acc=P/scott/tiger+SqlNet=ORA2SITE2+SesTm=100+LogDir=.+MaxCur=5"
GROUP5    LMID=SITE2   GRPNO=5
OPENINFO="ORACLE_XA:Oracle_XA+Acc=P/scott/tiger+SqlNet=ORA2SITE2+SesTm=100+LogDir=.+MaxCur=5"
GROUP6    LMID=SITE1   GRPNO=6  TMSNAME=TMS_QM
OPENINFO="TUXEDO/QM:/home/myapplication/QUE:QSPACE"
*SERVERS
DEFAULT: RESTART=Y MAXGEN=5 REPLYQ=Y CLOPT="-A"
EMPLOYEE_SVR SRVGRP=GROUP1 SRVID=1
EMPLOYEE_SVR SRVGRP=GROUP2 SRVID=2
BANKING_SVR SRVGRP=GROUP3 SRVID=3
BANKING_SVR SRVGRP=GROUP4 SRVID=4
BANKING_SVR SRVGRP=GROUP5 SRVID=5
注意 : GROUP4GROUP5 には同じ OPENINFO 文字列が指定されています。これは、どちらのグループも同じデータベースが提供する同じデータベース サービスを使用することを意味しています。
注意 : Oracle グループ用の OPENINFO 文字列を *GROUPS セクションに指定する方法は、RAC なしに Oracle を使用する場合と変わりません。Oracle グループ用の OPENINFO 文字列を指定する方法の詳細については、『Oracle Database Application Developer's Guide - Fundamentals』の「Developing Applications with Oracle XA」の章を参照してください。
例 3 : 複数の Oracle RAC インスタンスに複数のグループ (ファイル内に複数あり)

TUXRACGROUPS="GROUP11,GROUP12,GROUP13;GROUP21,GROUP22:GROUP3;GROUP4, GROUP5"

図 6-3 は、複数のインスタンスに複数のグループを追加する例を示したものです。

この例は、1 つ前で説明した例と似ていますが、GROUP11GROUP12、および GROUP13 はいずれも 1 番目の RAC コンフィグレーションの 1 番目の RAC インスタンスに、GROUP21GROUP22 は 2 番目の RAC インスタンスに関連付けられています。

このコンフィグレーションで、トランザクション内の最初のサービス呼び出しが GROUP12 に渡された場合、このトランザクション内のその他のサービス呼び出しは GROUP11GROUP12、または GROUP13 には送信できますが、GROUP21 または GROUP22 に送信することはできません。

許可されたグループ内では宣言されていないが、1 つまたは複数の禁止されたグループ内で使用可能なサービスに対して、トランザクション型のサービス呼び出しが実行された場合は、以下のいずれかの結果になります。

TUXRACGROUPS 環境変数に定義されている各 RAC コンフィグレーションについて、Tuxedo では、トランザクションの開始時に、そのコンフィグレーション内のどの RAC グループをトランザクションに参加させるかが決定します。

TUXRACGROUPS を使用したトランザクション作成の特徴

トランザクションは、存在している間は Oracle RAC インスタンスに固定されます。このことは、このようなトランザクションの呼び出しフローで Oracle RAC に関連付けられた Tuxedo サービスに常にアクセスできるかどうかに関係なく当てはまります。

トランザクションの作成方法は、次の 2 とおりです。

TUXRACGROUPS を使用したデータ依存型ルーティング

データ依存型ルーティングは、Oracle RAC コンフィグレーションをサポートするように拡張されています。UBBCONFIG の *ROUTING セクションには、ルーティング範囲が同一のグループを複数定義することができます。 コード リスト 6-2 は、同じ範囲の値を持つ異なる Tuxedo グループの例を示しています。

コード リスト 6-2 同じ範囲の値を持つ Tuxedo グループ
RANGES="1-5:GROUP1A, 1-5:GROUP1B, 6-10:GROUP2B, 6-10:GROUP2A, *:*"

この例では、GROUP1AGROUP1B のデータ範囲が同じで、GROUP2AGROUP2B のデータ範囲が同じです。Tuxedo は、トランザクションが属する Oracle RAC インスタンスに関連付けられているグループに、サービス要求をルーティングします。

RAC グループにより提供されるトランザクション サービスに対するデータ依存型ルーティングでは、以下の場合にしか目的の結果を得られません。

トランザクション ルーティングの開始時に、現在のトランザクションで許可されていないグループはすべて無視されます。ルーティングの決定では、以下のグループのみが対象となります。

非トランザクション型要求に対するルーティングには、すべてのグループが参加可能です。サービスは、UBBCONFIG ファイル内の *ROUTING セクションの RANGES フィールドに指定されたデータ値と一致した最初のグループにルーティングされます。特定の範囲の値に対する非トランザクション型要求はすべて、1 つの Oracle RAC インスタンスによってのみ処理されます。

トランザクション型と非トランザクション型が混在する要求のルーティングでは、一部のアプリケーションが非トランザクション型要求のロード バランシングを要求しないことがあります。個々のデータ値について各アプリケーション内で最初に記述される RAC インスタンスはそれぞれ異なるため、非トランザクション型要求については、個々の RAC インスタンスで提供される複数のサービス間で適宜ロード バランシングが実施されます。

非トランザクション型要求の場合、同じルーティング範囲に関連付けられたすべてのグループ間でロード バランシングを実施する方法はありません。ロード バランシングを 1 つずつ実施する場合は、以下を実行します。

図 6-4 は、Oracle RAC コンフィグレーション内でのトランザクション型/非トランザクション型要求のルーティング例を示したものです。

図 6-4 トランザクション型/非トランザクション型要求のルーティング

トランザクション型/非トランザクション型要求のルーティング

この例で示したコンフィグレーションは、2 つの Oracle RAC インスタンスで構成されています。TUXRACGROUPS にリストされていない 1 つのグループに 1,000 個のトランザクションが作成されている場合、約 500 個のトランザクションが Oracle RAC インスタンス 1 に固定され、GROUP1AGROUP2A にのみアクセスできます。残りの 500 個のトランザクションは Oracle RAC インスタンス 2 に固定され、GROUP1BGROUP2B にのみアクセスできます。

コード リスト 6-3 は、このコンフィグレーションに対する UBBCONFIG ファイルの *SERVICES セクションと *ROUTING セクションの例です。

コード リスト 6-3 UBBCONFIG ファイルの *SERVICES セクションと *ROUTING セクションの例
*SERVICES
DEPOSIT SRVGRP=GROUP1A ROUTING=MYROUTE
DEPOSIT SRVGRP=GROUP2A ROUTING=MYROUTE
DEPOSIT SRVGRP=GROUP1B ROUTING=MYROUTE
DEPOSIT SRVGRP=GROUP2B ROUTING=MYROUTE
*ROUTING
MYROUTE FIELD=”BRANCH_ID”
RANGES=”1-5:GROUP1A, 1-5:GROUP1B, 6-10:GROUP2B, 6-10:GROUP2A, *:*”
BUFTYPE=”FML32”

GROUP1AGROUP2A は Oracle RAC インスタンス 1 に、GROUP1BGROUP2B は Oracle RAC インスタンス 2 に所属しています。BRANCH_ID が 1 ~ 5 の要求は、GROUP1A または GROUP1B で処理されます。BRANCH_ID が 6 ~ 10 の要求は、GROUP2A または GROUP2B で処理されます。

トランザクション型要求の場合は、Oracle RAC インスタンス 1 に固定されたすべてのトランザクションについてはブランチ 1 ~ 5 が GROUP1A に、ブランチ 6 ~ 10 が GROUP2A にマップされ、Oracle RAC インスタンス 2 に割り当てられた残りの半分についてはブランチ 1 ~ 5 が GROUP1B に、ブランチ 6 ~ 10 が GROUP2B にマップされます。

非トランザクション型要求の場合は、ブランチ 1 ~ 5 が GROUP1A に、ブランチ 6 ~ 10 が GROUP2B にマップされます。これは、指定されたグループのうち、これらのグループがそれぞれのルーティング範囲に最初に一致するためです。無効な BRANCH_ID が指定された要求は、許可されている任意のグループにマップされます。

注意 : RAC インスタンス間における一部の非トランザクション型のロード バランシングを達成するために、Oracle RAC インスタンス 1 は最初に 1 つのデータ範囲に指定され、RAC インスタンス 2 は最初にその残りのデータ範囲に指定されます。

特定の Oracle RAC インスタンスへのトランザクションの割り当て

現在の環境を複数のマシンに分割することもできます。たとえば、Tuxedo と Oracle RAC が別々の建物に配置されている場合、Oracle RAC インスタンス 1 にのみアクセスするマシン群と Oracle RAC インスタンス 2 のみにアクセスするマシン群を 1 つの Tuxedo ドメインで管理して地域的な独立性を維持することも可能です。呼び出しが特定の建物の外に送信されるのをできる限り少なくするように環境をコンフィグレーションできます。

図 6-5 は、マシン 1 (GROUP1AGROUP2A が所属) とマシン 2(GROUP1BGROUP2B が所属) の例を示しています。また、Tuxedo /WS クライアント、Tuxedo ネイティブ クライアント、Tuxedo /Q の場合や MQ Series などの別のリソース マネージャとリンクしているサーバの場合、Tuxedo /Domain ゲートウェイから呼び出しが実行されてトランザクションが作成される場合もあります。

要求が送信される場合は必ず、トランザクションはローカル マシンに固定されて、できる限り異なるマシン間のホップを回避する必要があります。

図 6-5 特定の Oracle RAC インスタンスへのトランザクションの割り当て

特定の Oracle RAC インスタンスへのトランザクションの割り当て

コード リスト 6-4 は、2 つの物理マシン TUXM1 および TUXM2 で Tuxedo が実行されている場合の UBBCONFIG ファイルの例を示しています。両方のマシンの 2 つのグループが Oracle RAC に接続しています。グループ GROUP1AGROUP2A は RAC インスタンス 1 に接続しているマシン TUXM1 上で実行され、グループ GROUP1BGROUP2B は RAC インスタンス 2 に接続しているマシン TUXM2 上で実行されています。

コード リスト 6-4 UBBCONFIG ファイルの例
*MACHINES
DEFAULT:
	APPDIR="/path/to/appdir"
ENVFILE="/path/to/oracle.env"
TUXDIR="/path/to/tuxdir"
TUXCONFIG="/path/to/tuxconfig"
TLOGDEVICE="/path/to/TLOG"

"machine1" LMID=TUXM1

"machine2" LMID=TUXM2

*GROUPS
ADMGRPA LMID=TUXM1 GRPNO=10 OPENINFO=NONE
ADMGRPB LMID=TUXM2 GRPNO=20 OPENINFO=NONE

GROUP1A LMID=TUXM1 GRPNO=101 TMSNAME=TMS_ORA
OPENINFO="Oracle_XA:Oracle_XA+ACC=P/user/password+Sqlnet=ORA1SITE1+SesTm=100+LogDir=.+MaxCur=5"
GROUP1B LMID=TUXM2 GRPNO=102 TMSNAME=TMS_ORA
OPENINFO="Oracle_XA:Oracle_XA+ACC=P/user/password+Sqlnet=ORA1SITE2+SesTm=100+LogDir=.+MaxCur=5"

GROUP2A LMID=TUXM1 GRPNO=201 TMSNAME=TMS_ORA
OPENINFO="Oracle_XA:Oracle_XA+ACC=P/user/password+Sqlnet=ORA1SITE1+SesTm=100+LogDir=.+MaxCur=5"
GROUP2B LMID=TUXM2 GRPNO=202 TMSNAME=TMS_ORA
OPENINFO="Oracle_XA:Oracle_XA+ACC=P/user/password+Sqlnet=ORA1SITE2+SesTm=100+LogDir=.+MaxCur=5"

GROUP_TDOM_A LMID=TUXM1 GRPNO=301
GROUP_TDOM_B LMID=TUXM2 GRPNO=302

GROUP_CLIENT_A LMID=TUXM1 GRPNO=401 TMSNAME=TMS
GROUP_CLIENT_B LMID=TUXM2 GRPNO=402 TMSNAME=TMS

*SERVERS
DEFAULT: RESTART=Y MAXGEN=5 REPLYQ=Y CLOPT="-A"

TMSYSEVT SRVGRP="ADMGRPA" SRVID=10
TMUSREVT SRVGRP="ADMGRPA" SRVID=20

TMSYSEVT SRVGRP="ADMGRPB" SRVID=10 CLOPT="-A -- -S "
TMUSREVT SRVGRP="ADMGRPB" SRVID=20 CLOPT="-A -- -S "

EMPLOYEE_SVR SRVGRP=GROUP1A SRVID=1
EMPLOYEE_SVR SRVGRP=GROUP1B SRVID=2
BANKING_SVR SRVGRP=GROUP2A SRVID=3
BANKING_SVR SRVGRP=GROUP2B SRVID=4

DMADM SRVGRP="GROUP_TDOM_A" SRVID=100
GWADM SRVGRP="GROUP_TDOM_A" SRVID=110
GWTDOMAIN SRVGRP="GROUP_TDOM_A" SRVID=111 REPLYQ=Y RQADDR="GWGRP_M1"
GWADM SRVGRP="GROUP_TDOM_B" SRVID=110
GWTDOMAIN SRVGRP="GROUP_TDOM_B" SRVID=111 REPLYQ=Y RQADDR="GWGRP_M2"

また、両方のマシン上に、管理サービス用のグループ、Tuxedo /Domain ゲートウェイ用のグループ、ネイティブ Tuxedo クライアントのグループがそれぞれ 1 つずつ存在しています。トランザクションはすべて GWTDOMAIN とネイティブ クライアントによって作成されます。オープンされたトランザクションが適切な RAC インスタンスに所属してローカルで処理されるためには、コード リスト 6-5 に示されているように、GWTDOMAIN とネイティブ Tuxedo クライアントは直接 Oracle RAC に接続しない場合でも TUXRACGROUPS に含まれている必要があります。

注意 : 正しい動作が保証されるためには、ネイティブ クライアントでは tpinfo->grpname にローカル グループを設定する必要があります。詳細については、「Tuxedo ネイティブ クライアントによって作成されたトランザクションがリモート マシンに送信されるのを回避する」を参照してください。
コード リスト 6-5 TUXGROUPS
TUXRACGROUPS="GROUP_TDOM_A,GROUP_CLIENT_A,GROUP1A,GROUP2A;GROUP_TDOM_B,
GROUP_CLIENT_B,GROUP1B,GROUP2B"

TUXRAGROUPS トランザクションの事例

トランザクションの外部で実行されたサービス呼び出しの処理

トランザクションが含まれない限り、Tuxedo はロードが可能な間はローカル マシン上でできる限り多くの要求を処理しようします。アイドル状態のローカル サービスがない場合にのみ、ロード バランシング アルゴリズムに基づいて要求がリモート マシンに送信されます。つまり、すべてのサービスがそれぞれのマシン上で利用できる場合は、リモート マシンに要求が送信される心配はないということです。

管理者は、Oracle RM とリンクしていない場合や Oracle RAC インスタンスに物理的に関連付けられていない場合でも、呼び出しフローでアクセスされ、新しいトランザクションをオープンする候補となる TUXRACGROUPS 環境変数にすべてのサービス グループが含まれていることを常に確認する必要があります。環境変数 TUXRACGROUPS は、非トランザクション型のサービス呼び出しに対しては影響を及ぼしません。

外部のリソース マネージャを操作しているグループによって作成されたトランザクションがリモート マシンに送信されるのを回避する

Tuxedo サーバが別の RM (MQSeries など) や別のデータベースで構築されている場合、このグループを TUXRACGROUPS 環境変数に含めることによって、新しく開始したトランザクションをローカル マシンに固定することができます。

コード リスト 6-6 MQSeries の例
TUXRACGROUPS="MQSGROUPA,GROUP1A,GROUP2A;MQSGROUPB,GROUP1B,GROUP2B"

この例では、MQSGROUPAGROUP1A、および GROUP2A がマシン 1 に配置され、MQSGROUPBGROUP1B、および GROUP2B がマシン 2 に配置されています。

グループ MQSGROUPA 内のサーバによってトランザクションが作成されると、グループ GROUP1AGROUP2AGROUP1B、および GROUP2B のサービスに対するすべての Tuxedo サービス呼び出しが GROUP1AGROUP2A にのみ送信されます。GROUP1BGROUP2B は、RAC インスタンス 2 に属していて、トランザクションがグループ MQSGROUPA を介して RAC インスタンス 1 で作成されたために無視されます。

GWTDOMAIN によって作成されたトランザクションがリモート マシンに送信されるのを回避する

各マシン上のローカル Tuxedo /Domain ゲートウェイで作成し、コード リスト 6-7 に示されているように TUXRACGROUPS 環境変数を設定します。

コード リスト 6-7 GWTDOMAIN の例
TUXRACGROUPS="GWTGROUPA,GROUP1A,GROUP2A;GWTGROUPB,GROUP1B,GROUP2B"

この例では、GWTGROUPAGROUP1A、および GROUP2A がマシン 1 に配置され、GWTGROUPBGROUP1B、および GROUP2B がマシン 2 に配置されています。

マシン 1 上の GWTDOMAIN が外部要求を受信して新しいトランザクションを作成すると、グループ GROUP1AGROUP2AGROUP1B、および GROUP2B のサービスに対するすべての Tuxedo サービス呼び出しが GROUP1AGROUP2A にのみ送信されます。GROUP1BGROUP2B は、RAC インスタンス 2 に属していて、トランザクションがグループ GWTGROUPA を介して RAC インスタンス 1 で作成されたために無視されます。

TMQFORWARD によって作成されたトランザクションがリモート マシンに送信されるのを回避する

各マシン上にローカル Tuxedo /Q コンフィグレーションを作成し、コード リスト 6-8 に示されているように TUXRACGROUPS 環境変数を設定します。

コード リスト 6-8 TMQFORWARD の例
TUXRACGROUPS="QUEUEGROUPA,GROUP1A,GROUP2A;QUEUEGROUPB,GROUP1B,GROUP2B"

この例では、QUEUEGROUPAGROUP1A、および GROUP2A がマシン 1 に配置され、QUEUEGROUPBGROUP1B、および GROUP2B がマシン 2 に配置されています。

マシン 1 上の TMQFORWARD がこのような Oracle サービスに新しいメッセージをトランザクションとして送信すると、グループ GROUP1AGROUP2AGROUP1B、および GROUP2B のサービスに対するすべての Tuxedo サービス呼び出しが GROUP1AGROUP2A にのみ送信されます。GROUP1BGROUP2B は、RAC インスタンス 2 に属していて、トランザクションがグループ QUEUEGROUPA を介して RAC インスタンス 1 で作成されたために無視されます。

Tuxedo ネイティブ クライアントによって作成されたトランザクションがリモート マシンに送信されるのを回避する

ネイティブ クライアントを特定のサーバ グループにバインドすることもできます。そのためには、コマンド buildclient -r <RM_of_the_group> -f <source_file> -o <binary_file> を使用してクライアントをビルドし、使用するグループ名を指定して tpinit() を実行するだけです。

たとえば、2 つの追加グループ CLIENTGROUPACLIENTGROUPB を作成して、それぞれのグループで少なくとも 2 つの TMS を起動することができます。コード リスト 6-9 に示されているように TUXRACGROUPS 環境変数を設定します。

コード リスト 6-9 リモート マシンの例
TUXRACGROUPS="CLIENTGROUPA,GROUP1A,GROUP2A;CLIENTGROUPB,GROUP1B,GROUP2B"

tpinfo->grpnameCLIENTGROUPA が設定されている場合、TPINIT 構造体を指定して tpinit(TPINIT *tpinfo) を実行すると、クライアントが CLIENTGROUPA に関連付けられます。tpinfo->grpnameCLIENTGROUPB が設定されていると、クライアントが CLIENTGROUPB に関連付けられます。

マシン 1 上で CLIENTGROUPA が実行され、マシン 2 上で CLIENTGROUPB が実行されている場合、マシン 1 上のネイティブ クライアントは常に tpinfo->grpname = CLIENTGROUPA を指定して tpinit() を呼び出す必要があり、マシン 2 上のネイティブ クライアントは常に tpinfo->grpname = CLIENTGROUPB を指定して tpinit() を呼び出す必要があります。Tuxedo ネイティブ クライアントが tpbegin() を呼び出すと、トランザクションが RAC インスタンス 1 (CLIENTGROUPA の場合) または RAC インスタンス 2 (CLIENTGROUPB の場合) に関連付けられます。

Tuxedo /WS クライアントによって作成されたトランザクションがリモート マシンに送信されるのを回避する

ワークステーション クライアントの場合、grpname の値には NULL 文字列 (長さが 0 の文字列) を指定します。任意のグループ名を設定したり、/WS クライアントを特定のグループに固定したりすることはできません。 Tuxedo /WS クライアント内では tpbegin() は指定されません。オープンしているトランザクションはすべての RAC インスタンスに平等に配布されます。

Tuxedo /WS クライアントにおけるベスト プラクティスは、トランザクションがクライアントサイドで処理されるのを回避し、Tuxedo /WS クライアントによって呼び出される最初のサーバでトランザクションを開始することです。たとえば、UBBCONFIG ファイルの *SERVICES セクション内の呼び出されるサービスに対して AUTOTRAN パラメータを設定すると、自動的にトランザクションを作成させることができます。

トランザクション回復のコンフィグレーション

TMS_rac_refresh(1)XARETRYDURATIONSECONDS、および XARETRYINTERVAL は、トランザクション回復の処理にのみ使用されます。

TMS_rac_refresh(1) は、Oracle RAC グループ間のフェイルオーバが発生したときに呼び出されます。TMS_rac_refresh(1) は、コマンドラインから手動で実行しないでください。TMS_rac_refresh(1) の呼び出しには、Oracle Fast Application Notification (FAN) を使用します。

注意 : Oracle FAN のコンフィグレーション方法の詳細については、Oracle 10g のマニュアルを参照してください。

環境変数 XARETRYDURATIONSECONDSXARETRYINTERVAL は、Oracle RAC の要求に応じたトランザクション回復処理 (xa_recover()) の再試行に使用します。

XARETRYDURATIONSECONDS

TMS_rac_refresh(1) が呼び出されたときに、Tuxedo Transaction Manager Server (TMS) により xa_recover() 処理を再試行する間隔を指定します。この値が設定されていないか、0 に設定されている場合、xa_recover() は 1 回しか実行されません。
XARETRYDURATIONSECONDS のデフォルト値は 0 です。
注意 : Oracle 10.1 の場合は、XARETRYDURATIONSECONDS120 に設定することをお勧めします。

XARETRYINTERVAL

XARETRYDURATIONSECONDS に設定した値で xa_recover() 処理を再試行する間隔を秒単位で設定します。XARETRYINTERVAL 値は、XARETRYDURATIONSECONDS に 0 より大きい値を指定した場合にのみ適用されます。
XARETRYINTERVAL のデフォルト値は 30 です。

Oracle 10g Fast Application Notification (FAN) のコンフィグレーション

Tuxedo で Oracle RAC 用のコンフィグレーションをする上で重要になるのが、グループ フェイルオーバの発生時に適切なグループ パラメータを使って TMS_rac_refresh(1) を呼び出せるように、Oracle FAN を設定する作業です。グループ パラメータとグループ フェイルオーバの詳細については、「トランザクション伝播のコンフィグレーション」を参照してください。

Oracle FAN の詳細については、『Workload Management with Oracle Real Application Clusters (PDF) White Paper』を参照してください。

Oracle FAN スクリプトの例

次に、Oracle FAN スクリプトの例を示します。

コード リスト 6-10 Oracle FAN スクリプトの例
// このファイルは ORA_CRS_HOME/racg/usrco に配置すること //
------------------------------calout.sh-------------------------
#! /bin/ksh 

# イベントを解析

AWK=awk
NOTIFY_EVENTTYPE=$1 # イベント タイプ別に処理

for ARGS in $*
do
PROPERTY=`echo $ARGS|$AWK -F"=" '{print $1}'`
VALUE=`echo $ARGS|$AWK -F"=" '{print $2}'`
case ${PROPERTY} in
VERSION|version)NOTIFY_VERSION=$VALUE;;
SERVICE|service)NOTIFY_SERVICE=$VALUE;;
DATABASE|database)NOTIFY_DATABASE=$VALUE;;
INSTANCE|instance)NOTIFY_INSTANCE=$VALUE;;
HOST|host) NOTIFY_HOST=$VALUE ;;
STATUS|status) NOTIFY_STATUS=$VALUE;;
REASON|reason) NOTIFY_REASON=$VALUE;;
CARD|card) NOTIFY_CARDINALITY=$VALUE ;;
TIMESTAMP|timestamp) NOTIFY_LOGDATE=$VALUE;; # イベントを
取得
??:??:??)NOTIFY_LOGTIME=$PROPERTY;; # イベント時刻を取得
(hh24:mi:ss)
esac
done

#REFRESH_DIR 環境変数を設定
/home/oracle/callout.env

# イベント記録用のログを作成
FAN_LOGFILE=/home/oracle/app/products/10.1.0.3.0/db_1/calloutlog/`hostname`_upti
me.log
touch ${FAN_LOGFILE}
echo ${1} >>${FAN_LOGFILE}

# TMS_rac_refresh コマンドを呼び出し
if [ ${NOTIFY_EVENTTYPE} = "INSTANCE" -a ${NOTIFY_STATUS} = "down" ]
then
${REFRESH_DIR}/rac_refresh >> ${FAN_LOGFILE} 2>&1
fi
-----------------------------callout.sh end-----------------------------
-----------------------------callout.env----------------------------------
#! /bin/ksh
# TUXEDO と Oracle RAC サーバが同一マシン上にない場合
export REFRESH_DIR=/tmp
-----------------------------callout.env end------------------------------
-----------------------------rac_refresh----------------------------------
#! /bin/ksh
# TUXEDO と Oracle RAC サーバが別のマシン上にある場合は以下を実行

/home/oracle/callout.env

rsh -l ${LOGNAME} ${TUX_MASTER_MACHINE} ${REFRESH_DIR}/rac_refresh
>/tmp/run1.log 2>&1

rsh -l ${LOGNAME} ${TUX_NONMASTER_MACHINE}
${REFRESH_DIR}/rac_refresh >/tmp/run1.log 2>&1

# TUXEDO と Oracle RAC サーバが同じマシン上にある場合は、
# 以下の環境変数を設定
#export APPDIR=/tmp
#export ORACLE_HOME=/home/oracle/Ora10g
#export TUXDIR=/nfs/users/libo/r902/BJ/bld
#export PATH=.:${PATH}:${TUXDIR}/bin
#.$TUXDIR/tux.env
#export TUXCONFIG=${APPDIR} /tuxconfig

#invoke TMS_rac_refresh
#TMS_rac_refresh RACDBGRP1
#TMS_rac_refresh RACDBGRP3
-----------------------------rac_refresh end-----------------------------

Oracle 10gR2 を使用する場合のトランザクション回復のコンフィグレーション

Oracle 10gR2 では、トランザクション回復のコンフィグレーションが大幅に簡素化されています。Oracle RAC に関連付けられる各グループの OPENINFO 文字列で指定されたデータベース サービスを、DTP サービスとして Oracle で宣言する必要があります。

たとえば、コード リスト 6-1 では、GROUP1 はサービス ORA1SITE1 を介して Oracle にアクセスし、GROUP2 はサービス ORA1SITE2 を介して Oracle にアクセスしていました。Oracle 10gR2 では、サービス ORA1SITE1 を、優先インスタンス SITE1 および使用可能なインスタンス SITE2 と共に DTP=TRUE で宣言する必要があります。サービス ORA1SITE2 は、優先インスタンス SITE2 および使用可能なインスタンス SITE1 と共に DTP=TRUE で宣言します。同様のプロセスを、グループ GROUP3GROUP4、および GROUP5 にも適用しなければなりません。

異なる優先インスタンスを宣言することで、両方のインスタンスが使用可能になっている通常の動作時には、アプリケーションでロード バランシングの効果を得ることができます。

TUXRACGROUPS 環境変数の設定により、RAC コンフィグレーションの異なるインスタンスが同一のトランザクションで組み合わされないことが保証され、最適なパフォーマンスを実現できます。1 つの RAC インスタンスがダウンした場合、Oracle は、トランザクションの整合性を維持しながら、DTP サービスを非優先インスタンスに転送します。

Oracle 10gR2 の DTP サービスを使用している場合は、Oracle FAN のコンフィグレーションは不要であり、お勧めしません。TMS_rac_refresh(1) を使用するか、または XARETRYDURATIONSECONDS 環境変数または XARETRYINTERVAL 環境変数を設定してください。

Oracle 11g を使用する場合のトランザクション回復のコンフィグレーション

Oracle 11g では、特別なコンフィグレーションは必要なくトランザクション回復を実行できます。

UBBCONFIG ファイル内の環境変数の指定

Tuxedo の Oracle RAC 用環境変数は、オペレーティング システムのコマンドラインからも設定できますが、これらの環境変数の設定には、UBBCONFIG ファイル内の *MACHINES セクションに ENVFILE パラメータを指定する方法を強くお勧めします。

Oracle RAC 用環境変数を設定するときは、構文に関する以下の注意事項に従ってください。

 


関連項目


  ページの先頭       前  次