mdadmでRAID構築したけど、監視してなかったので、少し考えた。

※この記事を見ればRAIDの監視ができるわけではないです

mdadmで簡単にRAID構築できてこれでいいんだろうかーと思いながら適当に運用してきたけども、監視を全くやってなかった。それ運用っていわねえから!!
というわけで、どんなやり方があるか調べたけども、これをやっておけばOKというのは意外と見つからなかった。みんな祈ってるのかな。
なので、help見たりして調べた古いやり方かもしれないけども、とりあえず監視ができそうなので、メモしておく。

本当は故障をエミュレートして試したりしたほうがよいのだけど、後でやると思います(やらないフラグ)

mdadm --monitor

これがベースになる模様。これに色んなオプションを付けて色々できるらしい。

--test

実行時にテストメッセージを出力してくれる。これで簡単に機能するか確認することができる。

--scan

認識してる全RAIDバイス(?)を対象とする。これか、実RAIDバイス名(/dev/md0など)を指定する必要がある。

--delay

チェック間隔を決定できる。--helpをみたところデフォルトで60秒だった。1秒とかにすると負荷上がりそうだし。

--daemonise

デーモンとして動いてくれる。サービス化するときはこれで良さそう。

出力方式

--syslog

syslog出力してくれる。こんな感じで。

# 1秒後にmdadmにSIGINT(Ctrl+C)を送るようにして実行
timeout -s INT 1 mdadm --monitor --syslog --test --scan

Sep 24 00:34:15 localhost mdadm[6849]: TestMessage event detected on md device /dev/md/localhost.localdomain:0
Sep 24 00:34:15 localhost mdadm[6849]: TestMessage event detected on md device /dev/md/localhost.localdomain:1

--mail=mailto@yourdomain.tld

メールで送る、らしい。メールサーバがないので試してない。
mdadm.confでMAILADDRを指定しても同じ?

--program=/path/to/notifer.sh

通知プログラムを起動する。プログラムに引数でメッセージを渡す。
mdadm.confでPROGRAMを指定しても同じ効果が得られる?

サンプルプログラムを作ってmdadm --monitorで発生したメッセージをプログラムに渡して実行する様子を観察した。

cat << __EOF__ > /tmp/example.sh
#!/bin/bash

echo "---------"
echo "\$1 => $1"
echo "\$2 => $2"
echo "\$* => $*"

__EOF__
chmod 0700 /tmp/example.sh

# 1秒後にmdadmにSIGINT(Ctrl+C)を送るようにして実行
timeout -s INT 1 mdadm --monitor --program=/tmp/example.sh --test --scan
                • -

$1 => TestMessage
$2 => /dev/md/localhost.localdomain:0
$* => TestMessage /dev/md/localhost.localdomain:0

                • -

$1 => TestMessage
$2 => /dev/md/localhost.localdomain:1
$* => TestMessage /dev/md/localhost.localdomain:1

所感

自分の環境はSyslogサーバがあるので--syslogを付けて裏で走らせておけば良い感じはした。
ログをどっかに集約したいなら、送りつける簡単なスクリプトを書いて、--programに与えれば良さそう。
メールは・・・今時流行らない気もする。

おわり

本当にこれだけで足りるんだろうか疑問。というのも、不良セクタとか色々物理的なトラブルなどで、ファイルアクセス時に初めて気づくものもあるだろうし。
RAID1なら両方にあるから片方がおかしいと気づくのかな?その辺りってどうなんだろう。
本当にアクセスできなくなるまでダンマリで、実際に影響が出た後に監視で上がるとあんまり意味ないし・・・