zabbixによるLinuxのSoftwareRaid(mdstat)の監視を行ったので、そのやり方を公開します。
一枚10万円以上のハードウェアRAIDカード(Areca、Adaptec、LSI等が安定していて有名です)を使っているときには、RAIDカードに接続されているHDDが故障した際に、ビープ音での警告や、メールでの通知が来るようになっていましたが、Linux側でビープ音を鳴らしてくれるわけではないので、メールでの通知がされるようにします。
mdadm単独でも、故障した際にはメール通知してくれる機能があるのですが、メール送信処理や、その監視処理はzabbixによる監視サーバに集約させたいため、あえてzabbixによる監視を行うようにしました。
まずは、/proc/mdstatの内容が、正常時、異常時でどのように変わるのかを調べ、異常時にのみ、メールによる通知がくるようにします。メールサーバについては、事前にLAN内からGmailを経由して送信できるようにPostfixが構築してある前提です(Gmailにメールリレーするpostfixメールサーバ参照)。
正常時の/proc/mdstatの内容
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md127 : active raid1 sdb[1] sda[0] 976631360 blocks super 1.2 [2/2] [UU] unused devices: <none>
障害時(RAID1のディスクが片方死んだ状態)の/proc/mdstatの内容
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md127 : active raid1 sdb[1] sda[0] 976631360 blocks super 1.2 [2/1] [U_] unused devices: <none>
障害時には、[U_]のように、『_』が入るようになるので、この情報が出た場合に、障害として検知するようにします。
/proc/mdstatの監視方法
下記のようにgrepコマンドで、_が1つでも入ればNGとしている。最初に、[UUU_U]という表記の行をgrepで取得して、更にそこから、grep -c _ で『_』の個数をカウントしている。『_』が1つでもある行があれば1以上の数字が返ってくるので、zabbix側では、この結果が>0であれば、エラーとして検知するようにすることにする。
※grep -cは、ヒットする行数をカウントするので、2が返ってきた場合には故障しているRAIDセットが2個あるということになります。ちなみに[__]は2ではなく1が返ります。
grep -e "\[[A-Z_]\+\]" /proc/mdstat | grep -c _
この方法だと、md1、md2等が複数あった場合に、どこのRAIDセットが壊れたのかまでを監視サーバに通知できませんが、壊れたから直さないといけないことには変わりないので、結果オーライいうことで。
Agent側での/etc/zabbix/zabbix_agentd.confの設定
最後に、下記の一行を追加して、sudo service zabbix-agent restartすることで、zabbixサーバ側で、mdstatの値が取れるようになる。
UserParameter=custom.mdstat,grep -e "\[[A-Za-z_]\+\]" /proc/mdstat_ok | grep -c _
zabbix-agent再起動
sudo service zabbix-agent restart
監視サーバ側での設定
管理画面に管理者権限でログインして、設定>ホストより、対象としたいホストのアイテムを選択します。
次に、画面右上のアイテムの追加から、アイテムの追加を選択。
アイテムの追加画面で、名前等を適宜入力します。キーはAgentが入っているホストで、zabbix_agentd.confに指定したキーが選択から選べるはず。
設定>ホスト>対象ホスト>トリガーより、mdstatの確認結果、0以上の値が返ってきた場合に重度の障害になるようにとリガを設定します。
次に、プロファイルから、ユーザーのメディアを選択し、設定が有効になっていなければ、有効にします(上記赤枠が無効のリンクになっているはずなので、それをクリック)。次に、その右側の変更リンクをクリックします。
今回は、上記のように設定しました。送信先メールアドレスはご自身のメールアドレスを設定してください。
ユーザープロファイルの、アラーと表示についての設定し、問題があれば、webインターフェースのアラーと表示が出るようにしておきます。
検証
設定しただけでうまく動かないとNGなので、/tmp/mdstatに/proc/mdstatの内容をコピーして、下記のパターンを検証しました。テストケースの観点とテスト内容は下記の通りで良いかな。
観点
- 故障していないときはエラー検知されないこと
- 故障した時はエラー検知されること
- 故障時にエラーが出てメール通知されること
- HDDの壊れ方は複数試すこと
- HDD故障回復時に、ステータスがOKになったメールが送信されること
- RAIDセットが複数個あるケースを試すこと
テストケース
- [UU]
- [U_]
- [_U]
- [__]
- [UU___UU]
- [__UU]
- [UUU_]
- [UU][U_] << RAIDセットが2個ある場合かつ片方がNG。
- [_U][__] << RAIDセットが2個あり、両方ともNG。
- zabbix_agentd.confを書き換えて、エラー通知が出ることと、メールが送信されることの確認
検証時のスクリプトは下記の通り。viで、ファイルの中身を変更しつつ、テストしました。
grep -e "\[[A-Za-z_]\+\]" /tmp/mdstat | grep -c _
参考情報
- Zabbix mdadm monitoring
- Zabbixエージェントで LinuxのソフトウェアRAIDを監視する