20 ロギング・ラスト・リソース・トランザクションの最適化

このトピックには、次の項があります。

20.1 概要

ロギング・ラスト・リソース(LLR)トランザクション最適化は、非XAリソースがグローバル・トランザクションに参加できるようにする、パフォーマンス向上のためのオプションです。

LLRリソースは、トランザクション処理にローカル・トランザクションを使用します。Oracle Tuxedoトランザクション・マネージャは、トランザクションの他のすべてのリソースを準備し、LLRリソースのローカル・トランザクションの結果に基づいてグローバル・トランザクションに対するコミットの決定を下します。

LLR参加リソースによるグローバルな2フェーズ・コミット(2PC)トランザクションでは、Oracle Tuxedoトランザクション・マネージャは次の基本的なステップに従います。

  • 他のすべての(XA対応の)トランザクション参加リソースに対してprepareを呼び出します。
  • (ファイル・ベースのトランザクション・ログではなく) LLR参加リソースの表へコミット・レコードを挿入します。
  • LLR参加リソースのローカル・トランザクション(トランザクション・コミット・レコードの挿入とアプリケーションのSQL処理の双方を含む)をコミットします。
  • その他すべてのトランザクション参加リソースに対してcommitを呼び出します。
  • トランザクションが正常に終了したら、データベース・トランザクション・ログ・レコードを今後のトランザクションの一部として遅れて削除します。

リカバリでは、LLR表に残されたトランザクション・レコードは、完了するトランザクションと見なされます。

20.2 ロギング・ラスト・リソースの構成

20.2.1 RMファイル内のLLRライブラリの構成

LLRライブラリでは、XA操作およびLLRサーバー/TMS用のいくつかの共通APIをエミュレートするXAスイッチが用意されています。${TUXDIR}/udataobjにあるRMファイル内のLLRライブラリは、次のように構成します。

[LLR XA switch name]:[LLR XA switch variable]:[Link options]

次の表に、LLRライブラリの詳細を示します:

表20-1 LLRライブラリ

LLR XAスイッチ名 LLR XAスイッチ変数 リンク・オプション RM 実装 LLRライブラリ
tuxllr_oraesql tuxllrsw_oraesql -lllroraesql -L${ORACLE_LIB}-lclntsh Oracle 埋込みSQL $ {TUXDIR}/lib/libllroraesql.so

一般的には、LLR XAスイッチ変数はtuxllrsw_[name]、LLR XAスイッチ名はtuxllr_[name]です。関連ライブラリ名はlibllr[name]で、この[name]はRM IDおよび実装IDから構成されます。たとえば、oraはOracleデータベースを示し、esqlは埋込みSQLを示します。

20.2.2 UBBCONFIGファイル内のOPENINFOの構成

UBBCONFIGファイル内のOPENINFOは、次の形式で構成します。

[LLR XA switch name]:[open string]

次の表に詳細を示します。

表20-2 OPENINFOの形式

LLR XAスイッチ名 形式
tuxllr_oraesql
ORACLE_XA{+required_fields...} [+optional_fields...]
SqlNet、AccおよびDBの詳細は、 Oracleオンライン・ドキュメントを参照してください。

TuxLLRは、Tuxedo LLRのための特定のオプション・フィールドであり、LLR表名を定義します。定義されない場合は、デフォルト名が使用されます。

LLR表は、LLRサーバーが関係するトランザクションのコミット中のTLOGを格納するために使用されます。この表のデフォルト名はTUXLLR_[DOMAINID]です。[DOMAINID]が空の場合は、DOMが使用されます。TuxLLRを使用してLLR表の名前を指定する場合は、同じ非XAリソース内で異なるTuxedoドメインには必ず異なるLLR表が使用されていることを確認します。そうでない場合は、リカバリが正しく機能しないことがあります。

さらに、LLRスイッチによって使用されるRMのユーザー・アカウントに、LLR表を作成および更新する権限があることを確認します。そうでない場合は、エラーが発生することがあります。

たとえば、Oracleデータベースで次のようなメッセージが表示されます。

ORA-01950: 表領域'string'に対する権限がありません

これは、そのユーザーに、指定された表領域でエクステントを割り当てる権限がないことが原因です。この問題を解決するには、ユーザーに適切なシステム権限を付与するか、表領域におけるユーザー領域リソースを付与します。

20.2.3 UBBCONFIGファイル内のLLRオプションの構成

LLR_DELSWAPSIZE numeric_value
スワップ領域に格納できる、完了したLLR関連2PCグローバル・トランザクションID (gtrid)の最大数を指定します。デフォルトの値は0です。LLR機能を有効化するには、正の値を指定します。
LLR_DELDELAY numeric_value
LLRの完了レコードの遅延削除の間隔となる、基本のSCANUNITの乗数を指定します。この値は0より大きくなければなりません。このパラメータを指定しない場合、SCANUNIT * LLR_DELDELAYが約30秒になるようにデフォルト値が設定されますが、SCANUNITの値が30秒より大きいときは、LLR_DELDELAYは1に設定されます。

20.2.4 LLRサーバー/TMSの作成

Oracle Tuxedoでは、XAスイッチ名の接頭辞がtuxllr_の場合、Oracle Tuxedo固有のLLR XAスイッチとしてXAスイッチが使用されます。

アプリケーション・サーバーは、LLR XAスイッチで構築されているかぎり、Oracle TuxedoでLLRサーバーとして扱われます。同じグループ内で同じLLR XAスイッチで構築されたTMSサーバーは、LLR TMSとして扱われます。LLRサーバーが所属するグループがLLRグループです。LLRサーバーが関係するトランザクションがLLR関連トランザクションです。このトランザクションのTLOGレコードは、Oracle Tuxedoの従来のTLOGファイルではなく、LLR表に格納されます。

LLRサーバー/TMSでは、正しいLLR XAスイッチを使用する必要があります。これは、RMおよびその実装が、XAスイッチを提供するLLRライブラリと同じである必要があることを意味します。

20.2.5 標準的な構成例

1つのローカル・トランザクションで、埋込みSQLを使用してOracleデータベース表にレコードを挿入するLLRサーバー(server.pc)の例を次に示します。

リスト

…
EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
char mylog[200];
int mypid;
EXEC SQL END DECLARE SECTION;
int tpsvrinit(int argc, char *argv[])
{
      tpopen();
      mypid=getpid();
      return(0);
}
  void tpsvrdone()
{
  tpclose();
}
void ECHO(TPSVCINFO *rqst)
{
      strncpy(mylog, rqst->data,rqst->len);
      mylog[rqst->len-1] = 0;
      EXEC SQL INSERT INTO TUX_RAC_TAB(OWNER, DATA) VALUES(:mypid,
 :mylog);
      tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);/*do not commit the local
 transaction*/
}
…

RMファイルの構成のリスト

tuxllr_oraesql:tuxllrsw_oraesql: -lllroraesql -L${ORACLE_LIB} -lclntsh 

UBBCONFIGの構成のリスト

*RESOURCE
…
MODEL             SHM

SCANUNIT          5

MAXGTT            600

LLR_DELDELAY      6

LLR_DELSWAPSIZE   500   
 
…
*MACHINES
“m1”   LMID=L1 TLOGSIZE=100
…
*GROUPS
GRP1   LMID=L1 GRPNO=10 TMSNAME="TMS_LLRORAESQL" TMSCOUNT=2

OPENINFO="tuxllr_oraesql:ORACLE_XA+SqlNet=orcl.tux1+ACC=P/scott/tiger”
…
server1 SRVGRP=GRP1 SRVID=10
…

LLRサーバーおよびTMSの作成のリスト

…
${PROC} ${PROCFLAGS} iname=server.pc
buildserver -r tuxllr_oraesql -o server1 -f server.c
buildtms -r tuxllr_oraesql -o TMSLLRORAESQL
…

20.3 完了したLLRトランザクションのTLOGレコードの遅延削除

LLR表内の完了した2PCグローバル・トランザクションID(gtrid)のTLOGレコードは、遅延方式でパージされます。このパージはタイマーに基づきます。LLR_DELDELAYパラメータを使用してこれを構成できます。

新規に導入されたBB内のスワップ領域が、完了したLLR関連gtridを一時的に格納するために使用されます。BBLにより、スワップ領域内のこれらのgtridが各ローカル・キャッシュ・スキャン・ユニットに移動され、タイムアウトすると、gtridに従ってLLR表内の対応するTLOGのレコードがパージされます。LLR_DELSWAPSIZE属性を使用してスワップ領域のサイズを指定できます。

スワップ領域が小さすぎる場合、その時点でスワップ領域に格納できない完了したgtridは、関連するコーディネータTMSプロセスによって一時的にキャッシュされます。

予期しないノード・クラッシュ(たとえば、BBの消失)があると、完了したレコードがLLR表に残り、時間どおりにパージされません。各レコードは、Tuxedoリカバリ中のトランザクション表内のエントリを必要とします。BB内のトランザクション表のサイズは、MAXGTTで指定します。MAXGTTがこれらのレコードを格納するのに十分な大きさでない場合、ノードが復元されるときにBBLの起動が失敗します。これが発生した場合は、MAXGTTの値を増やして再試行してください。

少なくとも、スキャン単位内のすべての完了したLLR関連2PCのgtridを格納できるように、十分なLLR_DELSWAPSIZEを指定することをお薦めします。

BBLでは、LLR表内の完了したgtridレコードはパージされません。それは、このジョブを行うため、システムの提供するLLRヘルパー・プロセスを起動します。このプロセスはまた、Tuxedoのリカバリ中にBBLがLLRデータ内のレコードを取得するのに役立ちます。

ノート:

".llr"ディレクトリが$APPDIRの下に作成され、LLRによって使用される一時ファイルが格納されます。

20.4 制約および制限事項

  • 全般
    • 通常のXAサーバーと同様に、LLRサーバー内の顧客コードはtpopen/tpcloseを介して接続を管理する必要があります。
    • 1つのLLRサーバーのみがグローバル・トランザクションに関与できます。
    • MRMグループに従って、LLRサーバーによって使用されるOPENINFOGROUPセクションに指定する必要があります
    • LLRサーバーではtpsuspendおよびtpresumeはサポートされていません
    • MPドメインに従って、LLRをサポートしていないOracle Tuxedoリリースを使用するスレーブ・ノードでは、LLRが有効化されている場合に起動に失敗します。
    • いくつかのLLRグループが指定されている場合、BBLは関連するすべての非XAリソースのLLR表に存在するTLOGレコードを取得するため、BBLの起動に通常よりも時間がかかります。
    • Linuxの64ビット・プラットフォームのみがサポートされています
  • RM固有(libllroraesql固有)
    • マルチスレッドLLRサーバーはサポートされていません

      XAスイッチtuxllrsw_oraesqlのシミュレートでは、スレッド・コンテキストはサポートされていません。LLR関連MRMグループに従って、Oracleデータベースへのその他のXA接続では、OPENINFOThreadsプロパティは有効にしないでください。そうでない場合は、アプリケーション・サーバーでのLLR接続上のSQLジョブは動作しません。

    • LLRサーバーでは、現在のローカル・トランザクションが完了するまで新しいリクエストを処理できません。