コールバックメソッドは、API によって提供される、リソースタイプを実装するための主要な要素です。コールバックメソッドを使用すると、RGM は、クラスタのメンバーシップが変更されたとき (ノードで障害が発生したときなど) にクラスタ内のリソースを制御できます。
クライアントプログラムがクラスタシステムの HA サービスを制御するため、コールバックメソッドはスーパーユーザーまたは最大の RBAC ロールのアクセス権を持つ RGM によって実行されます。したがって、このようなコールバックメソッドをインストールおよび管理するときは、ファイルの所有権とアクセス権を制限します。特に、このようなメソッドには、特権付き所有者 (bin や root など) を割り当てます。また、このようなメソッドは、書き込み可能にしてはなりません。
この節では、コールバックメソッドの引数と終了コードについて説明します。
次のカテゴリのコールバックメソッドについて説明します。
制御および初期化メソッド
管理サポートメソッド
ネットワーク関連メソッド
モニター制御メソッド
この節では、メソッドが実行される時点や予想されるリソースへの影響など、コールバックメソッドについて簡単に説明します。コールバックメソッドの詳細は、rt_callbacks(1HA)のマニュアルページを参照してください。
method -R resource-name -T type-name -G group-name
method は、Start や Stop などのコールバックメソッドとして登録されているプログラムのパス名です。リソースタイプのコールバックメソッドは、それらの登録ファイルで宣言します。
コールバックメソッドの引数はすべて、次のようにフラグ付きの値として渡されます。
-R はリソースインスタンスの名前を示します。
-T はリソースのタイプを示します。
-G はリソースが構成されているグループを示します。
このような引数をアクセス関数で使用すると、リソースについての情報を取得できます。
Validate メソッドを呼び出すときは、追加の引数 (リソースのプロパティー値と呼び出しが行われるリソースグループ) を使用します。
詳細は、scha_calls(3HA)のマニュアルページを参照してください。
すべてのコールバックメソッドは、同じ終了コードを持っています。これらの終了コードは、メソッドの呼び出しによるリソースの状態への影響を示すように定義されています。これらの終了コードについては、scha_calls(3HA)のマニュアルページを参照してください。
終了コードには、次の主要な 2 つのカテゴリがあります。
0 – メソッドは成功しました。
ゼロ以外の任意の値 – メソッドは失敗しました。
RGM は、タイムアウトやコアダンプなど、コールバックメソッドの実行の異常終了も処理します。
メソッドは、各ノード上で syslog() を使用して障害情報を出力するように実装する必要があります。stdout や stderr に書き込まれる出力は、ローカルノードのコンソール上には表示されますが、ユーザーに伝達される保証はありません。
制御および初期化コールバックメソッドは、主に、リソースを起動および停止します。その他のメソッドは、リソース上で初期化と終了コードを実行します。
リソースを含むリソースグループがクラスタノード上でオンラインになったとき、RGM はそのクラスタノード上でこのメソッドを実行します。このメソッドは、そのノード上でリソースを起動します。
ローカルノード上でリソースが起動され、利用可能になるまで、Start メソッドは終了できません。したがって、Start メソッドは終了する前にリソースをポーリングし、リソースが起動しているかどうかを判断する必要があります。さらに、このメソッドには、十分な長さのタイムアウト値を設定する必要があります。たとえば、データベースデーモンなど特定のリソースが起動するのに時間がかかる場合、そのメソッドには十分な長さのタイムアウト値が必要です。
RGM が Start メソッドの失敗に応答する方法は、Failover_mode プロパティーの設定によって異なります。
リソースタイプ登録 (Resource Type Registration、RTR) ファイルの Start_timeout プロパティーが、リソースの Start メソッドのタイムアウト値を設定します。
リソースを含むリソースグループがクラスタノード上でオフラインになったとき、RGM はそのクラスタノード上でこの必須メソッドを実行します。このメソッドは、リソースを (アクティブであれば) 停止します。
ローカルノード上でリソースがすべての活動を完全に停止し、すべてのファイル記述子を閉じるまで、Stop メソッドは終了してはいけません。そうしないと、RGM が (実際にはアクティブであるのに) リソースが停止したと判断するため、データが破壊されることがあります。データの破壊を防ぐために最も安全な方法は、リソースに関連するローカルノード上ですべてのプロセスを停止することです。
Stop メソッドは終了する前にリソースをポーリングし、リソースが停止しているかどうかを判断する必要があります。さらに、このメソッドには、十分な長さのタイムアウト値を設定する必要があります。たとえば、特定のリソース (データベースデーモンなど) が停止するのに時間がかかる場合、そのメソッドには十分な長さのタイムアウト値が必要です。
RGM メソッドコールバックがタイムアウトすると、メソッドのプロセスツリーが、SIGTERM シグナルではなく、SIGABRT シグナルによって消去されます。その結果、プロセスグループのすべてのメンバーが、メソッドがタイムアウトを超過したノード上の /var/cluster/core ディレクトリまたは /var/cluster/core ディレクトリのサブディレクトリにコアダンプファイルを生成します。このコアダンプファイルは、メソッドがタイムアウトを超過した理由を判定できるように生成されます。
新しいプロセスグループを作成するデータサービスメソッドを書かないでください。データサービスメソッドで新しいプロセスグループを作成する必要がある場合は、SIGTERM および SIGABRT シグナルのシグナルハンドラを書きます。また、シグナルハンドラは、プロセスを終了する前に、単数または複数の子プロセスグループに SIGTERM または SIGABRT シグナルを転送する必要があります。これらのシグナルのシグナルハンドラを書くと、使用するメソッドによって生成されるすべてのプロセスが、正しく終了される可能性が高まります。
RGM が Stop メソッドの失敗に応答する方法は、Failover_mode プロパティーの設定によって異なります。「リソースのプロパティー」を参照してください。
RTR ファイルの Stop_timeout プロパティーが、リソースの Stop メソッドのタイムアウト値を設定します。
リソースを管理下に置くとき、RGM はこのオプションメソッドを実行して、リソースの初期化を 1 回だけ実行します。リソースグループが管理されていない状態から管理されている状態に切り替えられるとき、またはすでに管理されているリソースグループでリソースが作成されるとき、RGM はこのメソッドを実行します。このメソッドは、Init_nodes リソースプロパティーにより特定されるノード上で呼び出されます。
リソースが RGM によって管理されなくなったとき、RGM は Fini メソッドを実行して、そのリソースの使用後のクリーンアップを行います。Fini メソッドは、通常、Init メソッドにより実行された初期化を元に戻します。
RGM は、次のが状態が発生した場合、リソースが管理されなくなったノード上で Fini を実行します。
リソースを含むリソースグループが管理対象外状態に切り替わる。この場合、RGM はノードリストのすべてのノード上で Fini メソッドを実行します。
管理されているリソースグループからリソースが削除される。この場合、RGM はノードリストのすべてのノード上で Fini メソッドを実行します。
リソースを含むリソースグループのノードリストからノードが削除されます。この場合、RGM は削除されたノード上でのみ Fini メソッドを実行します。
「ノードリスト」はリソースグループの Nodelist またはリソースタイプの Installed_nodes リストのいずれかです。「ノードリスト」がリソースグループの Nodelist とリソースタイプの Installed_nodes リストのどちらを指すかは、リソースタイプの Init_nodes プロパティーの設定に依存します。Init_nodes プロパティーは RG_PRIMARIES または RT_INSTALLED_NODES に設定できます。大部分のリソースタイプでは、Init_nodes はデフォルトである RG_PRIMARIES に設定されます。この場合、Init メソッドと Fini メソッドは両方とも、リソースグループの Nodelist で指定されているノード上で実行されます。
Init メソッドが実行する初期化の種類は、次のように、ユーザーが実装した Fini メソッドが実行する必要があるクリーンアップの種類を定義します。
ノード固有の構成のクリーンアップ。
クラスタ全体の構成のクリーンアップ。
実装する Fini メソッドは、ノード固有の構成だけをクリーンアップするのか、それともノード固有の構成とクラスタ全体にわたる構成の両方をクリーンアップするのかを判断する必要があります。
特定のノード上でのみリソースが管理されなくなった場合、Fini メソッドはノード固有のローカル構成をクリーンアップできます。しかし、ほかのノード上ではリソースは引き続き管理されているため、Fini メソッドはクラスタ全体にわたるグローバル構成をクリーンアップしてはなりません。リソースがクラスタ全体にわたって管理されなくなった場合には、Fini メソッドはノード固有の構成とグローバル構成の両方についてクリーンアップを実行できます。実装する Fini メソッドのコードは、Fini メソッドを実行するローカルのノードがリソースグループのノードリストに含まれているかどうかを判定することによって、これら 2 つの場合を区別できます。
ローカルのノードがリソースグループのノードリストに含まれている場合は、リソースが削除されようとしているか、管理されない状態に移行しようとしています。リソースはどのノード上でもアクティブでなくなっています。この場合、実装する Fini メソッドでは、ローカルノード上のノード固有の構成だけでなく、クラスタ全体にわたる構成についてもクリーンアップする必要があります。
ローカルのノードがリソースグループのノードリストに含まれていない場合は、Fini メソッドでそのローカルノード上のノード固有の構成をクリーンアップできます。しかし、Fini メソッドでクラスタ全体にわたる構成をクリーンアップしてはなりません。この場合、ほかのノード上でリソースが引き続きアクティブになっています。
Fini メソッドは順序に依存しない様にコードを作成する必要もあります。つまり、Fini メソッドが以前の実行でリソースをクリーンアップした場合でも、以降の Fini 呼び出しは正常に終了します。
RGM は Init とよく似たこのオプションメソッドを実行し、リソースの所属リソースグループが RGM の管理下に置かれたあと、クラスタを結合するノード上のリソースを初期化します。RGM は、Init_nodes リソースプロパティーにより特定されるノード上でこのメソッドを実行します。Boot メソッドが呼び出されるのは、起動または再起動の結果としてノードがクラスタに結合または再結合したときです。
Global_zone リソースタイププロパティーが TRUE に等しい場合、リソースを含むリソースグループがグローバルクラスタ非投票ノードで動作するように構成されているときでも、メソッドはグローバルクラスタ投票ノードで実行されます。
Init、Fini、または Boot メソッドが失敗した場合は、エラーメッセージがシステムログに書き込まれます。ただし、それ以外は RGM によるリソース管理に影響しません。
リソース上での管理アクションには、リソースプロパティーの設定と変更があります。Validate および Update コールバックメソッドを使用してリソースタイプを実装すると、このような管理アクションを実行できます。
リソースの作成時や、クラスタ管理者によるリソースまたはリソースグループのプロパティーの更新時、RGM は、このオプションメソッドを呼び出します。このメソッドは、リソースタイプの Init_nodes プロパティーにより特定されるクラスタノードのセットに対して呼び出されます。Validate メソッドは作成または更新が行われる前に呼び出されます。任意のノード上でメソッドから失敗の終了コードが戻ってくると、作成または更新は取り消されます。
Validate は、クラスタ管理者によってリソースプロパティーまたはリソースグループプロパティーが変更されたときだけ呼び出されます。RGM によってプロパティーが設定されたときや、モニターによって Status および Status_msg リソースプロパティーが設定されたときは、このメソッドは呼び出されません。
RGM は、このオプションメソッドを実行して、プロパティーが変更されたことを実行中のリソースに通知します。管理アクションがリソースまたはそのグループのプロパティーの設定に成功したあとに、RGM は Update を実行します。このメソッドは、リソースがオンラインであるノード上で呼び出されます。このメソッドは、API アクセス関数を使用し、アクティブなリソースに影響する可能性があるプロパティー値を読み取り、その値に従って実行中のリソースを調節します。
Update メソッドが失敗した場合は、エラーメッセージがシステムログに書き込まれます。ただし、それ以外は RGM によるリソース管理に影響しません。
ネットワークアドレスリソースを使用するサービスでは、ネットワークアドレス構成から始まる特定の順番で、起動手順または停止手順を実行する必要があります。任意のコールバックメソッドの Prenet_start と Postnet_stop を使用してリソースタイプを実装すると、関連するネットワークアドレスが「起動」に構成される前、または、「停止」に構成されたあとに、特別な起動アクションとシャットダウンアクションを実行できます。
このオプションメソッドを呼び出して、同じリソースグループ内のネットワークアドレスが構成される前に特殊な起動アクションを実行することができます。
このオプションメソッドを呼び出して、同じリソースグループ内のネットワークアドレスを停止状態に構成したあとに特殊な終了アクションを実行することができます。
リソースタイプの実装は、オプションとして、リソースの性能を監視したり、その状態を報告したり、リソースの障害に対処するようなプログラムを含むことができます。Monitor_start、Monitor_stop、Monitor_check メソッドは、リソースタイプへのリソースモニターの実装をサポートします。
このオプションメソッドを呼び出して、リソースの起動後にリソースの監視を開始することができます。
この任意メソッドは、リソースが停止する前に呼び出され、リソースのモニターを停止します。
このオプションメソッドを呼び出して、リソースグループをノードに再配置する前に、そのノードの信頼性を査定することができます。Monitor_check メソッドは、並行して実行中のそのほかのメソッドと競合しない方法で実装する必要があります。