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

第 7 章 リソースタイプの設計

この章では、リソースタイプの設計や実装で Data Service Development Library (DSDL) を通常どのように使用するかについて説明します。また、リソース構成を検証したり、リソースの開始、停止、および監視を行なったりするためのリソースタイプの設計についても説明します。さらに、リソースタイプのコールバックメソッドを DSDL を使って実装する方法を説明します。

詳細は、rt_callbacks(1HA) のマニュアルページを参照してください。

これらの作業を行うには、リソースのプロパティー設定値にアクセスできなければなりません。DSDL ユーティリティー scds_initialize() を使用すると、統一された方法でリソースプロパティーにアクセスできます。この機能は、各コールバックメソッドの始めの部分で呼び出す必要があります。このユーティリティー関数は、クラスタフレームワークからリソースのすべてのプロパティーを取り出し、これによって、そのリソースは、scds_getname() 関数群から利用できるようになります。

この章の内容は次のとおりです。

リソースタイプ登録ファイル

RTR (Resource Type Registration 、リソースタイプ登録) ファイルは、Sun Cluster ソフトウェアに対して、リソースタイプの詳細な情報を指定します。

詳細情報には次の情報が含まれます。

ほとんどのリソースタイプ実装では、DSDL に添付されるサンプル RTR ファイルで十分なはずです。必要な作業は、リソースタイプ名、リソースタイプのコールバックメソッドのパス名などの基本的な要素の編集だけです。リソースタイプを実装する際に新しいプロパティーが必要な場合は、そのプロパティーをリソースタイプ実装の RTR ファイルで拡張プロパティーとして宣言します。新しいプロパティーのアクセスには DSDL scds_get_ext_property() ユーティリティーを使用します。

Validate メソッド

リソースタイプ実装の Validate コールバックメソッドの目的は、リソースに対する新しいプロパティー設定により指定されるリソースの新しい設定値が、そのリソースタイプにとって有効であるかどうかを検査することにあります。

リソースタイプ実装の Validate メソッドは、次のどちらかの条件のときに RGM によって呼び出されます。

この 2 つの操作は、リソースの Validate メソッドに渡されるコマンド行オプション -c (作成) と -u (更新) の存在によって区別されます。

Validate メソッドはノード群の各ノードまたは各ゾーンに対して呼び出されます。ノード群またはゾーンは、リソースタイププロパティー Init_nodes の値で定義されます。Init_nodesRG_PRIMARIES に設定されている場合、Validate は、そのリソースを含むリソースグループを収容できる (その主ノードになりうる) 各ノードまたはゾーンに対して呼び出されます。Init_nodes RT_INSTALLED_NODES に設定されている場合、Validate は、リソースタイプソフトウェアがインストールされている各ノードまたはゾーン (通常は、クラスタのすべてのノードまたはゾーン) に対して呼び出されます。

Init_nodes のデフォルト値は RG_PRIMARIES です (rt_reg(4) のマニュアルページを参照)。Validate メソッドが呼び出される時点では、RGM はまだリソースを作成していません (作成コールバックの場合)。あるいは、更新するプロパティーの更新値をまだ適用していません (更新コールバックの場合)。


注 –

HAStoragePlus リソースタイプによって管理されるローカルファイルシステムを使用している場合は、scds_hasp_check() 関数を使ってそのリソースタイプの状態を検査します。当該リソース用に定義されている Resource_dependencies または Resource_dependencies_weak のシステム属性を使用することによって、当該リソースが依存しているすべての SUNW.HAStoragePlus リソース状態 (オンラインであるか、オンラインでないか) についての情報が得られます。scds_hasp_check() 関数から返される状態コードの完全なリストについては、scds_hasp_check(3HA) のマニュアルページを参照してください。


DSDL 関数 scds_initialize() は、リソースの作成や更新を次のように処理します。

リソースのプロパティーの検証を実装する関数は svc_validate() と呼ばれます。この関数は、scds_get_name() 関数群を使って、検証しようとするプロパティーを検査します。リソースの設定が有効ならこの関数から戻りコード 0 が返されるとすると、リソースタイプの Validate メソッドは、次のコード部分のようになります。

int
main(int argc, char *argv[])
{
   scds_handle_t handle;
   int rc;

   if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR) {
   return (1);   /* Initialization Error */
   }
   rc = svc_validate(handle);
   scds_close(&handle);
   return (rc);
}

さらに検証関数は、リソースの検証が失敗した理由を記録する必要もあります。ただし、詳細は省略することによって、次に示すように、より単純な例である svc_validate() 関数を実装できます (第 8 章「サンプル DSDL リソースタイプの実装」には検証関数の実際的な取り扱いが記載されています)。

int
svc_validate(scds_handle_t handle)
{
   scha_str_array_t *confdirs;
   struct stat    statbuf;
   confdirs = scds_get_confdir_list(handle);
   if (stat(confdirs->str_array[0], &statbuf) == -1) {
   return (1);   /* 無効なリソースプロパティー設定 */
   }
   return (0);   /* 有効な設定 */
}

このように、リソースタイプの開発者は、svc_validate() 関数を実装することだけに集中できます。

Start メソッド

リソースタイプ実装の Start コールバックメソッドは、特定のクラスタノードまたはゾーンのリソースを開始するときに RGM によって呼び出されます。リソースグループ名とリソース名、およびリソースタイプ名はコマンド行から渡されます。Start メソッドは、クラスタノードまたはゾーンでデータサービスリソースを開始するために必要なアクションを行います。通常、このようなアクションには、リソースプロパティーの取得、アプリケーション固有の実行可能ファイルと構成ファイルの一方または両方の格納先の特定、および適切なコマンド行引数を用いたアプリケーションの起動が含まれます。

DSDL では、リソース構成ファイルが scds_initialize() ユーティリティーによってすでに取得されています。アプリケーションの起動アクションは、svc_start() 関数に指定できます。さらに、アプリケーションが実際に起動されたかどうかを確認するために、svc_wait() 関数を呼び出すことができます。Start メソッドのコード (詳細は省略) は、次のようになります。

int
main(int argc, char *argv[])
{
   scds_handle_t handle;

   if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR) {
   return (1);   /* 初期化エラー */
   }
   if (svc_validate(handle) != 0) {
   return (1);   /* 無効な設定 */
   }
   if (svc_start(handle) != 0) {
   return (1);   /* 起動に失敗 */
   }
   return (svc_wait(handle));
}

この起動メソッドの実装では、svc_validate() を呼び出してリソース構成を検証します。検証が失敗する場合は、リソース構成とアプリケーション構成が一致していないか、現在このクラスタノードまたはゾーンのシステムに関して何らかの問題があることを示しています。たとえば、リソースに必要なクラスタファイルシステムが、現在このクラスタノードまたはゾーンで使用できない可能性などが考えられます。その場合には、このクラスタノードまたはゾーンでこのリソースを起動しても意味がないので、RGM を使って別のノードまたはゾーンのリソースを起動すべきです。

ただし、上記の文では svc_validate() が十分に限定的であり、アプリケーションにより絶対に必要なリソースがあるかどうかをそのクラスタノードまたはゾーンだけで検査することに注意してください。そうでないと、このリソースはすべてのクラスタノードまたはゾーンで起動に失敗し、START_FAILED の状態になる可能性があります。この状態の詳細は、『Sun Cluster データサービスの計画と管理 (Solaris OS 版)』を参照してください。

svc_start() 関数は、このノードまたはゾーンでリソースの起動に成功した場合は戻りコード 0 を、問題を検出した場合は 0 以外の戻りコードをそれぞれ返す必要があります。この関数から 0 以外の値が返されると、RGM は、このリソースを別のクラスタノードまたはゾーンで起動しようと試みます。

DSDL を最大限に活用するには、svc_start() 関数で scds_pmf_start() ユーティリティーを呼び出して、アプリケーションを PMF (プロセス管理機能) のもとで起動できます。このユーティリティーは、PMF の障害コールバックアクション機能を使って、プロセス障害を検出します。詳細については、pmfadm(1M) マニュアルページの -a アクション引数の説明を参照してください。

Stop メソッド

リソースタイプ実装の Stop コールバックメソッドは、特定のクラスタノードまたはゾーンでアプリケーションを停止するときに RGM によって呼び出されます。

Stop メソッドのコールバックが有効であるためには、次の条件が必要です。

ほとんどのアプリケーションには、DSDL ユーティリティー scds_pmf_stop() で十分なはずです。これは、アプリケーションを SIGTERM で「静かに」停止しようとするためです。続いてこの関数は、プロセスに対してSIGKILL を適用します。この関数は、まず、アプリケーションが PMF の scds_pmf_start() で起動されたものとみなします。このユーティリティーの詳細については、「PMF 関数」を参照してください。

アプリケーションを停止するそのアプリケーション固有の関数を svc_stop() とするなら、Stop メソッドは、次のように実装します。

if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR)
{
   return (1);   /* 初期化エラー */
}
return (svc_stop(handle));

前述の svc_stop() 関数の実装に scds_pmf_stop() 関数が含まれているかどうかは、ここでは関係ありません。scds_pmf_stop() 関数を含めるかの決定は、アプリケーションが PMF のもとで Start メソッドによって起動されているかどうかに依存します。

Stop メソッドの実装では、 svc_validate() メソッドは使用されません。システムに問題があったとしても、Stop メソッドは、このノードまたはゾーンでこのアプリケーションを Stop すべきだからです。

Monitor_start メソッド

RGM は、リソースの障害モニターを起動する場合に Monitor_start メソッドを呼び出します。障害モニターは、このリソースによって管理されているアプリケーションの状態を監視します。リソースタイプの実装では、通常、障害モニターはバックグラウンドで動作する独立したデーモンとして実装されます。このデーモンの起動には、適切な引数をもつ Monitor_start コールバックメソッドが使用されます。

モニターデーモン自体は障害が発生しやすいため (たとえばモニターは、アプリケーションを監視されない状態にしたまま、停止することがある)、モニターデーモンは、PMF を使って起動すべきです。DSDL ユーティリティー scds_pmf_start() には、障害モニターを起動する機能が組み込まれています。このユーティリティーは、モニターデーモンプログラムのリソースタイプコールバックメソッド実装の場所を表す RT_basedir からの相対パス名を使用します。このユーティリティーは、DSDL によって管理される Monitor_retry_interval 拡張プロパティーと Monitor_retry_count 拡張プロパティーを使って、デーモンが際限なく再起動されるのを防止します。

このユーティリティーでは、モニターデーモンのコマンド行構文には、すべてのコールバックメソッドに対して定義されたコマンド行構文と同じものが使用されます (-R resource -G resource-group -T resource-type) が、モニターデーモンが RGM から直接呼び出されることは決してありません。このユーティリティーでは、モニターデーモン実装自体が scds_initialize() ユーティリティーで独自の環境を設定できます。 したがって、主な作業は、モニターデーモン自体を設計することです。

Monitor_stop メソッド

RGM は、Monitor_start メソッドで起動された障害モニターデーモンを停止するために、Monitor_stop メソッドを呼び出します。このコールバックメソッドの失敗は、Stop メソッドの失敗とまったく同じように処理されます。したがって、Monitor_stop メソッドは、Stop メソッドと同じように強固なものでなければなりません。

障害モニターデーモンを scds_pmf_start() ユーティリティーを使って起動したら、scds_pmf_stop() ユーティリティーで停止する必要があります。

Monitor_check メソッド

RGM は、指定されたリソースについて、クラスタノードまたはゾーンがリソースをマスターする能力を持っているかどうかを確認するために、そのノードまたはゾーンのリソースに対して Monitor_check コールバックメソッドを実行します。つまり、RGM は、そのリソースによって管理されるアプリケーションがそのノードまたはゾーンで正常に動作するかどうかを判別するためにこのメソッドを実行します。

通常、この状況では、アプリケーションに必要なすべてのシステムリソースが本当にクラスタノードまたはゾーンで使用可能かどうかが確認されます。Validate メソッド」で説明されているように、開発者が実装する svc_validate() 関数は、少なくともこの確認が行われなければなりません。

リソースタイプ実装によって管理されている特定のアプリケーションによっては、Monitor_check メソッドでそのほかの作業を行うことがあります。Monitor_check メソッドは、並行して実行中のそのほかのメソッドと競合しない方法で実装する必要があります。DSDL を使用する場合には、リソースプロパティーに対するアプリケーション固有の検証を実装する svc_validate() 関数を Monitor_check メソッドで呼び出す必要があります。

Update メソッド

RGM は、リソースタイプ実装の Update メソッドを呼び出して、クラスタ管理者が行なったすべての変更をアクティブリソースの構成に適用します。Update メソッドは、そのリソースがオンラインになっているすべてのノードまたはゾーンに対して呼び出されます。

リソースの構成に対して行われた変更は、リソースタイプ実装にとって必ず有効なものです。RGM は、リソースタイプの Update メソッドを呼び出す前に Validate メソッドを呼び出すからです。Validate メソッドは、リソースやリソースグループのプロパティーが変更される前に呼び出されます。したがって、Validate メソッドは新しい変更を拒否できます。変更が適用されると、Update メソッドが呼び出され、新しい設定値がアクティブ (オンライン) リソースに通知されます。

リソースタイプの開発者は、どのプロパティーを動的に変更できるようにするかを慎重に決定し、RTR ファイルでこれらのプロパティーに TUNABLE = ANYTIME を設定する必要があります。通常、障害モニターデーモンによって使用されるリソースタイプ実装のプロパティーは、すべて動的に更新できるように指定できます。ただし、Update メソッドの実装は、少なくともモニターデーモンを再起動できなければなりません。

使用できるプロパティーの候補には次のものがあります。

これらのプロパティーは、障害モニターデーモンがサービスの状態をどのようにチェックするかや、デーモンがチェックをどのような頻度で行うか、エラーをデーモンがどのような履歴間隔を使用して追跡管理するか、あるいは、PMF がどのような再起動しきい値を設定するかに影響を及ぼします。DSDL には、これらのプロパティーの更新を行うための scds_pmf_restart() ユーティリティーが備わっています。

リソースプロパティーを動的に更新できなければならないが、プロパティーの変更によって動作中のアプリケーションに影響が及ぶ可能性がある場合は、適切なアクションを行なう必要があります。プロパティーに対する更新が動作中のアプリケーションインスタンスに正しく適用されるようにしなければなりません。現在のところ、DSDL を使用してこのようにリソースプロパティーを動的に更新することはできません。変更されたプロパティーをコマンド行で Update に渡すことはできません (Validate では可能)。

Init FiniBoot の各メソッドの説明

これらのメソッドは、リソース管理 API 仕様の定義による「一度だけのアクション」を行うためのものです。DSDL のサンプル実装には、これらのメソッドの使い方は示されていません。しかし、これらのメソッドを使用する必要がある場合には、DSDL のすべての機能をこれらのメソッドでも使用できます。通常、「一度だけのアクション」を使用するリソースタイプ実装では、Init メソッドと Boot メソッドはまったく同じように機能します。Fini メソッドは、一般に、Init メソッドや Boot メソッドのアクションを「取り消す」ためのアクションを実行します。

障害モニターデーモンの設計

DSDL を使用したリソースタイプ実装には、通常、次の役割を実行する障害モニターデーモンがあります。

DSDL ユーティリティーの設計では、障害モニターデーモンの主要ループは、この節の最後にある擬似コードで表すことができます。

DSDL を使用して障害モニターを実装する際には、次の点に注意してください。

ほとんどの場合、アプリケーション固有の状態検査アクションは、スタンドアロンの別個のユーティリティー (たとえば、svc_probe()) に実装できます。これは、次の汎用的なメインループに統合できます。

for (;;) {
   /* 正常な検証と検証の間の thorough_probe_interval
   *  だけスリープする。
   */
   (void) scds_fm_sleep(scds_handle,
   scds_get_rs_thorough_probe_interval(scds_handle));
   /* 使用するすべての ipaddress を検証する。次の各要素を繰り返し検証する。
   * 1. 使用するすべてのネットリソース
   * 2. 特定のリソースのすべての ipaddresses
   * 検証する ipaddress ごとに
   * 障害履歴を計算する。 
   */
   probe_result = 0;
   /* すべてのリソースを繰り返し調べて、
   * svc_probe() の呼び出しに使用する各 IP アドレスを取得する。
   */
   for (ip = 0; ip < netaddr->num_netaddrs; ip++) {
   /* 状態を検証する必要があるホスト名とポート
   * を取得する。
   */
   hostname = netaddr->netaddrs[ip].hostname;
   port = netaddr->netaddrs[ip].port_proto.port;
   /*
   * HA-XFS は、1 つのポートしかサポートしないため
   * ポート配列の最初のエントリから
   * ポート値を取得する。
   */
   ht1 = gethrtime();
   /* Latch probe start time */
   probe_result = svc_probe(scds_handle, hostname, port, timeout);
   /*
   * サービス検証履歴を更新し、
   * 必要に応じてアクションを実行する。
   * 検証終了時刻を保存する。
   */
   ht2 = gethrtime();
   /* ミリ秒に変換する。 */
   dt = (ulong_t)((ht2 - ht1) / 1e6);
   /*
   * 障害履歴を計算し、
   * 必要に応じてアクションを実行する。
   */
   (void) scds_fm_action(scds_handle,
   probe_result, (long)dt);
   }       /* 各ネットワークリソース */
   }       /* 検証を続ける */