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
|
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サーバーによって使用される
OPENINFO
をGROUP
セクションに指定する必要があります - LLRサーバーでは
tpsuspend
およびtpresume
はサポートされていません - MPドメインに従って、LLRをサポートしていないOracle Tuxedoリリースを使用するスレーブ・ノードでは、LLRが有効化されている場合に起動に失敗します。
- いくつかのLLRグループが指定されている場合、BBLは関連するすべての非XAリソースのLLR表に存在するTLOGレコードを取得するため、BBLの起動に通常よりも時間がかかります。
- Linuxの64ビット・プラットフォームのみがサポートされています
- 通常のXAサーバーと同様に、LLRサーバー内の顧客コードは
- RM固有(
libllroraesql
固有)- マルチスレッドLLRサーバーはサポートされていません
XAスイッチ
tuxllrsw_oraesql
のシミュレートでは、スレッド・コンテキストはサポートされていません。LLR関連MRMグループに従って、Oracleデータベースへのその他のXA接続では、OPENINFO
のThreads
プロパティは有効にしないでください。そうでない場合は、アプリケーション・サーバーでのLLR接続上のSQLジョブは動作しません。 - LLRサーバーでは、現在のローカル・トランザクションが完了するまで新しいリクエストを処理できません。
- マルチスレッドLLRサーバーはサポートされていません
親トピック: ロギング・ラスト・リソース・トランザクションの最適化