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

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

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);
   }       /* 各ネットワークリソース */
   }       /* 検証を続ける */