Recent Changes

2011-05-06
2011-02-22
2011-02-18
2011-02-16
2011-02-15

Latest File Release

[1-01] Pacemakerリポジトリパッケージ (RHEL7) (1.1.19-1.1)2018-12-07 13:00
[1-02] Pacemakerリポジトリパッケージ (RHEL6) (1.1.19-1.1)2018-12-07 13:00
[1-03] Pacemakerリポジトリパッケージ (RHEL5) (1.0.13-2.1)2014-08-13 09:28
[1-10] pm_ctl : 運用管理連携機能 (1.0-1)2012-11-05 11:20
[1-11] pm_logconv-cs : ログメッセージ制御機能(Corosync対応) (1.0-1)2012-11-12 09:53
[2-01] Heartbeat (RedHat/CentOS用rpmパッケージ) (2.1.4-1)2008-08-28 09:53
[2-02] hb-monitor:クラスタ状態表示機能 (1.03-1)2011-02-16 07:21
[2-03] hb-extras:拡張リソースエージェント・プラグイン (1.02-1)2011-02-16 07:21
[2-04] hb-logconv:ログメッセージ制御機能 (1.02-1)2011-02-16 07:21
[2-05] hb-cibgen:cib.xml編集ツール (1.03-1_1)2009-11-16 13:31
[2-06] hb-diskd:ディスク監視デーモン (1.10-1)2010-01-22 10:20
[2-07] VIPcheck:VIPcheckリソースエージェント (1.1)2009-11-30 07:21
[2-08] hb-sfex:共有ディスク排他制御 (1.30-1)2010-01-22 10:00
[2-09] hb-logmoni:ロギングデーモン監視 (2.00-1)2010-01-22 10:10
[2-10] hb-ipv6:IPv6対応追加パッケージ (1.00-1)2010-01-29 07:21
[2-11] hb-vmmonitor:デバイス一括監視機能 (1.00-1)2010-06-11 07:21
[2-12] vm-logd-monitor:ログデーモン監視機能(Domain-0用) (1.00-1)2010-06-11 07:21
[2-13] stonith-wrapper2:STONITHラッパープラグイン2 (2.00)2010-06-18 07:21
[2-14] hb-actmonitor:フェイルオーバ抑止機能 (1.00-1)2010-11-26 07:21

Wiki Guide

Side Bar

ディスク監視デーモン (hb-diskd)

このプログラムはディスクの状態を監視するものです。pingdによるネットワーク監視の方式をディスク監視に応用しています。
バージョン 1.10-1 からは、rpmによるインストールが可能になっています。
作成、テストはHeartbeat-2.1.4 で行っています。問題があれば linux-ha-japan@lists.souceforge.jp にご報告ください。

このリリースのファイルを表示

diskdは一定間隔で指定されたディスクにアクセスすることによりディスクの正常性を監視しています。
以下の2種類のディスクアクセス方法があり、オプションによって指定可能です。

  • readによる監視 : 指定されたデバイスに対して、read()関数を用いて読み込みを行い、ディスクの正常性を確認します。
  • writeによる監視 : 指定されたデバイスに対して、write()関数を用いて書き出しを行い、ディスクの正常性を確認します。

diskdは複数のインスタンスを起動することができます。監視対象ディスクが複数ある場合には複数起動するように指定してください。 詳細はオプション、使用方法を参照してください。
以下に、インストール、使用方法を記述します。ここでの記述は64bit環境のものです。32bit環境ではインストールされるディレクトリが異なりますので、環境に合わせて読み替えてください。

diskd1.10.png

1. インストール

1.1. rpmパッケージからのインストール

本ツールのパッケージ hb-diskd-1.10-1.hb214.x86_64.rpm をダウンロードします。その後、以下のようにrpmコマンドを使ってインストールします。

# rpm -ivh hb-diskd-1.10-1.hb214.x86_64.rpm
Preparing...                ########################################### [100%]
   1: hb-diskd              ########################################### [100%]

2. 起動オプション

diskdを起動する際に指定できるオプションを以下に示します。

  • 基本オプション
    • -N <device_name> :読み取りによるディスク正常性チェック時にアクセスするデバイス名。必須項目。※1
    • -w ファイル書き込みによるディスク正常性チェックを有効にするオプション。必須項目。※1
    • -d <directory_name> :書き込み用ファイルを作成するディレクトリ名。デフォルト:/tmp※2
    • -i <intarval>:ディスクアクセスする間隔。デフォルト:30秒 指定可能範囲:1~3600秒
    • -D デーモン化の指定
    • -a <attribute>:status内の属性名。デフォルト:diskd
  • 詳細設定オプション
    • -t <timeout>:タイムアウト タイムアウトの値を設定する。指定範囲は1〜3600秒デフォルトは30秒。なお、本オプションは正常性確認で用いているread()/write()システムコールがEAGEINでエラーとなった場合に、再度read()/write()処理を行うまでの最大待ち時間である。
    • -r <retry>:ディスク確認失敗時の内部のリトライ回数。デフォルト:1回 指定可能範囲:0~10 retry=2とすると、最大3回の確認を行うことになる。
    • -I <retry_interval>:リトライする場合のリトライ間隔。デフォルト:5秒 指定可能範囲:1~3600秒
  • ※1."-w"と"-N"オプションは同時指定不可
  • ※2."-N"オプションと同時指定時は無効

3. 使用方法

diskdを使って、ディスクの正常性の監視および、監視結果によりリソースの配置を制御するためにはha.cfとcib.xmlへの設定が必要となります。

  • ha.cfへの設定追加
    Heartbeatの起動時にdiskdを起動するように設定を追加します。監視方法(read/write)、監視間隔等はオプションとして指定します。
    例1) readによる監視 : "-N"オプション指定時
    respawn root /usr/lib64/heartbeat/diskd -N /dev/sdc -a diskcheck_status -i 10
    例2) writeによる監視 :"-w"オプション指定時
    respawn root /usr/lib64/heartbeat/diskd -w -a diskcheck_status -i 10
    例3) writeによる監視 : "-w"と"-d"オプション指定時
    respawn root /usr/lib64/heartbeat/diskd -w -d /tmp/diskd -a diskcheck_status -i 10
    
  • cib.xmlへの設定追加
    ha.cf記述内の-a オプションで指定した値に対しての制約(constraints)を記述します。
    diskdは監視対象ディスクに不具合を検知した場合、-a オプションで指定した属性の値を"ERROR"に変更します(不具合がない状況での値は"normal")。
    属性の値が"ERROR"に変更された場合にリソースをどのように動作させるかのルールを記述します。
    以下の記述例では、故障が検知され属性diskcheck_statusが"ERROR"に変更された場合にはリソース:grp_pgsqlを故障が検知されたノードでは動作させないという制約の記述を行っています。
      (..略..)
    <constraints>
      (..略..)
       <rsc_location id="rul_DK_dsc" rsc="grp_pgsql">
          <rule id="prefered_rul_DK_dsc" score="-INFINITY" boolean_op="and">
              <expression attribute="diskcheck_status" id="dkstatus1" operation="defined"/>
              <expression attribute="diskcheck_status" id="dkstatus2" operation="eq" value="ERROR"/>
          </rule>
        </rsc_location>
      (..略..)
    </constraints> 
    

設定例

図1の場合(共有ディスクをreadによる監視、ローカルディスクをwriteによる監視を実施)の設定例を以下に示します。

  • ha.cf
      (..略..)
      respawn root /usr/lib64/heartbeat/diskd -N /dev/sdc -a diskcheck_status -i 10
      respawn root /usr/lib64/heartbeat/diskd -w -a diskcheck_status_internal -i 10
    
  • cib.xml
    <constraints>
      (..略..)
       <rsc_location id="rul_DK_shard" rsc="grp_pgsql">
          <rule id="prefered_rul_DK_shard" score="-INFINITY" boolean_op="and">
              <expression attribute="diskcheck_status" id="dkstatus1" operation="defined"/>
              <expression attribute="diskcheck_status" id="dkstatus2" operation="eq" value="ERROR"/>
          </rule>
        </rsc_location>
        <rsc_location id="rul_DK_internal" rsc="grp_pgsql">
          <rule id="prefered_rul_DK_internal" score="-INFINITY" boolean_op="and">
              <expression attribute="diskcheck_status_internal" id="dkstatus_internal1" operation="defined"/>
              <expression attribute="diskcheck_status_internal" id="dkstatus_internal2" operation="eq" value="ERROR"/>
          </rule>
        </rsc_location>
      (..略..)
    </constraints> 
    

注意事項

  • readによる監視における監視先指定方法に関する注意
    • 監視先のデバイス名はディスクのデバイス名指定(例: /dev/sdc)でもパーティション指定(例: /dev/sdc2)でも設定可能ですが、通常はディスクのデバイス名指定で問題ありません。
    • 同一物理ディスク上にある複数のパーティションに対して個別のdiskd監視設定を行っても、故障検知できる範囲はほとんど変わらないため意味はありません。
  • writeによる監視に関する注意
    • writeによる監視で書き出し先として用いるのはファイルであるため、diskdを起動する前に監視先ファイルに正しくアクセスできる必要があります。
    • Filesysem RAを使い、Active/Standbyのノード間でマウントを制御する共有ディスクをdiskdのwriteによる監視の監視対象とした場合、diskd起動時にはFilesystem RAによるマウント処理が行われていないため、diskdでは正しく監視できません(図2参照)
    • writeによる監視はローカルディスクに対する監視とすることをお勧めします。
diskd_write_shdisk.PNG

4. エラーコード

レベル出力内容意味出力関数
errCould not send update更新をattrdに送信できなかった。send_update
errpermission denied. diskd shuld be execute by root.rootで本プログラムが実行されていないmain
errArgument code 0<arg> (<arg>) is not (?yet?) supported実装されていないコマンドライン引数が指定されたmain
errnon-option ARGV-elements: <arg>必要なオプションが指定されていないmain
errattrd registration failedattrdに登録できなかったmain
errCould not allocate memoryメモリの確保ができなかったmain
errCould not open <filename>書き込み用ファイルがオープンできないdiskcheck_wt
errselect failed on file <filename>select関数でfdを監視していたが、エラーとなったdiskcheck_wt
errselect time out on file <filename>select関数でfdを監視していたがタイムアウトとなったdiskcheck_wt
errCould not write to file <filename>write関数で書き込みに失敗したdiskcheck_wt
errCould not open device <devicename>指定されたデバイスがオープンできないdiskcheck
errioctl error, Could not flush bufferioctlにてバッファをフラッシュしようとしたが失敗したdiskcheck
errCould not read from device <devicename>read関数で読み込みに失敗した。diskcheck
errselect failed on device <devicename>select関数でfdを監視していたが、エラーとなったdiskcheck
errselect timeout on device <devicename>select関数でfdを監視していたがタイムアウトとなったdiskcheck
warnfailed to remove file <filename>書き込み用ファイルの削除に失敗したdiskcheck_wt
warnwrite function return errno:EAGAINwrite関数にて書き込みを行ったがEAGAINが返却されたdiskcheck_wt
warnselect ok, write againselect関数で監視していたfdが書き込み可能となったdiskcheck_wt
warnError(s) occurred in diskcheck function. diskcheck関数でなんらかのエラーが検出されたdiskcheck
warnread function return errno:EAGAINread関数にて読み込みを行ったがEAGAINが返却されたdiskcheck
warnnon-defined status, new_status = <num>規程されていないstatusが指定されたcheck_old_status
warndisk status is changed, new_status = <STATUS>ディスクの状態が変わった時。normal->ERROR / ERROR->normalcheck_old_status
infoExiting本関数がコールされ、プログラムが終了段階にあることをログ出力するdiskd_shutdown
infoStarting <system_name>diskdを開始し、mainloopに入るmain
infoExiting <system_name>diskdを終了するmain
debugattrd registration attempt: <times>attrdに登録を試みている。回数を含めて表示main
debug2diskcheck_wt start書き込み用ディスクチェック関数が開始されたことを示すデバッグログdiskcheck_wt
debug2data writing is OK書き込み用ディスクチェック関数により、ディスクの正常状態が確認されたことを示すデバッグログdiskcheck_wt
debug2Diskcheck function startディスクチェック関数が開始されたことを示すデバッグログdiskcheck
debug2Reading form data is OKディスクの正常状態が確認されたことを示すデバッグログdiskcheck