-
Notifications
You must be signed in to change notification settings - Fork 3
Home
Yusuke Iida edited this page Jan 19, 2015
·
5 revisions
- このプログラムはディスクの状態を監視するものです。旧pingdによるネットワーク監視の方式をディスク監視に応用しています。
- 作成、テストはPacemaker-1.1.12 + Corosync-2.3.4 で行っています。問題があれば [email protected] にご報告ください。
- diskdは一定間隔で指定されたディスクにアクセスすることによりディスクの正常性を監視しています。
- 以下の2種類のディスクアクセス方法があり、オプションによって指定可能です。
- readによる監視 : 指定されたデバイスに対して、read()関数を用いて読み込みを行い、ディスクの正常性を確認します。
- writeによる監視 : 指定されたデバイスに対して、write()関数を用いて書き出しを行い、ディスクの正常性を確認します。
- diskdは複数のインスタンスを起動することができます。監視対象ディスクが複数ある場合には複数起動するように指定してください。 詳細はオプション、使用方法を参照してください。
- 以下に、インストール、使用方法を記述します。ここでの記述は64bit環境のものです。32bit環境ではインストールされるディレクトリが異なりますので、環境に合わせて読み替えてください。
- 本ツールは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以上
- 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
- 共有ディスクを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
- 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"と表示されたノードのディスクは異常な状態となっています。直ちに原因を調査し復旧してください。
- readによる監視における監視先指定方法に関する注意
- 監視先のデバイス名はディスクのデバイス名指定(例: /dev/sdc)でもパーティション指定(例: /dev/sdc2)でも設定可能ですが、通常はディスクのデバイス名指定で問題ありません。
- 同一物理ディスク上にある複数のパーティションに対して個別のdiskd監視設定を行っても、故障検知できる範囲はほとんど変わらないため意味はありません。
- writeによる監視に関する注意
- writeによる監視で書き出し先として用いるのはファイルであるため、diskdを起動する前に監視先ファイルに正しくアクセスできる必要があります。
- Filesysem RAを使い、Active/Standbyのノード間でマウントを制御する共有ディスクをdiskdのwriteによる監視の監視対象とした場合、diskd起動時にはFilesystem RAによるマウント処理が行われていないため、diskdでは正しく監視できません。
- writeによる監視はローカルディスクに対する監視とすることをお勧めします。
- 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"オプションと同時指定時は無効
- 以下に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を終了する |