15分で始めるmonitによるサーバ監視

このエントリーをはてなブックマークに追加
どうも、インフラエンジニアです。名前はfujya.shです。クラウドインフラやってます。


サーバ管理者の間ではプロセス監視なら「daemontools」が定番ですが、個人的には設定が面倒で(慣れればどうという事は無いのですが)あまり利用していません。シャノンではプロセス監視の新定番として「monit」を激しくお勧め致します。設定が簡単でそれこそ誰でもプロセス監視ができる代物です。




■monitとは


総合監視デーモンとしてファイルシステムからHTTPレスポンス内容・プロセス監視などの機能を持っています。GPLライセンスでLinux/BSD/Solaris上で動作可能です。CentOSならDAGリポジトリからyum installもでき、configも簡潔ですので15分程度で導入ができます。













ではさっくりインストールから基本設定、sshdの監視用のコンフィグを書いてみましょう。
※ 今回はCentOS5系で試してます。





■インストールから基本のconfig作成
インストールを始める前にDAGリポジトリが設定されている事が前提となります。

◯インストール
yumでインストールできますので、
# yum install -y monit
これでインストール完了です。ブログ公開したタイミングではバージョンは5.2.5-1.el5.rfです。最新版は5.3.1ですが、tar.gzの中にはspecファイルも含まているので簡単にrpmも作れます。


◯コンフィグの設定
基本のコンフィグを/etc/monit.confに設定します。下記はサンプルになります。
set daemon 60

set logfile syslog facility log_daemon

set mailserver mail1.example.com, # primary mailserver
mail2.example.com # secondary mailserver
set mail-format {
from: monit@example.com
subject: $HOST : $SERVICE - $EVENT
message: Monit
ACTION : $ACTION
SERVICE : $SERVICE
at $DATE on $HOST.
DESCRIPTION : $DESCRIPTION
}
set alert server_alert@example.com
include /etc/monit.d/*.conf
一行づつ解説していきましょう。


set daemon 60
監視の実行タイミングを設定します。多くの監視ソリューションでは最短1分間隔のものが多いですが、monitでは秒単位で監視の設定ができます。あまり短くしすぎると負荷が高くなる可能性もあるので監視内容に応じ適切に設定しましょう。



set logfile syslog facility log_daemon
ログの設定をします。monitではsyslogでの出力をサポートします。facilityの設定を'log_local0' - 'log_local7'もしくは、log_daemonで設定可能です。



set mailserver  mail1.example.com,    # primary mailserver
mail2.example.com # secondary mailserver
メールサーバの設定をします。monitはアラートを送信するのにSMTPサーバを利用します。,(カンマ)区切りで複数台設定できるので、可能であれば複数設定しましょう。



set mail-format {
from: monit@example.com
subject: $HOST : $SERVICE - $EVENT
message: Monit
ACTION : $ACTION
SERVICE : $SERVICE
at $DATE on $HOST.
DESCRIPTION : $DESCRIPTION
}
アラートメールのフォーマットを設定します。変数も使えるので、monitの公式Documentの「Alert message layout」を参照して、適宜設定しましょう。上記はサンプルから拝借してきました。



set alert server_alert@example.com
アラートの送信先を設定します。こちらも複数行書くことで設定できます。アラートの送信先に応じて「何のアラートを送信するか」の設定が可能です。例えば下記の用に記述すれば、監視スクリプトを実行した時のみアラートを送信する事も可能です。
 alert server_alert@example.com only on { exec }
逆にbut not onと記述すれば対象の動作を除外する事も可能です。



include /etc/monit.d/*.conf
最後にincludeが設定可能です。ApacheのIncludeと同じような振る舞いをします。






■試しにsshdを監視してみよう
それでは実際に監視を記述してみましょう。sshdは落ちたらデータセンター直行しなければいけない重要なプロセスです。ここではsshdが停止したら自動で再起動を試みる監視のコンフィグを記述します。/etc/monit.confにincludeが書いてあるとして、/etc/monit.d/以下にコンフィを追加してみましょう。


check process sshd with pidfile /var/run/sshd.pid
every 2 cycle
group system
start program = "/etc/rc.d/init.d/sshd start"
stop program = "/etc/rc.d/init.d/sshd stop"
if 5 restarts within 5 cycles then unmonitor
こちらも一行づつ解説していきましょう。


check process sshd with pidfile /var/run/sshd.pid
監視対象のデーモンのpidファイルを指定します。



every 2 cycle
監視の実行タイミングを指定します。set daemonで指定した秒数 × every [num cycle]のタイミングで監視を実行します。[num cycle]の部分をcronと同じ書き方で指定することも可能です。例えばevery "* * * * 1-5"と記述すれば、平日のみ監視するという指定も可能です。


group system
任意のgroupを指定します。monitではgroup単位での動作の制御が可能です。group単位で監視の停止、起動、再起動などができるようになります。



start program = "/etc/rc.d/init.d/sshd start"
stop program = "/etc/rc.d/init.d/sshd stop"
起動と停止のプログラムを指定します。指定したスクリプトにオプションも指定できるので、上記のような設定が可能です。さらに下記のように記述すると任意の実行ユーザも指定する事が可能です。
 start program = "/etc/rc.d/init.d/sshd start"
  as uid user and gid users
特に指定が無ければrootユーザでスクリプトの実行がされます。


if 5 restarts within 5 cycles then unmonitor
再起動を試みる回数と、タイムアウトの時間を指定します。何らかの不具合があって再起動を繰り返す場合にこの設定は有効です。上の設定では5回の監視中に5回再起動を実施した場合に監視を停止します。unmonitor以外には任意のスクリプトの実行するexecを指定する事も可能です。




ここまで記述して、monitを起動しておけばOOMにsshdが殺されとしても自動でsshdが復帰されますので、有事の際にデータセンターに直行なんて事は無くなります。



■その他、monitができること
上記まではプロセスの監視と検知後に再起動というコンフィグが書かれていました。その他にもmonitは様々な機能を持ち合わせています。



◯監視対象
・プロセス(pid/ppid)
・ファイルシステム
・ディスク容量(space/i-node)
・ファイル
- サイズ
- パーミッション
- uid/gid
- チェックサム
- タイムスタンプ
・ファイルの中身とパターンマッチ
・ロードアベレージ
・メモリ使用量(サーバ単位・プロセス単位)
・レスポンス内容パターンマッチ(send/expectも可能)


◯アクション
・起動・停止・再起動
・アラートメール送信
・任意のスクリプトの実行



監視対象とアクションを組み合わせて独自の監視を構築することが可能です。見ての通りmonitは内形監視するのには十分な機能が備わっています。簡単なものであれば外形監視も可能なので、小規模なインフラであればmonitだけで事足りる場合があります。




■シャノンでの便利なmonit利用例


◯EC2の消し忘れ防止
シャノンではAmazonEC2を使ってテスト環境を構築しています。EC2では起動した時間だけ課金されるので、消し忘れた時間があると無駄な費用が発生してしまいます。この問題を解決するためにmonitを利用しています。


監視対象:Apacheのaccess_logのタイムスタンプ
アクション:1時間更新が無かったら任意のスクリプトの実行


[サンプル]
  check file auto_shutdown with path /var/log/httpd/access_log
if timestamp > 30 minutes for 30 cycles then exec
"/root/bin/autoshutdown.sh"
ポイントはtimestampが30分更新されていない状態が、30回連続で続いたらautoshutdown.shを実行するというところです。これをit timestamp > 60 minutes for 1 cycles then execにしてしまうと、1時間以上停止していたインスタンスが起動時にすぐにautoshutdown.shを実行してしまいます。起動後に30分以内にアクセスすればファイルのタイムスタンプが更新されるので、すぐに停止状態になる事を防げます。




◯メモリの監視、自動再起動
アプリによってはメモリが増え続けてしまうアプリがあります。プロセス単位でメモリの使用量を監視して一定以上に増えた場合に再起動をしてあげる監視を設定しています。


監視対象:プロセスのメモリ使用量
アクション:全体の何%利用したら任意のスクリプトの実行


[サンプル]
check process worker with pidfile /var/run/worker.pid
group system
start program = "/path/to/worker_starter start"
as uid user and gid users
stop program = "/path/to/worker_starter stop"
as uid user and gid users
if memory usage > 7% then restart
if 5 restarts within 5 cycles then stop
ワーカが全体のメモリ7%を超えて利用していた場合に再起動する設定が書いてあります。あまりこういう設定は書きたくないのですが、運用を行なっているとどうしてもこのようなシーンに出会ってしまいます。monitならサーバ管理者の代わりに再起動してくれるので多少運用が楽になるかと思います。




◯Nagiosの監視
シャノンでは外形監視にはNagiosを利用しています。Nagiosが動作している事を監視をするために、Nagiosの監視項目に特定のサーバにHTTPアクセスするものを設定してあります。対象のサーバでmonitを動作させ、Nagiosがアクセスするファイルのタイムスタンプを監視しています。


監視対象:ファイルのタイムスタンプ監視
アクション:1時間更新が無かったらアラートを送信


[サンプル]
 check file check_nagios with path /path/to/nagios_check.dat
if timestamp > 60 minutes then alert
非常にシンプルなコンフィグですが、これだけでnagiosの監視が可能です。監視しているつもりがいつの間にか止まっていた場合に気づくことができないので、監視は相互監視する事が大事です。




■さいごに

monitはDocumentが充実しているので、簡単に監視項目を追加することができます。
シャノンでは「何か問題があったらmonitで監視項目追加」という運用を行なっています。monitなら独自で作成したスクリプトの実行も可能なので問題からの自己復旧も簡単に構築する事ができます。

大事な事なのでもう一度言います
問題があったら即監視項目追加
これを簡単に実現するソリューションとしてmonitを激しくお勧めします。


15分で始められるので、是非一度試してみてはいかがでしょうか。
次の記事
« Prev Post
前の記事
Next Post »
Related Posts Plugin for WordPress, Blogger...