この付録では、Oracle Clusterware C Application Program Interface(API)について説明します。内容は次のとおりです。
関連項目: Oracle Clusterwareを使用したアプリケーションの高可用性の実現の詳細は、第6章「Oracle Clusterwareを使用したアプリケーションの高可用性の実現」を参照してください。 |
この章では、Oracle Clusterware(CLSCRS)のプログラミング・インタフェース(C API)の使用について説明します。
概要
CLSCRSは、Oracle ClusterwareのCベースAPIのセットです。CLSCRS APIを使用すると、Oracle Clusterwareによって管理されるエンティティの操作を管理できます。これらのエンティティには、リソース、リソース・タイプおよびサーバー・プールが含まれます。APIを使用してOracle Clusterwareにユーザー・アプリケーションを登録することができるため、クラスタウェアでユーザー・アプリケーションを管理して高可用性を維持できます。アプリケーションが登録されると、そのアプリケーションを管理してステータスを問い合せることができます。アプリケーションが不要になった場合には、そのアプリケーションを停止して、Oracle Clusterwareから登録解除することができます。
Oracle Clusterwareサービスは、Oracle Clusterwareの一部として実行されるクラスタ・レディ・サービスによって提供されます。CLSCRS APIでは、すべての関数コールで明示的に名前が指定されているコンテキストが使用されます。APIでは、処理レベルまたはスレッド・レベルでの格納は行われません。診断ロギングのコールバックを使用できます。
注意: Oracle Clusterwareの高可用性APIは、Oracle Databaseクライアント・インストール・メディアからインストールできます。 |
使用上の注意
この項には次のトピックが含まれます:
コンテキストの初期化および永続性
CLSCRS APIを使用する場合、最初にclscrs
コンテキストを初期化する必要があります。このコンテキストを作成および終了するためのコールは次のとおりです。
clscrs_init_crs
: clscrs
コンテキストを初期化します。
clscrs_term_crs
: clscrs
コンテキストを終了します。
コンテキストが不要になると、コール元によってそのコンテキストは終了されます。
スレッドのサポート
CLSCRS_FLAG_USETHREADS
フラグを指定して初期化した場合、CLSCRS APIによってスレッドが内部的に生成される場合があります。APIの各関数は、コール元のスレッドのコンテキストで実行されます。APIコンテキスト・オブジェクトは、複数のスレッドによって同時に使用できない場合があります。ただし、クライアント側でのスレッド・アフィニティは必要ありません。一度に対応できるのはコンテキストごとに1つのスレッドであるというルールに従って、プロセスは複数のAPIコンテキストを作成し、様々なスレッドで使用する場合があります。
CLSCRS APIデータ構造
次のエンティティはAPIコールに渡され、APIコールからの戻り値が含まれます。
clscrs_sp
: 文字列ペア(sp
)には、名前および値の文字列が含まれます。値はNULLの場合もあります。作成されたり破棄されること、およびその内容を調べることで値を置換することが可能です。文字列ペアは、1つの文字列ペア・リスト(splist
)のみのメンバーの場合もあります。
clscrs_splist
: 文字列ペア・リスト(splist
)は、様々なコンテキストで使用される0(ゼロ)個以上の文字列ペアのリストです。APIで文字列ペアを文字列ペア・リストに追加したり、リストから削除することまたはAPIで文字列ペアを繰り返し適用することができます。
clscrs_res
: リソース・インスタンス(res
)はOracle Clusterwareエンティティを示し、このエンティティには、名前、およびOracle Clusterwareエンティティが使用されるコンテキストに適した追加データが含まれます。リソース・インスタンスには、Oracle Clusterwareエンティティの属性データが含まれる場合もあれば、操作に関するステータスおよび戻りメッセージが示される場合もあります。シングル・リソース・インスタンスは、1つのclscrs_reslist
のみのメンバーの場合もあります。
clscrs_reslist
: リソース・リスト(reslist
)は、clscrs_res
の0(ゼロ)個以上のインスタンスが含まれるデータ構造です。APIで、リソースをリソース・リストに追加したり、リストから削除すること、またはリソースを繰り返し適用することができます。
メモリー管理
CLSCRS APIは、要素およびリストに対して機能します。要素はリストに追加されます。要素およびリストの両方に対するメモリーの割当ておよび解放は、明示的なAPIコールを介して行われます。割り当てられたメモリーの解放は、コール元によって行われます。ただし、要素がリストに追加されている場合は、そのリストのみを破棄する必要があり、リストを破棄することで、その要素も暗黙的に破棄されます。要素がリストに追加されていない場合は、要素を破棄する必要があります。再帰的リストの場合、親リストを破棄すると、それに含まれるリストもすべて破棄されます。clscrs_sp
およびclscrs_res
要素は、コール元によって破棄される必要があります。これらがclscrs_splist
またはclscrs_reslist
に属する場合は、リストを破棄すると、clscrs_sp
およびclscrs_res
のエンティティがそれぞれ破棄されます。
たとえば、リソースが作成されてリソース・リストに追加された場合は、そのリソース・リストのみが破棄され、個々のリソースは破棄されません。また、リソース・リストを破棄すると、個々のリソースのメモリーが解放されます。
メモリーは、APIによって、次のコールを介して割り当てられます。
clscrs_sp_create() clscrs_res_create() clscrs_serverpool_create() clscrs_type_create() clscrs_splist_create() clscrs_reslist_create() clscrs_entity_id_create()
前述のリストの各コールには、対応するclscrs_*_destroy()
コールがあります。
エラーの処理およびトレース
対話形式および非対話形式のCLSCRS APIは、それぞれ異なるエラー処理メカニズムを使用します。
非対話形式CLSCRS APIでは、エラー・コードは関数コールの戻り値として戻されます。次に例を示します。
clscrsret clscrs_sp_get_value(clscrs_sp *sp, oratext **value);
エラー・コードは、clscrsret
値として戻されます。
対話形式CLSCRS APIでは、出力結果は次のように表示されます。
関数コールの戻り値によって、リクエストの概要が出力されます。サーバーでリクエストが受信されたかどうかが示されます。また、正常に完了したか、完全に失敗したか、または一部で失敗したかどうかも示されます。戻り値が正常であるということは、リクエストの受信および処理が行われ、リクエストされたすべてのエンティティに対する結果が正常であったことを示します。
リクエストが行われたエンティティごとに、op_status
リストにプログラムの完了コードが格納されます。値がsuccess
ではない場合は、特定のオブジェクトに対するリクエストの処理で高度な問題が発生したことを示します。
必要に応じて、APIでは、コールバック・メカニズムを使用して、ローカライズされた判読可能なエラー、警告、ステータス・メッセージを受信するように示される場合があります。コールバックが起動されるたびに、コールバックの起動に関するメッセージ、メッセージ・タイプ(重大度)およびオブジェクトIDが表示されます。
次に例を示します。
CLSCRS_STAT clscrs_register_resource2(clscrs_reslist *in_reslist, uword flags, clscrs_msgf2 msgf, void *msgarg, clscrs_reslist *op_status);
関数によって、CLSCRS_STAT
という値のエラー・コードが戻されます。
crsd
によって、clscrs_msgf2
コールバックを介して、エラー・メッセージ、警告メッセージ、進捗メッセージがクライアントに戻されます。クライアントには、crsd
によって戻されるこれらのメッセージを処理するコールバックが実装されている必要があります。
以前のOracle Clusterwareリリースでは、APIに、op_status
リストの一部としてOracle Clusterwareエンティティの各操作の結果も含まれていました。次のAPIを使用してその情報にアクセスできます。
clscrsret clscrs_res_get_op_status(clscrs_res *res, CLSCRS_STAT *status, oratext **msg);
status
引数には、Oracle Clusterwareエンティティのcrsd
操作に関するステータス・コードが含まれます。また、msg
引数には、crsd
操作の結果に関するメッセージが含まれます。msg
引数の各Oracle Clusterwareエンティティに対するcrsd
操作の結果は引き続きop_status
リストに含まれますが、msg
引数の使用によるエラー・コードおよびメッセージの取得は非推奨となり、新しいエンティティのAPIではサポートされていません。既存の使用(特にリソースでの処理)でのみサポートされます。crsd
によって戻されるメッセージを処理する場合は、コールバック関数を使用してください。
コールバック・メカニズム
対話形式CLSCRS APIでは、クライアントがcrsd
によって送信されたエラー・メッセージ、警告メッセージおよび進捗メッセージを処理するために使用するコールバック・メカニズムが提供されます。
コールバック・メカニズムのシグネチャは次のとおりです。
typedef void (*clscrs_msgf2)(void *usrp, const oratext *id, const oratext *msg, clscrs_msgtype msgtype);
前述の構文の各要素は次のとおりです。
usrp
: コールのコンテキストが含まれるユーザー指定のポインタ
id
: メッセージに対応するエンティティの識別子
msg
: 出力テキスト
msgtype
: メッセージのタイプ(エラー、警告または進捗)
例F-1に、コールバック・メカニズムの例を示します。
例F-1 コールバック・メカニズム
void myCallback(void *arg, const oratext *pId, const oratext *pMsg, clscrs_msgtype msgType) { if (pMsg != NULL) { cout << pMsg << endl; } }
例F-2に、対話形式APIでコールバック・メカニズムを使用する方法を示します。
例F-2 対話形式APIでのコールバック・メカニズムの使用
clscrs_start_resource2(pResIdList, NULL, env, myCallback, NULL, 0, pOpStatus);
コンテキストの作成時にCLSCRS_FLAG_TRACE
フラグを渡すことによって、APIのデバッグ・トレース・メッセージを出力することもできます。コンテキスト作成のシグネチャは次のとおりです。
CLSCRS_STAT clscrs_init_crs(clscrs_ctx **ctx, clscrs_msgf2 errf, void *errCtx, ub4 flags);
トレース・メッセージを機能させるには、clscrs_init_crs
APIで、CLSCRS_FLAG_TRACE
フラグおよびclscrs_msgf2
コールバック・メカニズムの両方を指定する必要があります。
clscrs_msgf2
コールバック・メカニズムのシグネチャは次のとおりです。
typedef void (*clscrs_msgf)(void *usrp, const oratext *msg, sword msglen);
フィルタ
フィルタを使用して、CLSCRS APIが動作するOracle Clusterwareエンティティを絞り込むことができます。簡易フィルタは、演算子を使用した属性/値ペアです。演算子は、例に示すように空白で囲む必要があります。簡易フィルタは、Boolean演算子を使用した式フィルタと呼ばれる式に組み込むことができます。
サポートされるフィルタの演算子は次のとおりです。
=
>
<
!=
co
: 次を含むst
: 次で始まるen
: 次で終わるサポートされるブール演算子はAND
およびOR
です。
次にフィルタの例を示します。
TYPE = type1
((TYPE = type1) AND (CHECK_INTERVAL > 50))
(TYPE = type1) AND ((CHECK_INTERVAL > 30) OR (AUTO_START co never))
NAME en network.res
TYPE st ora.db
関連項目: APIコールの前述のコンパレータおよび演算子は、$ORA_CRS_HOME/crs/demo/clscrsx.h ファイルにあるclscrs_comparator enum およびclscrs_operator enum を使用して、正しいタイプを取得してください。 |
フィルタは2種類あり、CLSCRSにはこれらのフィルタを作成するAPIのセットがあります。
比較フィルタ: 2つの値を比較する簡易フィルタ。次に例を示します。
TYPE = ora.db.type
比較フィルタを作成するには、clscrs_compfilter_create
APIを使用します。たとえば、(TYPE = ora.db.type)
比較フィルタは次のように作成します。
clscrs_compfilter_create(ctx, clscrs_TYPE, clscrs_comparator_eq, (const oratext *)"ora.db.type", &myCompFilter);
式フィルタ: 比較フィルタまたは式フィルタ、あるいはその両方の組合せで作成されるフィルタ。次に例を示します。
((TYPE = ora.db.type) AND (CHECK_INTERVAL > 50))
比較フィルタを作成するには、clscrs_expfilter_create
APIを使用します。たとえば、式フィルタは次のように作成します。
clscrs_exprfilter_create(myCompFilter1, clscrs_operator_or, myCompFilter2, &myExprFilter);
関連項目: clscrs_compfilter_create およびclscrs_expfilter_create APIの使用方法については、$ORA_CRS_HOME/crs/demo/clscrsx.h ファイルを参照してください。 |
注意: clscrs_compfilter_create およびclscrs_expfilter_create APIによって割り当てられるメモリーは、どちらもclscrs_filter_destroy() がコールされると解放されます。 |
エンティティ・リストのかわりに、次の対話形式CLSCRS APIでフィルタを使用できます。
clscrs_start_resource2
clscrs_stat2
clscrs_stop_resource2
clscrs_check_resource2
clscrs_relocate_resource2
例F-3に、対話形式CLSCRS APIでのフィルタの使用を示します。
例F-3 対話形式CLSCRS APIのフィルタ
clscrs_start_resource2(myCompFilter, NULL, env, msgf2, NULL, 0, pOpStatus);
スクリプト・エージェントの使用方法
スクリプト・エージェントのエントリ・ポイントでCLSCRS APIを使用する場合は、次の点を考慮してください。
start、stop、cleanなどの一部のアクションは、リソース・インスタンスでロックされた状態で実行されます。そのため、リソースに対する操作が直接行われるリクエストや、関係性が拡張されることで行われるリクエストをサーバーに発行すると、デッドロックの原因になります。
通常、読取り専用の発行(clscrs_stat2
)は初回のチェックでないかぎり安全で、この場合、デッドロックの原因にもなるため、スクリプト・エージェントではサーバー上でのコールバックは実行しないでください。clsagfw
APIを使用して、チェック・エントリ・ポイントを問い合せます。
ヘルプ・インタフェース
crsapp.c
と呼ばれるデモと併用することで、$ORA_CRS_HOME/crs/demo/clscrsx.h
ファイルで、それぞれの使用方法を含め、CLSCRS APIのリスト全体を検索できます。
非推奨のCLSCRS API
表F-1に非推奨のCLSCRS APIおよびそれに対応するOracle Clusterware 11gリリース2(11.2)の新しいAPIを示します。
表F-1 非推奨のCLSCRS API
非推奨コマンド | 代替 |
---|---|
clscrs_register_resource |
clscrs_register_resource2 |
clscrs_start_resource |
clscrs_start_resource2 |
clscrs_stat |
clscrs_stat2 |
clscrs_stop_resource |
clscrs_stop_resource2 |
clscrs_check_resource |
clscrs_check_resource2 |
clscrs_relocate_resource |
clscrs_relocate_resource2 |
clscrs_unregister_resource |
clscrs_unregister_resource2 |
clscrs_msgf |
clscrs_msgf2 |
clscrs_fail_resource |
代替はありません。 |
表F-2に示すAPIは、コマンドを実行するために、クラスタ・レディ・サービス・デーモン(crsd
)のコールを作成します。これらのAPIが機能するには、crsd
が起動され、実行されている必要があります。
表F-2 Oracle Clusterwareの対話形式CLSCRS APIのサマリー
C API | 説明 |
---|---|
clscrs_register_type |
入力リソース・リストにリソース・タイプを登録します。 |
clscrs_register_serverpool |
サーバーの入力リストに使用するサーバー・プールを登録します。 |
clscrs_register_resource2 |
入力リソース・リストにリソースを登録します。 |
clscrs_start_resource2 |
名前が指定されたリソース・セットを起動するようにOracle Clusterwareに通知します。 |
clscrs_stat2 |
rqlistに指定されたエンティティに関する情報を取得します。 |
clscrs_stop_resource2 |
名前が指定されたリソース・セットを停止するようにOracle Clusterwareに通知します。 |
clscrs_check_resource2 |
指定されたリソースのチェック・エントリ・ポイントを実行するようにOracle Clusterwareに通知します。 |
clscrs_relocate_resource2 |
リソース識別子のリストを再配置します。 |
clscrs_unregister_resource2 |
リソース名の入力リストのリソースを登録解除します。 |
clscrs_unregister_type |
入力リストのリソース・タイプを登録解除します。 |
clscrs_unregister_serverpool |
指定されたサーバー・プールを登録解除します。 |
clscrs_relocate_server |
サーバーのリストを再配置します。 |
コンテキストの初期化、対話形式APIのリクエスト・ペイロードの準備、対話形式APIの処理後の出力などの機能には、非対話形式CLSCRS APIを使用できます。非対話形式CLSCRS APIはcrsd
をコールしません。
コールバック・エラーのレポート・メカニズムは、非対話形式CLSCRS APIでは使用できません。clscrs_stat2
を除くすべての対話形式CLSCRS APIでは、このコールバック・メカニズムが使用されます。これらのAPIのクライアントは、コールバック・メカニズムを使用して、エラー、警告および進捗メッセージをcrsd
から受信します。
フィルタを使用して、CRSエンティティのリストを減らすこともできます。また、対話形式APIのフィルタを使用して、CRSエンティティのリストを減らすこともできます。
APIデータ構造の管理のために提供されるルーチンは、複数のスレッドの同じAPIコンテキストで同時に使用できませんが、クライアント側でのスレッド・アフィニティは必要ありません。各インスタンスで個別のAPIが使用されている場合は、このプロセスにより、複数のスレッドでこれらのルーチンが起動する可能性があります。
表F-3に、非対話形式CLSCRS APIを示します。
表F-3 非対話形式CLSCRS API
C API | 説明 |
---|---|
clscrs_entity_id_destroy |
|
clscrs_exprfilter_create |
比較フィルタまたは式フィルタ(あるいはその両方)で式フィルタを構成します。 |
clscrs_filter_destroy |
フィルタのメモリーを解放します。 |
clscrs_get_entity_type |
指定されたエンティティ識別子に対応するエンティティ・タイプを取得します。 |
clscrs_get_fixed_attrlist |
属性グループ識別子に対応する属性のリストを取得します。 |
clscrs_get_resource_instance_details |
使用されているリソース・インスタンス識別子から、リソース名、カーディナリティ、程度などのリソース・インスタンスの詳細を取得します。 |
clscrs_getnodename |
ノード名を取得します。 |
clscrs_init_crs |
Oracle Clusterwareと通信するためにコンテキストを初期化します。 |
clscrs_is_crs_admin |
ユーザーがOracle Clusterware管理者かどうかをチェックします。 |
clscrs_res_attr_count |
リソースの属性数を取得します。 |
clscrs_res_create |
新しいリソースを作成します。 |
clscrs_res_destroy |
リソースのメモリーを解放します。 |
clscrs_res_get_attr |
リソースのリソース属性を取得します。 |
clscrs_res_get_attr_list |
リソースの属性リストを取得します。 |
clscrs_res_get_name |
リソース名を取得します。 |
clscrs_res_get_op_status |
エンティティの操作のステータスを取得します。 |
clscrs_res_get_registered |
リソースの登録ステータスを取得します。 |
clscrs_res_get_reslist |
リソースのリソース・リストを取得します。 |
clscrs_res_set_attr_list |
リソースの属性リストを設定します。 |
clscrs_res_set_reslist |
リソースのリソース・リストを設定します。 |
clscrs_reslist_append |
リソース・リストにリソースを追加します。 |
clscrs_reslist_count |
リソース・リストのリソースの数をカウントします。 |
clscrs_reslist_create |
新しいリソース・リストを作成します。 |
clscrs_reslist_delete_res |
リソース・リストのリソースを削除します。 |
clscrs_reslist_destroy |
リソース・リストのメモリーを解放します。 |
clscrs_reslist_find |
リソース・リストのリソースを検索します。 |
clscrs_reslist_first |
リソース・リストの最初のリソースを取得します。 |
clscrs_reslist_next |
リソース・リストから現行の次のリソースを取得します。 |
clscrs_sp_get |
文字列ペアの名前要素および値要素を取得します。 |
clscrs_sp_set |
文字列ペアの値の部分を変更します。 |
clscrs_splist_append |
文字列ペア・リスト(splist)に新しい文字列ペア(sp)を追加します。 |
clscrs_splist_create |
新しい文字列ペア・リストを作成します。 |
clscrs_splist_delete_sp |
文字列ペア・リスト(splist)から文字列ペア(sp)を削除します。 |
clscrs_splist_first |
文字列ペア・リスト(splist)の最初の文字列ペア(sp)を取得します。 |
clscrs_splist_replace |
文字列ペア・リスト(splist)の文字列ペア(sp)の値を置換します。 |
clscrs_term_crs |
CRSと通信するためにコンテキストを解放します。 |
clscrs_type_create |
新しいリソース・タイプを作成します。 |
clscrs_type_get_attr |
リソース・タイプの属性の値またはプロパティを取得します。 |
clscrs_type_set_attr |
リソース・タイプに属性を追加します。 |
clscrs_compfilter_create |
2つの値を比較する簡易フィルタを構成します。 |
clscrs_entity_id_create |
リソース、リソース・タイプ、サーバー・グループなどのCRSエンティティを識別するエンティティ識別子を作成します。 |
clscrs_register_serverpool |
サーバーの入力リストに使用するサーバー・プールを登録します。 |
clscrs_register_type |
入力リソース・リストにリソース・タイプを登録します。 |
clscrs_relocate_server |
サーバーのリストを再配置します。 |
clscrs_res_get_node_list |
リソースを現在ホスティングしているノード・リストを取得します。 |
clscrs_res_set_attr |
リソースのリソース属性を設定します。 |
clscrs_sp_get_value |
文字列ペアの値要素を取得します。 |
clscrs_splist_count |
文字列ペア・リスト(splist)の文字列ペア(sp)の数をカウントします。 |
clscrs_splist_create_and_set |
新しい文字列ペア・リスト(splist)を作成し、リストの最初の文字列ペアの名前および値を設定します。 |
clscrs_splist_destroy |
文字列ペア・リスト(splist)のメモリーを解放します。 |
clscrs_splist_find |
文字列ペア・リスト(splist)の文字列ペア(sp)の値を検索します。 |
clscrs_splist_next |
文字列ペア・リスト(splist)の現行の次の文字列ペア(sp)を取得します。現行の次のSPは、実質的にSPLISTの次のSPです。リスト・イテレータはAPI内に格納され、公開されません。 |
clscrs_stat2 |
rqlistに指定されたエンティティに関する情報を取得します。 |