Sun Cluster データサービス開発ガイド (Solaris OS 版)

制御および初期化コールバックメソッド

制御および初期化コールバックメソッドは、主に、リソースを起動および停止します。その他のメソッドは、リソース上で初期化と終了コードを実行します。

Start

リソースを含むリソースグループがクラスタノード上でオンラインになったとき、RGM はそのクラスタノード上でこのメソッドを実行します。このメソッドは、そのノード上でリソースを起動します。

ローカルノード上でリソースが起動され、利用可能になるまで、Start メソッドは終了できません。したがって、Start メソッドは終了する前にリソースをポーリングし、リソースが起動しているかどうかを判断する必要があります。さらに、このメソッドには、十分な長さのタイムアウト値を設定する必要があります。たとえば、データベースデーモンなど特定のリソースが起動するのに時間がかかる場合、そのメソッドには十分な長さのタイムアウト値が必要です。

RGM が Start メソッドの失敗に応答する方法は、Failover_mode プロパティーの設定によって異なります。

リソースタイプ登録 (Resource Type Registration、RTR) ファイルの Start_timeout プロパティーが、リソースの Start メソッドのタイムアウト値を設定します。

Stop

リソースを含むリソースグループがクラスタノード上でオフラインになったとき、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 メソッドのタイムアウト値を設定します。

Init

リソースを管理下に置くとき、RGM はこのオプションメソッドを実行して、リソースの初期化を 1 回だけ実行します。リソースグループが管理されていない状態から管理されている状態に切り替えられるとき、またはすでに管理されているリソースグループでリソースが作成されるとき、RGM はこのメソッドを実行します。このメソッドは、Init_nodes リソースプロパティーにより特定されるノード上で呼び出されます。

Fini

リソースが 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 呼び出しは正常に終了します。

Boot

RGM は Init とよく似たこのオプションメソッドを実行し、リソースの所属リソースグループが RGM の管理下に置かれたあと、クラスタを結合するノード上のリソースを初期化します。RGM は、Init_nodes リソースプロパティーにより特定されるノード上でこのメソッドを実行します。Boot メソッドが呼び出されるのは、起動または再起動の結果としてノードがクラスタに結合または再結合したときです。

Global_zone リソースタイププロパティーが TRUE に等しい場合、リソースを含むリソースグループがグローバルクラスタ非投票ノードで動作するように構成されているときでも、メソッドはグローバルクラスタ投票ノードで実行されます。


注 –

InitFini、または Boot メソッドが失敗した場合は、エラーメッセージがシステムログに書き込まれます。ただし、それ以外は RGM によるリソース管理に影響しません。