|
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 以降のリリースを使用している場合は、特別なコンフィグレーションを行わなくても、必要に応じてサービス名が透過的かつ自動的に代替インスタンスに移行されます。 |
注意 : | Oracle 10gR1 の場合は、10.1.0.3 以降のパッチ セットが必須です。 |
注意 : | Oracle 10gR2 の場合は、https://metalink.oracle.com/metalink/plsql/f?p=130:14:3193163745563425327::::p14_database_id で説明されているバグに対応するために、10.2.0.2 以降のパッチ セットが必須です。 |
注意 : | Oracle 11g の場合は、11.1.0.6 以降のパッチ セットが推奨されます。RAC に関して多くの点が改良されているため、Oracle 11g の使用を強く勧めします。 |
プラットフォーム固有のソフトウェア要件については、『OracleTuxedo システムのインストール』の「Tuxedo 10g リリース 3 (10.3) プラットフォーム データ シート」を参照してください。
Tuxedo で Oracle RAC をサポートするためには、次の 2 つの作業が必要です。
以下のコマンドおよび環境変数は、Tuxedo の Oracle RAC サポートのコンフィグレーションでのみ使用されます。
(Oracle 10gR1 および 10gR2 で必須、Oracle 11g で省略可能)
(Oracle 10gR1 でのみ必須)XARETRYINTERVAL
(Oracle 10gR1 でのみ必須)
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
環境変数は、Oracle RAC グループ コンフィグレーションの定義に使用します。構文は次のとおりです。
TUXRACGROUPS="G1,G2,…,Gm;H1,H2,…,Hn[;…]:I1,I2,…,Io;J1,J2,…,Jp[;…][:…]"
注意 : | 一般的には、1 つのデータベース インスタンスに関連付けられたすべてのサービスは、単一グループ内に配置されます。そのため通常は、TUXRACGROUPS の値にカンマは必要ありません。 |
TUXRACGROUPS
環境変数は、Oracle RAC コンフィグレーションの異なるインスタンスに関連付けられたグループを指定するための変数です。そのため、TUXRACGROUPS
環境変数を使用するすべてのアプリケーションで、環境変数の値に少なくとも 1 つのセミコロンが必要です。
注意 : | 一般的には、1 つの RAC データベース コンフィグレーションのみを指定します。そのため通常は、TUXRACGROUPS の値にコロンは必要ありません。 |
この節では、4 つの異なる Oracle RAC グループ コンフィグレーションの定義例を示します。
図 6-1 は、単純な Oracle RAC コンフィグレーションの例です。
この例では、1 つの Oracle データベース (ORA1) に対して 2 つの Oracle RAC インスタンスが存在し、各インスタンスにそれぞれ 1 つのグループが含まれています。
この場合、同じトランザクション要求を GROUP1
と GROUP2
の両方に送信することはできません。これは、各グループが同一の Oracle RAC データベース コンフィグレーションにマップされた異なるインスタンスを介してデータベース サービスにアクセスするためです。
TUXRACGROUPS="GROUP1;GROUP2:GROUP3;GROUP4,GROUP5"
図 6-2 は、1 つのインスタンスに複数のグループを追加した例です。
この例では、2 つの Oracle データベース ORA1
と ORA2
が存在しています。ORA1
はマシン固有のサービス ORA1SITE1
と ORA1SITE2
を、ORA2
はマシン固有のサービス ORA2SITE1
と ORA2SITE2
を提供します。このコンフィグレーションは、Oracle RAC コンフィグレーションの各インスタンスに関連付けられたグループに、ほぼ同数のトランザクションを割り当て、同じサービスをコンフィグレーションすることを目的としています。
この場合、同じトランザクション要求を GROUP1
と GROUP2
の両方に送信することはできません。これは、各グループが同一の Oracle RAC データベース コンフィグレーションにマップされた異なるインスタンスを介してデータベース サービスにアクセスするためです。GROUP3
と GROUP4
、または GROUP3
と GROUP5
についても同様で、同じトランザクションをこれらのグループの両方に送信することはできません。
GROUP4
と GROUP5
は、どちらも同じ Oracle RAC データベース コンフィグレーションの同じデータベース サービスにアクセスするため、これらのグループは共に使用できます。また、GROUP1
と GROUP4
は、それぞれ異なる RAC データベース コンフィグレーションにアクセスするため、これらのグループも共に使用できます。このコンフィグレーションに GROUP6
も含まれており、GROUP6
が Oracle RAC グループでなければ、いずれのグループとも組み合わせて使用できます。
注意 : | 各 Oracle RAC インスタンスに含まれるグループの数は、同一である必要はありません。 |
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
注意 : | GROUP4 と GROUP5 には同じ OPENINFO 文字列が指定されています。これは、どちらのグループも同じデータベースが提供する同じデータベース サービスを使用することを意味しています。 |
注意 : | Oracle グループ用の OPENINFO 文字列を *GROUPS セクションに指定する方法は、RAC なしに Oracle を使用する場合と変わりません。Oracle グループ用の OPENINFO 文字列を指定する方法の詳細については、『Oracle Database Application Developer's Guide - Fundamentals』の「Developing Applications with Oracle XA」の章を参照してください。 |
TUXRACGROUPS="GROUP11,GROUP12,GROUP13;GROUP21,GROUP22:GROUP3;GROUP4, GROUP5"
図 6-3 は、複数のインスタンスに複数のグループを追加する例を示したものです。
この例は、1 つ前で説明した例と似ていますが、GROUP11
、GROUP12
、および GROUP13
はいずれも 1 番目の RAC コンフィグレーションの 1 番目の RAC インスタンスに、GROUP21
と GROUP22
は 2 番目の RAC インスタンスに関連付けられています。
このコンフィグレーションで、トランザクション内の最初のサービス呼び出しが GROUP12
に渡された場合、このトランザクション内のその他のサービス呼び出しは GROUP11
、GROUP12
、または GROUP13
には送信できますが、GROUP21
または GROUP22
に送信することはできません。
許可されたグループ内では宣言されていないが、1 つまたは複数の禁止されたグループ内で使用可能なサービスに対して、トランザクション型のサービス呼び出しが実行された場合は、以下のいずれかの結果になります。
TUXRACGROUPS
環境変数に定義されている各 RAC コンフィグレーションについて、Tuxedo では、トランザクションの開始時に、そのコンフィグレーション内のどの RAC グループをトランザクションに参加させるかが決定します。
トランザクションは、存在している間は Oracle RAC インスタンスに固定されます。このことは、このようなトランザクションの呼び出しフローで Oracle RAC に関連付けられた Tuxedo サービスに常にアクセスできるかどうかに関係なく当てはまります。
データ依存型ルーティングは、Oracle RAC コンフィグレーションをサポートするように拡張されています。UBBCONFIG の *ROUTING
セクションには、ルーティング範囲が同一のグループを複数定義することができます。
コード リスト 6-2 は、同じ範囲の値を持つ異なる Tuxedo グループの例を示しています。
RANGES="1-5:GROUP1A, 1-5:GROUP1B, 6-10:GROUP2B, 6-10:GROUP2A, *:*"
この例では、GROUP1A
と GROUP1B
のデータ範囲が同じで、GROUP2A
と GROUP2B
のデータ範囲が同じです。Tuxedo は、トランザクションが属する Oracle RAC インスタンスに関連付けられているグループに、サービス要求をルーティングします。
RAC グループにより提供されるトランザクション サービスに対するデータ依存型ルーティングでは、以下の場合にしか目的の結果を得られません。
特定のトランザクション内では 1 つの RAC コンフィグレーション インスタンスしか許可されないため、各 RAC インスタンス内のサービスに対応したデータ値を指定する必要があります。指定しないと、トランザクションによっては、RAC コンフィグレーション内のどのサービスでもデータ値が処理されない可能性があります。
すべてのデータ値が同じサービス インスタンスのセットによって処理される場合は、データ依存型ルーティングを使用する必要はありません。
RANGES
エントリを、サービスを提供する各 RAC インスタンスに対して作成する必要がある場合
特定の RAC インスタンスに対してルーティングをコンフィグレーションしなかった場合は、その Oracle RAC インスタンスに固定されたトランザクションのサービス呼び出しが失敗し、tperrno
に TPENOENT
が設定され、tperror
詳細に TPED_GROUP_FORBIDDEN
が設定されます。
トランザクション ルーティングの開始時に、現在のトランザクションで許可されていないグループはすべて無視されます。ルーティングの決定では、以下のグループのみが対象となります。
非トランザクション型要求に対するルーティングには、すべてのグループが参加可能です。サービスは、UBBCONFIG ファイル内の *ROUTING
セクションの RANGES
フィールドに指定されたデータ値と一致した最初のグループにルーティングされます。特定の範囲の値に対する非トランザクション型要求はすべて、1 つの Oracle RAC インスタンスによってのみ処理されます。
トランザクション型と非トランザクション型が混在する要求のルーティングでは、一部のアプリケーションが非トランザクション型要求のロード バランシングを要求しないことがあります。個々のデータ値について各アプリケーション内で最初に記述される RAC インスタンスはそれぞれ異なるため、非トランザクション型要求については、個々の RAC インスタンスで提供される複数のサービス間で適宜ロード バランシングが実施されます。
非トランザクション型要求の場合、同じルーティング範囲に関連付けられたすべてのグループ間でロード バランシングを実施する方法はありません。ロード バランシングを 1 つずつ実施する場合は、以下を実行します。
図 6-4 は、Oracle RAC コンフィグレーション内でのトランザクション型/非トランザクション型要求のルーティング例を示したものです。
この例で示したコンフィグレーションは、2 つの Oracle RAC インスタンスで構成されています。TUXRACGROUPS
にリストされていない 1 つのグループに 1,000 個のトランザクションが作成されている場合、約 500 個のトランザクションが Oracle RAC インスタンス 1 に固定され、GROUP1A
と GROUP2A
にのみアクセスできます。残りの 500 個のトランザクションは Oracle RAC インスタンス 2 に固定され、GROUP1B
と GROUP2B
にのみアクセスできます。
コード リスト 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”
GROUP1A
と GROUP2A
は Oracle RAC インスタンス 1 に、GROUP1B
と GROUP2B
は 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 は最初にその残りのデータ範囲に指定されます。 |
現在の環境を複数のマシンに分割することもできます。たとえば、Tuxedo と Oracle RAC が別々の建物に配置されている場合、Oracle RAC インスタンス 1 にのみアクセスするマシン群と Oracle RAC インスタンス 2 のみにアクセスするマシン群を 1 つの Tuxedo ドメインで管理して地域的な独立性を維持することも可能です。呼び出しが特定の建物の外に送信されるのをできる限り少なくするように環境をコンフィグレーションできます。
図 6-5 は、マシン 1 (GROUP1A
と GROUP2A
が所属) とマシン 2(GROUP1B
と GROUP2B
が所属) の例を示しています。また、Tuxedo /WS クライアント、Tuxedo ネイティブ クライアント、Tuxedo /Q の場合や MQ Series などの別のリソース マネージャとリンクしているサーバの場合、Tuxedo /Domain ゲートウェイから呼び出しが実行されてトランザクションが作成される場合もあります。
要求が送信される場合は必ず、トランザクションはローカル マシンに固定されて、できる限り異なるマシン間のホップを回避する必要があります。
コード リスト 6-4 は、2 つの物理マシン TUXM1
および TUXM2
で Tuxedo が実行されている場合の UBBCONFIG ファイルの例を示しています。両方のマシンの 2 つのグループが Oracle RAC に接続しています。グループ GROUP1A
と GROUP2A
は RAC インスタンス 1 に接続しているマシン TUXM1
上で実行され、グループ GROUP1B
と GROUP2B
は RAC インスタンス 2 に接続しているマシン TUXM2
上で実行されています。
*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 ネイティブ クライアントによって作成されたトランザクションがリモート マシンに送信されるのを回避する」を参照してください。 |
TUXRACGROUPS="GROUP_TDOM_A,GROUP_CLIENT_A,GROUP1A,GROUP2A;GROUP_TDOM_B,
GROUP_CLIENT_B,GROUP1B,GROUP2B"
トランザクションが含まれない限り、Tuxedo はロードが可能な間はローカル マシン上でできる限り多くの要求を処理しようします。アイドル状態のローカル サービスがない場合にのみ、ロード バランシング アルゴリズムに基づいて要求がリモート マシンに送信されます。つまり、すべてのサービスがそれぞれのマシン上で利用できる場合は、リモート マシンに要求が送信される心配はないということです。
管理者は、Oracle RM とリンクしていない場合や Oracle RAC インスタンスに物理的に関連付けられていない場合でも、呼び出しフローでアクセスされ、新しいトランザクションをオープンする候補となる TUXRACGROUPS
環境変数にすべてのサービス グループが含まれていることを常に確認する必要があります。環境変数 TUXRACGROUPS
は、非トランザクション型のサービス呼び出しに対しては影響を及ぼしません。
Tuxedo サーバが別の RM (MQSeries など) や別のデータベースで構築されている場合、このグループを TUXRACGROUPS
環境変数に含めることによって、新しく開始したトランザクションをローカル マシンに固定することができます。
TUXRACGROUPS="MQSGROUPA,GROUP1A,GROUP2A;MQSGROUPB,GROUP1B,GROUP2B"
この例では、MQSGROUPA
、GROUP1A
、および GROUP2A
がマシン 1 に配置され、MQSGROUPB
、GROUP1B
、および GROUP2B
がマシン 2 に配置されています。
グループ MQSGROUPA
内のサーバによってトランザクションが作成されると、グループ GROUP1A
、GROUP2A
、GROUP1B
、および GROUP2B
のサービスに対するすべての Tuxedo サービス呼び出しが GROUP1A
と GROUP2A
にのみ送信されます。GROUP1B
と GROUP2B
は、RAC インスタンス 2 に属していて、トランザクションがグループ MQSGROUPA
を介して RAC インスタンス 1 で作成されたために無視されます。
各マシン上のローカル Tuxedo /Domain ゲートウェイで作成し、コード リスト 6-7 に示されているように TUXRACGROUPS
環境変数を設定します。
TUXRACGROUPS="GWTGROUPA,GROUP1A,GROUP2A;GWTGROUPB,GROUP1B,GROUP2B"
この例では、GWTGROUPA
、GROUP1A
、および GROUP2A
がマシン 1 に配置され、GWTGROUPB
、GROUP1B
、および GROUP2B
がマシン 2 に配置されています。
マシン 1 上の GWTDOMAIN が外部要求を受信して新しいトランザクションを作成すると、グループ GROUP1A
、GROUP2A
、GROUP1B
、および GROUP2B
のサービスに対するすべての Tuxedo サービス呼び出しが GROUP1A
と GROUP2A
にのみ送信されます。GROUP1B
と GROUP2B
は、RAC インスタンス 2 に属していて、トランザクションがグループ GWTGROUPA
を介して RAC インスタンス 1 で作成されたために無視されます。
各マシン上にローカル Tuxedo /Q コンフィグレーションを作成し、コード リスト 6-8 に示されているように TUXRACGROUPS
環境変数を設定します。
TUXRACGROUPS="QUEUEGROUPA,GROUP1A,GROUP2A;QUEUEGROUPB,GROUP1B,GROUP2B"
この例では、QUEUEGROUPA
、GROUP1A
、および GROUP2A
がマシン 1 に配置され、QUEUEGROUPB
、GROUP1B
、および GROUP2B
がマシン 2 に配置されています。
マシン 1 上の TMQFORWARD がこのような Oracle サービスに新しいメッセージをトランザクションとして送信すると、グループ GROUP1A
、GROUP2A
、GROUP1B
、および GROUP2B
のサービスに対するすべての Tuxedo サービス呼び出しが GROUP1A
と GROUP2A
にのみ送信されます。GROUP1B
と GROUP2B
は、RAC インスタンス 2 に属していて、トランザクションがグループ QUEUEGROUPA
を介して RAC インスタンス 1 で作成されたために無視されます。
ネイティブ クライアントを特定のサーバ グループにバインドすることもできます。そのためには、コマンド buildclient -r <RM_of_the_group> -f <source_file> -o <binary_file>
を使用してクライアントをビルドし、使用するグループ名を指定して tpinit()
を実行するだけです。
たとえば、2 つの追加グループ CLIENTGROUPA
と CLIENTGROUPB
を作成して、それぞれのグループで少なくとも 2 つの TMS を起動することができます。コード リスト 6-9 に示されているように TUXRACGROUPS
環境変数を設定します。
TUXRACGROUPS="CLIENTGROUPA,GROUP1A,GROUP2A;CLIENTGROUPB,GROUP1B,GROUP2B"
tpinfo->grpname
に CLIENTGROUPA
が設定されている場合、TPINIT 構造体を指定して tpinit(TPINIT *tpinfo)
を実行すると、クライアントが CLIENTGROUPA
に関連付けられます。tpinfo->grpname
に CLIENTGROUPB
が設定されていると、クライアントが CLIENTGROUPB
に関連付けられます。
マシン 1 上で CLIENTGROUPA
が実行され、マシン 2 上で CLIENTGROUPB
が実行されている場合、マシン 1 上のネイティブ クライアントは常に tpinfo->grpname = CLIENTGROUPA
を指定して tpinit()
を呼び出す必要があり、マシン 2 上のネイティブ クライアントは常に tpinfo->grpname = CLIENTGROUPB
を指定して tpinit()
を呼び出す必要があります。Tuxedo ネイティブ クライアントが tpbegin()
を呼び出すと、トランザクションが RAC インスタンス 1 (CLIENTGROUPA
の場合) または RAC インスタンス 2 (CLIENTGROUPB
の場合) に関連付けられます。
ワークステーション クライアントの場合、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 のマニュアルを参照してください。 |
環境変数 XARETRYDURATIONSECONDS
と XARETRYINTERVAL
は、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 の場合は、XARETRYDURATIONSECONDS を 120 に設定することをお勧めします。 |
XARETRYINTERVAL
XARETRYDURATIONSECONDS
に設定した値で xa_recover()
処理を再試行する間隔を秒単位で設定します。XARETRYINTERVAL
値は、XARETRYDURATIONSECONDS
に 0 より大きい値を指定した場合にのみ適用されます。
Tuxedo で Oracle RAC 用のコンフィグレーションをする上で重要になるのが、グループ フェイルオーバの発生時に適切なグループ パラメータを使って TMS_rac_refresh(1)
を呼び出せるように、Oracle FAN を設定する作業です。グループ パラメータとグループ フェイルオーバの詳細については、「トランザクション伝播のコンフィグレーション」を参照してください。
Oracle FAN の詳細については、『Workload Management with Oracle Real Application Clusters (PDF) White Paper』を参照してください。
// このファイルは 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 RAC に関連付けられる各グループの OPENINFO
文字列で指定されたデータベース サービスを、DTP サービスとして Oracle で宣言する必要があります。
たとえば、コード リスト 6-1 では、GROUP1
はサービス ORA1SITE1
を介して Oracle にアクセスし、GROUP2
はサービス ORA1SITE2
を介して Oracle にアクセスしていました。Oracle 10gR2 では、サービス ORA1SITE1
を、優先インスタンス SITE1
および使用可能なインスタンス SITE2
と共に DTP=TRUE
で宣言する必要があります。サービス ORA1SITE2
は、優先インスタンス SITE2
および使用可能なインスタンス SITE1
と共に DTP=TRUE
で宣言します。同様のプロセスを、グループ GROUP3
、GROUP4
、および GROUP5
にも適用しなければなりません。
異なる優先インスタンスを宣言することで、両方のインスタンスが使用可能になっている通常の動作時には、アプリケーションでロード バランシングの効果を得ることができます。
TUXRACGROUPS
環境変数の設定により、RAC コンフィグレーションの異なるインスタンスが同一のトランザクションで組み合わされないことが保証され、最適なパフォーマンスを実現できます。1 つの RAC インスタンスがダウンした場合、Oracle は、トランザクションの整合性を維持しながら、DTP サービスを非優先インスタンスに転送します。
Oracle 10gR2 の DTP サービスを使用している場合は、Oracle FAN のコンフィグレーションは不要であり、お勧めしません。TMS_rac_refresh(1)
を使用するか、または XARETRYDURATIONSECONDS
環境変数または XARETRYINTERVAL
環境変数を設定してください。
Oracle 11g では、特別なコンフィグレーションは必要なくトランザクション回復を実行できます。
Tuxedo の Oracle RAC 用環境変数は、オペレーティング システムのコマンドラインからも設定できますが、これらの環境変数の設定には、UBBCONFIG
ファイル内の *MACHINES
セクションに ENVFILE
パラメータを指定する方法を強くお勧めします。
Oracle RAC 用環境変数を設定するときは、構文に関する以下の注意事項に従ってください。