Skip to content
Yusuke Iida edited this page Jan 19, 2015 · 5 revisions

diskd(Release: 2.0)

1.はじめに

  • このプログラムはディスクの状態を監視するものです。旧pingdによるネットワーク監視の方式をディスク監視に応用しています。
  • 作成、テストはPacemaker-1.1.12 + Corosync-2.3.4 で行っています。問題があれば [email protected] にご報告ください。

2.概要

  • diskdは一定間隔で指定されたディスクにアクセスすることによりディスクの正常性を監視しています。
  • 以下の2種類のディスクアクセス方法があり、オプションによって指定可能です。
  • readによる監視 : 指定されたデバイスに対して、read()関数を用いて読み込みを行い、ディスクの正常性を確認します。
  • writeによる監視 : 指定されたデバイスに対して、write()関数を用いて書き出しを行い、ディスクの正常性を確認します。
  • diskdは複数のインスタンスを起動することができます。監視対象ディスクが複数ある場合には複数起動するように指定してください。 詳細はオプション、使用方法を参照してください。
  • 以下に、インストール、使用方法を記述します。ここでの記述は64bit環境のものです。32bit環境ではインストールされるディレクトリが異なりますので、環境に合わせて読み替えてください。

3.インストール

  • 本ツールはLinux-HA Japanから提供しているpacemaker-repo-1.1.12パッケージに含まれています。
  • 下記URLからpacemaker-repo-1.1.12パッケージをダウンロードしてインストールしてください。
# rpm -ivh pacemaker-repo-1.1.12-1.1.el6.x86_64.rpm 
準備中...                ########################################### [100%]
   1:pacemaker-repo         ########################################### [100%]
# yum install pacemaker-all -y
(snip)
Installed:
  pacemaker-all.noarch 0:1.1.12-1.1.el6

Dependency Installed:
  cluster-glue.x86_64 0:1.0.12-1.el6  cluster-glue-libs.x86_64 0:1.0.12-1.el6  corosync.x86_64 0:2.3.4-1.el6        corosynclib.x86_64 0:2.3.4-1.el6              crmsh.x86_64 0:2.1-1.el6
  libqb.x86_64 0:0.17.1-1.el6         pacemaker.x86_64 0:1.1.12-1.el6          pacemaker-cli.x86_64 0:1.1.12-1.el6  pacemaker-cluster-libs.x86_64 0:1.1.12-1.el6  pacemaker-libs.x86_64 0:1.1.12-1.el6
  pm_crmgen.noarch 0:2.0-1.el6        pm_diskd.x86_64 0:2.0-1.el6              pm_extras.x86_64 0:2.0-1.el6         pm_logconv-cs.noarch 0:2.0-1.el6              resource-agents.x86_64 0:3.9.5-1.589.b6443.el6

Complete!
  • (注)pm_diskd-2.0パッケージはインストールに以下のパッケージを必要とします
  • pacemaker-libs-1.1.8以上

4.使用方法

  • diskdを使って、ディスクの正常性の監視および、監視結果によりリソースの配置を制御するためにはcib.xmlへの設定が必要となります。
  • 本手順ではcib.xmlへの設定追加方法にcrmshを使用した解説を行います。
  • diskdリソースの追加
  • すべてのノードで稼働させるためcloneリソースとして定義します。
    clone clnDiskd1 prmDiskd1
    
    primitive prmDiskd1 ocf:pacemaker:diskd \
        params \
                name="diskcheck_status" \
                device="/dev/vdb" \
                options="-e -t 60" \
                interval="10" \
                dampen="2" \
        op start interval="0s" timeout="20s" on-fail="restart" \
        op monitor interval="10s" timeout="20s" on-fail="restart" \
        op stop interval="0s" timeout="20s" on-fail="ignore"
    
  • リソース配置制約の追加
  • diskdリソースのname属性で指定した値に対しての制約(constraints)を記述します。

  • diskdは監視対象ディスクに不具合を検知した場合、name属性で指定した属性の値を"ERROR"に変更します(不具合がない状況での値は"normal")。

  • 属性の値が"ERROR"に変更された場合にリソースをどのように動作させるかのルールを記述します。

  • 以下の記述例では、故障が検知され属性diskcheck_statusが"ERROR"に変更された場合にはリソース:group1を故障が検知されたノードでは動作させないという制約の記述を行っています。

    location rsc_location-group1-1 group1 \
        rule -inf: not_defined diskcheck_status or diskcheck_status eq ERROR
    

5.設定例

  • 共有ディスクをreadによる監視、ローカルディスクをwriteによる監視を実施する場合の設定例を以下に示します。
clone clnDiskd1 prmDiskd1
clone clnDiskd2 prmDiskd2

primitive prmDiskd1 ocf:pacemaker:diskd \
    params \
            name="diskcheck_status_internal" \
            device="/dev/vda" \
            options="-e -t 60" \
            interval="10" \
            dampen="2" \
    op start interval="0s" timeout="20s" on-fail="restart" \
    op monitor interval="10s" timeout="20s" on-fail="restart" \
    op stop interval="0s" timeout="20s" on-fail="ignore"

primitive prmDiskd2 ocf:pacemaker:diskd \
    params \
            name="diskcheck_status_internal" \
            write_dir="/tmp" \
            options="-e -t 60" \
            interval="10" \
            dampen="2" \
    op start interval="0s" timeout="20s" on-fail="restart" \
    op monitor interval="10s" timeout="20s" on-fail="restart" \
    op stop interval="0s" timeout="20s" on-fail="ignore"

location rsc_location-group1-1 group1 \
    rule -inf: not_defined diskcheck_status_internal or diskcheck_status_internal eq ERROR
    rule -inf: not_defined diskcheck_status or diskcheck_status eq ERROR

6.動作確認

  • diskdが正常に起動していることを"crm_mon -A1"で確認します。
# crm_mon -A1
Last updated: Fri Jan 16 09:49:05 2015
Last change: Fri Jan 16 09:48:35 2015
Stack: corosync
Current DC: rhel65-1 (3232261527) - partition WITHOUT quorum
Version: 1.1.12-561c4cf
1 Nodes configured
3 Resources configured


Online: [ rhel65-1 ]

 Resource Group: group1
     prmDummy   (ocf::pacemaker:Dummy): Started rhel65-1 
 Clone Set: clnDiskd1 [prmDiskd1]
     Started: [ rhel65-1 ]
 Clone Set: clnDiskd2 [prmDiskd2]
     Started: [ rhel65-1 ]

Node Attributes:
* Node rhel65-1:
    + diskcheck_status                  : normal    
    + diskcheck_status_internal         : normal    
  • ディスクの状態を表す属性値は、以下のように表示されます。
  • 正常時

    + diskcheck_status                  : normal    
    
  • 故障時

    + diskcheck_status                  : ERROR    
    
  • 属性値が"ERROR"と表示されたノードのディスクは異常な状態となっています。直ちに原因を調査し復旧してください。

7.注意事項

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

8.起動オプション一覧

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

    オプション 引数 意味
    -N <device> 読み取りによるディスク正常性チェック時にアクセスするデバイス名。必須項目。※1
    -w ファイル書き込みによるディスク正常性チェックを有効にするオプション。必須項目。※1
    -d <directory> 書き込み用ファイルを作成するディレクトリ名。デフォルト:/tmp※2
    -i <time[s]> ディスクアクセスする間隔。デフォルト:30秒 指定可能範囲:1~3600秒
    -D デーモン化の指定
    -a <string> status内の属性名。デフォルト:diskd
    -p <file> デーモン化モードでの動作時のpidファイル名の指定。デフォルト:/tmp/diskd.pid
    -o ディスク監視を1度だけ実行するオプション
    -e ディスク監視のタイマーにthreadを使うモード。タイムアウト値は"-t"で設定したものが使用される※3
    -m <time[s]> 属性更新にかける遅延時間。デフォルト値:0秒
    -V 標準エラー出力にログを出力するモードの有効化
    -? ヘルプの表示
  • 詳細設定オプション

    オプション 引数 意味
    -t <time[s]> タイムアウト タイムアウトの値を設定する。指定範囲は1〜3600秒デフォルトは30秒。なお、本オプションは正常性確認で用いているread()/write()システムコールがEAGEINでエラーとなった場合に、再度read()/write()処理を行うまでの最大待ち時間である。
    -r <times> ディスク確認失敗時の内部のリトライ回数。デフォルト:1回 指定可能範囲:0~10 retry=2とすると、最大3回の確認を行うことになる。
    -l <time[s]> リトライする場合のリトライ間隔。デフォルト:5秒 指定可能範囲:1~3600秒
  • ※1:"-w"と"-N"オプションは同時指定不可
  • ※2:"-N"オプションと同時指定時は無効
  • ※3:"-o"オプションと同時指定時は無効

9.ログ一覧

  • 以下にdiskdが出力するログの一覧を提示します。
  • (注)debugレベルは除外
レベル 出力内容 意味
error Cannot create diskd timer_thread. %s タイマースレッドの作成に失敗した
error Could not open %s WRITEチェック用のファイルのopen()に失敗した
error select failed on file %s WRITEチェック用のファイルのselect()処理に失敗した
error select time out on file %s WRITEチェック用のファイルのselect()処理がタイムアウトした
error Could not write to file %s WRITEチェック用のファイルへの書き込みに失敗した
error Could not open device %s READチェック用のデバイスのopen()に失敗した
error ioctl error, Could not flush buffer READチェック用デバイスのbufferのフラッシュに失敗した
error select failed on device %s READチェック用のデバイスのselect()処理に失敗した
error Could not read from device %s READチェック用のデバイスのread()に失敗した
error Could not allocate memory チェックに使用するデータのメモリ確保に失敗した
error permission denied. diskd should be executed by root. rootユーザ以外でdiskdが実行された
error Argument code 0%o (%c) is not (?yet?) supported 未知のオプションが指定された
error non-option ARGV-elements: 引数を必要としないオプションに引数が指定された
warning non-defined status, new_status = %d 規程されていないstatusが指定された
warning disk status is changed, attr_name=%s, target=%s, new_status=%s ディスクの状態が変化した (normal->ERROR / ERROR->normal)
warning The thread timer of diskd is not supported. By this system, I/O blocking may occur by a check of diskd in read/write. システムによりスレッドタイマーがサポートされていない
warning Failed in the generation of the thread variable. The thread timer is not available. スレッド用変数の生成に失敗したため、スレッドタイマーが使用不可
warning Cannot transmit cond to a thread スレッドに状態を送れない
warning Timeout Error(s) occurred in diskd timer thread. タイマースレッドでタイムアウトが発生した
warning failed to remove file %s 書き込み用ファイルの削除に失敗した
warning write function return errno:EAGAIN write関数にて書き込みを行ったがEAGAINが返却された
warning select ok, write again select()で監視していたfdが書き込み可能となった
warning Error(s) occurred in diskcheck_wt function. diskcheck_wt関数でなんらかのエラーが検出された
warning read function return errno:EAGAIN read関数にて読み込みを行ったがEAGAINが返却された
warning Error(s) occurred in diskcheck function. diskcheck_wt関数でなんらかのエラーが検出された
warning "d" option was ignored, because N option was specified. "d"オプションと"N"オプションが同時に指定された
info Exiting diskd_shutdown()が呼び出された
info Starting %s 本関数がコールされ、プログラムが終了段階にあることをログ出力する
info Exiting %s diskdを終了する