インストール
細かい監視などはzabbixでやるとして、障害発生時の自動復旧などを実施するためにmonitの設定をしました。
$ sudo yum -y install monit
$ rpm -q monit
monit-5.1.1-4.el6.x86_64
$ rpm -ql monit
/etc/logrotate.d/monit
/etc/monit.conf
/etc/monit.d
/etc/monit.d/logging
/etc/rc.d/init.d/monit
/usr/bin/monit
/usr/share/doc/monit-5.1.1
/usr/share/doc/monit-5.1.1/CHANGES.txt
/usr/share/doc/monit-5.1.1/COPYING
/usr/share/doc/monit-5.1.1/LICENSE
/usr/share/doc/monit-5.1.1/PLATFORMS
/usr/share/doc/monit-5.1.1/README
/usr/share/doc/monit-5.1.1/README.DEVELOPER
/usr/share/doc/monit-5.1.1/README.SSL
/usr/share/man/man1/monit.1.gz
/var/log/monit
$ monit -V
This is monit version 5.1.1
Copyright (C) 2000-2010 by Tildeslash Ltd. All Rights Reserved.
今回は余りバージョンなどは気にしなかったので、インストールされた5.1.1をこのまま使います。
初期設定
インストールされた設定の確認
デフォルトの設定ファイル類を眺めてみますが…
# set daemon mode timeout to 1 minute
set daemon 60
# Include all files from /etc/monit.d/
include /etc/monit.d/*
# log to monit.log
set logfile /var/log/monit
/var/log/monit {
missingok
notifempty
size 100k
create 0644 root root
postrotate
/sbin/service monit condrestart > /dev/null 2>&1 || :
endscript
}
監視周期が60秒で、ログ出力のみ&ローテート設定ありの最低限の設定は出来ている様です。
メールでの通知機能などは使わないので、このまま使います。
プロセス監視の設定
check process crond
with pidfile "/var/run/crond.pid"
start program "/etc/init.d/crond start"
stop program "/etc/init.d/crond stop"
動作確認も兼ねて、とりあえずcrond辺りの設定を追加してみます。
$ cd /etc/monit.d
$ sudo cp ~/monit.rc/crond.rc .
$ ls
crond.rc logging
$ sudo service monit start
monit を起動中: monit: generated unique Monit id XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX and stored to '/root/.monit.id'
[ OK ]
$ tail -f /var/log/monit &
[1] xxxx
[JST Jul dd hh:mm:ss] info : monit: generated unique Monit id XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX and stored to '/root/.monit.id'
[JST Jul dd hh:mm:ss] info : 'XXXXXXXXXX' Monit started
$ sudo service crond stop
$ [JST Jul dd hh:mm:ss] error : 'crond' process is not running
[JST Jul dd hh:mm:ss] info : 'crond' trying to restart
[JST Jul dd hh:mm:ss] info : 'crond' start: /etc/init.d/crond
[JST Jul dd hh:mm:ss] info : 'crond' process is running with pid xxxx
$ service crond status
crond (pid xxxx) を実行中...
後は、時折ポート監視などの設定も追加しつつ、監視したいサービス(デーモン)単位で設定を追加していきます。
check process sshd
with pidfile "/var/run/sshd.pid"
start program "/etc/init.d/sshd start"
stop program "/etc/init.d/sshd stop"
if failed port 22 protocol ssh then restart
if 5 restart within 5 cycles then timeout
※ここでポートは22にしていますが、実際にはポート番号は違う番号に換えているので適時書き換えて使用しています。
自動起動設定
適時動作確認をしつつ追加して、全てが終わったら、自動起動設定を入れておきます。
$ sudo chkconfig --list monit
monit 0:off 1:off 2:off 3:off 4:off 5:off 6:off
$ sudo chkconfig monit on
$ sudo chkconfig --list monit
monit 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ここでの自動起動は、OS再開時の設定なので、monit
自身が異常終了した場合などは意味ないのですけどね(^_^;)
※inittabに入れた方が良いのかもしれないけど、inittab自体のメンテナンスを余りしたくないという…
追加設定
Webインタフェースでの動作確認
念のためのWebインタフェースも用意して動作確認をしておきます。
set httpd port 2812 and address localhost
allow admin:password
2812番ポートをiptables
で開けるよりもnginx
でproxyしちゃった方が早いかなぁという(^_^:)
server {
server_name monit.example.org;
location / {
proxy_pass http://127.0.0.1:2812;
}
}
上記設定をnginx
に追加して、アクセス確認をしておきました。
確認が終わったら、nginx
側の設定は不要です。
$ sudo monit status
The Monit daemon 5.1.1 uptime: 0m
(略)
Process 'crond'
status running
monitoring status monitored
pid 1234
parent pid 1
uptime 24m
children 0
memory kilobytes 1268
memory kilobytes total 1268
memory percent 0.0%
memory percent total 0.0%
cpu percent 0.0%
cpu percent total 0.0%
data collected Sat Jul dd hh:mm:ss yyyy
System 'xxxx.example.org'
status running
monitoring status monitored
load average [0.00] [0.00] [0.00]
cpu -1.0%us -1.0%sy -1.0%wa
memory usage 475376 kB [25.4%]
data collected Sat Jul dd hh:mm:ss yyyy
$ sudo monit unmonitor crond
$ sudo monit status
(略)
Process 'crond'
status not monitored
monitoring status not monitored
data collected Sat Jul dd hh:mm:ss yyyy
$ sudo monit monitor crond
$ sudo monit status
(略)
Process 'crond'
status initializing
monitoring status initializing
data collected Sat Jul dd hh:mm:ss yyyy
$ sudo monit status
(略)
Process 'crond'
status running
monitoring status monitored
pid 1234
parent pid 1
uptime 28m
children 0
memory kilobytes 1268
memory kilobytes total 1268
memory percent 0.0%
memory percent total 0.0%
cpu percent 0.0%
cpu percent total 0.0%
data collected Sat Jul dd hh:mm:ss yyyy
webインタフェースがあると、CUIからでも操作可能なのでメンテナンス時などに便利です。
zabbixでのmonitプロセス監視
ここまでで簡単な自動復旧の環境はできましたが、そもそもmonit
が落ちてしまっていたらそれも叶わないので、monit
についてはzabbix
側でプロセス監視をしておきます。
アイテム設定
項目 | 設定 |
---|---|
名前 | Process monitor daemon running |
タイプ | Zabbixエージェント |
キー | proc.num[monit] |
データ型 | 数値(整数) |
トリガー設定
項目 | 設定 |
---|---|
名前 | Process monitor daemon down |
条件式 | {Zabbix server:proc.num[monit].last()}=0 |
深刻度 | 軽度の障害 |
上記のアイテム&トリガー追加をして、イザという時にはzabbix
側で通知が出るようにしておきました。
深刻度は「警告」でも良いのですが、プロセス監視の本体側だし、monit
そのものは自動起動しないので、「軽度の障害」にしておきました。
今後暇なときにでもmonit
で監視しているプロセスの障害設定を追加しておこうと思っているのですが、それらの場合は「警告」にしようかなぁと思っています。
zabbixでのmonitログ監視
ついでに、何か障害があった場合(monit
で自動復旧したとしても)についても、念のためzabbix
側のイベントに出力するように設定しておきます。
アイテム設定
項目 | 設定 |
---|---|
名前 | Process monitor daemon log |
タイプ | Zabbixエージェント(アクティブ) |
キー | log[/var/log/monit,error] |
データ型 | ログ |
トリガー設定
項目 | 設定 |
---|---|
名前 | Process monitor daemon error |
条件式 | (({Zabbix server:log[/var/log/monit,error].regexp(error)})#0)&({Zabbix server:log[/var/log/monit,error].nodata(300)}=0) |
深刻度 | 警告 |
単純にerrorだけ引っかけて見れるようにすれば最低限かな…と。
$ tail -f /var/log/monit
[JST Jul dd hh:mm:ss] error : 'crond' process is not running
[JST Jul dd hh:mm:ss] info : 'crond' trying to restart
[JST Jul dd hh:mm:ss] info : 'crond' start: /etc/init.d/crond
[JST Jul dd hh:mm:ss] info : 'crond' process is running with pid xxxxx
この状態でzabbix
側のイベントとして[JST Jul dd hh:mm:ss] error : 'crond' process is not running
が登録されるようになります。