monitでシステムリカバリを自動化する

monit

monitはオープンソースのプロセス監視ツールです。
monitを利用する事で、プロセス/サービスの状態を監視し、問題が発生したプロセス/サービスを(自動で)復旧する事が可能です。

はじめに

ボブ・ディランのノーベル文学賞受賞に「マジか!?」と思った今日この頃、皆様いかがお過ごしですか。

先日弊社サーバの某サービスが落ちてWebページが閲覧不可になってしまってたので、対策としてmonit入れて設定しました。

monit を利用する事で、

停止してしまったサービスを自動で復旧(再起動)する

といった事が可能になります。
ここでは導入手順に関して示します。

※関連記事にある Nagios + Ganglia でシステム監視は行っているのですが、24時間対応している訳ではない ( 且つ誰でもメンテナンスできるわけではない ) ので、リカバリは可能な限り自動化するため社内システムの一部では monit を導入していたのですが、Webサイトが稼働しているEC2上の httpd に関しては対応していませんでした。
※比較的安定稼働していたので当該サービスに関しては設定せず。
※アラートが上がっていたが、連休で直ぐには対応せず (-_-;。

monitとは

monitはオープンソースのプロセス/サービス監視ツールです。
以下のような機能を備えています。

機能

  • サービスの復旧
    sshdやsendmail等のサービスがダウンした場合に、自動で復旧(起動)する事が可能
  • 大量のリソースを消費しているサービスの再起動
    任意のプロセスがCPUやメモリ等のリソースを大量に消費している場合に、これらサービスを自動で再起動するといった事も可能
  • ファイルシステムの監視
    ファイル/ディレクトリに変更(タイムスタンプ、チェックサム、サイズ等)が発生した場合に、メール通知したり任意のアクションを実行する事が可能
  • ネットワークの監視
    ローカル/リモートサーバに対するネットワーク経由での接続テストが可能(HTTP, SMTP等の主要なプロトコルを標準でサポート)

特徴

以下のような特徴があります。

  • インストール/設定が簡単

    monit 公式にも

    Up and running in 15 minutes!
    With all features needed for system monitoring and error recovery. It's like having a watchdog with a toolbox on your server

    と記されています。15分でインストール~動作まで行う事が可能です。

  • Webアプリケーション付き
    ブラウザ経由で状態監視する事も可能

環境

環境は以下

OS CentOS6.8, Amazon Linux
monit 5.14, 5.2.5

手順

インストール手順を示します。

monit インストール

  1. epelリポジトリの追加
    CentOS の場合、epelリポジトリからインストールするため、登録されていない場合登録します。
    # yum install epel-release
    
  2. yum を利用してインストールします。
    # yum install monit
    

設定

monit の設定ファイルを編集します。

monit.conf の編集

monit の設定を行う場合、/etc/monit.conf で monit 全体の設定を行い、個別の ( サービス等に対する ) 設定は /etc/monit.d/ ディレクトリ以下に設定を記載します。/etc/monit.d/ディレクトリ以下の設定は monit.conf からインクルードされます。

※設定内容の詳細に関しては https://mmonit.com/monit/documentation を参照

# vi /etc/monit.conf

以下を設定します (抜粋)。
インストール後の設定ファイルでは殆どの項目がコメントアウトされているので必要な設定をアンコメントして、設定内容を編集すればOKです。
以下では必要最小限と思える設定を記載しています。

※設定内容は環境にあわせて適宜変更してください。

set daemon 60    # サービスチェック間隔(秒)
set logfile syslog # ログ設定 syslogで出力
# メールサーバ
set mailserver mail.sample.com,         # プライマリ
               mail2.sample.com port 587, # バックアップ(ポート番号設定あり)
               localhost                # fallback relay
# メールフォーマット
set mail-format {
   from: system@sample.com
   subject: monit alert --  $EVENT $SERVICE
   message: $EVENT Service $SERVICE
                 Date:        $DATE
                 Action:      $ACTION
                 Host:        $HOST
                 Description: $DESCRIPTION
 }
set alert hoge@sample.com # アラートの送信先
include /etc/monit.d/*   # include 設定

set mailserver でSMTP認証が必要なメールサーバを利用する場合、以下のようにユーザ名、及び、パスワードを設定する事で対応可能です。

set mailserver
    mail.sample.com port 587 username "user" password "pass"

Gmailを利用する場合は以下のようにする事で対応可能のようです。( 5.17以降の場合、using ssl を追記する。5.16以前では using tlsv12 )

  set mailserver smtp.gmail.com port 587
    username "user" password "pass"
    using ssl

参考 : M/Monit Wiki

※ちなみに、設定ファイルに既に
include /etc/monit.d/*
が記述してあったのに自分でも記述 ( 二重に ) してしまい暫しはまった。

この場合、monit 起動時に以下のようなメッセージが出力される。

monit を起動中: /etc/monit.d/sshd.conf:1: Service name conflict, sshd already defined '/var/run/sshd.pid'

既にサービス名が登録済みというエラーだが、二重でincludeしてれば、そうなるのは当たり前 (--;

個別の設定

メインの設定が編集できたら、実際に行いたい監視設定を記載します。
例としてサービスが落ちていた場合に、これらを自動起動する場合の設定例を示します。

sshd.conf
# vi /etc/monit.d/sshd.conf

以下内容で設定します。

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"
httpd.conf
# vi /etc/monit.d/httpd.conf

以下内容で設定します。

check process httpd with pidfile /var/run/httpd/httpd.pid
every 2 cycle
group system
start program = "/etc/rc.d/init.d/httpd start"
stop  program = "/etc/rc.d/init.d/httpd stop"

上記二つを見れば、どういった指定をすればよいかは大体予想できるのではないでしょうか。

check process ...

linux 系の大抵のサービスでは、サービスが起動している場合 pid ファイルが存在しているので、これを利用してプロセスIDを取得しプロセスを監視

every ...

プロセスの監視間隔設定。every 2 cycles の場合、set daemon で設定した基準間隔の 2倍の間隔で監視。

cron スタイルでの記載も可能です。詳細、及び、具体的な設定例に関しては、以下参考サイトを参照して下さい。

参考 : SERVICE POLL TIME

group ...

monit は動作をグループ単位で管理する事が可能なので、一応グループ指定を入れています。

start program, stop program

起動、及び、停止のためのコマンドを指定しています。


上では最もシンプルなプロセスが落ちていたら起動する場合の例を示しましたが、https://mmonit.com/monit/documentationConfiguration Examples には具体的な設定例が多数記されています。
英語が苦手な方でも、設定内容からどういった動きをするものかは予測できるものが殆どだと思ので、こちらの設定を参考にしてみるのをお勧めします。

monitの起動

設定が完了したら、設定に問題ないか確認し、

# monit -t
Control file syntax OK

問題なければ monit を起動します。

# /etc/rc.d/init.d/monit start

自動起動設定は必要に応じてどうぞ

# chkconfig monit on

設定の確認

monit の動作状態は 以下コマンドで確認できます。
監視設定したプロセスの設定に問題がないかどうか確認しておきましょう。

# monit status

monit コマンドでは、ステータス確認以外にも プロセス単位で監視設定を有効/無効にしたりする事も可能です。monit コマンドの詳細に関しては

# monit --help

でヘルプを確認するか、適当なリファレンスをあたってください。

確認

設定内容が正しく動作するか確認しておきましょう。

例として上で設定した httpd.conf の動作を確認するために、apache を停止させてみた場合の例を示します。

ログの確認

上記のようにmonitのログ出力にsyslogを利用するように設定した場合、/var/log/monit にログが出力されています。これをモニタする事で monit の動作を確認できます。

以下、apache (httpd) 停止後の monit ログを示します。

# tail -f /var/log/monit
[JST Oct 13 16:15:08] error    : 'httpd' process is not running
[JST Oct 13 16:15:13] info     : 'httpd' trying to restart
[JST Oct 13 16:15:13] info     : 'httpd' start: /etc/rc.d/init.d/httpd
[JST Oct 13 16:17:15] info     : 'httpd' process is running with pid 11712

プロセスが動作していない事を検知して、再起動を実行した事が確認できます。

通知メール

monit がサービス停止を検知すると以下のような内容のメールが送信されます。

monit alert -- Does not exist httpd

Does not exist Service httpd
                Date:        Thu, 13 Oct 2016 16:15:08
                Action:      restart
                Host:        km.agilegroup.local
                Description: process is not running

復帰(自動起動)後には、以下のようなメールが送信されます。
正しくメール通知が行われるかどうか確認しておきましょう。

monit alert -- Exists httpd

Exists Service httpd
                Date:        Thu, 13 Oct 2016 16:17:15
                Action:      alert
                Host:        km.agilegroup.local
                Description: process is running with pid 11712

当たり前ですが、ログ/メール通知だけでなく実際にサービスが復旧できているかどうかも確認しましょう。

まとめ

以上、monit を利用したサービス監視、及び、サービスの自動リカバリ方法に関してでした。

特に現状、利用しているプロセス/サービスに問題がおきて再起動等の対応を行う事が多いといった場合には、monit を適切に利用する事で

  • 運用負荷の低減
  • サービスレベルの向上

が可能なのではないかと思います。

 

会社等でシステム管理者にさせられたがであるために、

「システムトラブル対応で休日まで連絡来てうぜー大変」

とか日頃思っているあなた!

monit ( に類するツール ) 使ってないなら今すぐ使いましょう。

便利ですよ。