― Web Technology and Life ―

お手軽に死活監視をPerlのCPANモジュールApp::MadEyeで行う

2012-02-27
去年のYAPC::Asia2011では、運用の話が活発に行われており、監視周りの話も多かったように記憶しています。そこで、監視の基本となる死活監視について、今回は私が普段使っているtokuhiromさん作の死活監視ツールApp::MadEyeを紹介しつつまとめたいと思います。

監視うんぬん

システム運用における監視は、大きく以下の2つに分けられます。

死活監視

「死活」の通り、「死んでいるか、活きているか」について監視することです。具体的には、サーバーにPingを飛ばして死んでいるか活きているか確認したり、サーバーのハードディスクが一定量を超えているかどうか確認したりすることです。つまり、継続的に「1/0」で確認し続けることが、死活監視です。実務的な用途としては、「サイトが落ちている!」っていう状況に素早く対応するための準備となります。

リソース監視

一方で、リソース監視は、システム特定リソースの状態の変化を確認し続けることといえます。例えば、サーバーのロードアベレージの推移を記録したり、メモリー使用量の状態の推移を記録したりすることです。実務的な用途としては、リソース監視の記録を分析することで、サーバーのチューニングをしたり、サーバーの追加を判断したりするためのデータ集めとなります。リソース監視については、『ubuntuにCloudForecastを入れてみた~YAPC::Asia2010の復習(前編)~』と題して監視ツールを使った感想を記事にしたので、参考にして頂きFBもらえるとうれしいです。

お手軽な死活監視の仕様

前置きが長くなりますが、App::MadEyeの具体的な使い方の前に、お手軽な死活監視って実際どいう仕組みになっているといいかな?ということについて言及しておきたいと思います。

「サーバーの台数がたくさんある」とか、「サービスの数がたくさんある」とか、あるいは、「絶対落ちちゃいけないサイトだし、落ちたとしてもできるだけ早く気づきたい」という場合は細かい要件が出てくると思いますが、「お手軽に」行う場合は、以下の三点を確実に押さえていればいいと思います。

  • 一定期間毎に
  • 予め決めた項目をチェックする
  • もし、「死」の場合はアラートを通知する

それでは、上記の3点に監視て解説していきたいと思います。具体的なセットアップ手順は、上記で挙げた仕様の順番を逆にするとわかりやすので、「もし、「死」の場合はアラートを飛ばす」からスタートします。

「もし、「死」の場合はアラートを通知する」についての実装

一般的なアラートの飛ばし方としては、メールが一般的だと思います。なので、実際に行うことは

  • メールサーバーを立てる
  • メールクライアントを作成する

ということになります。(飛ばしたアラートをSyslogに落とすとか、標準エラー出力にだすとかもありますが、一旦それはおいておきます。)

「予め決めた項目をチェックする」についての実装

ここが監視ツール(この記事の場合はApp::MadEye)が主にサポートしてくれるところですが、実際にすることは、

  • 監視項目を決める
  • 監視ツールに即した監視の設定かいて、監視ツールのスクリプトを作成する

となります。

「一定期間毎に」についての実装

最近は、ジョブキューとかメッセージキューとかあるので、ふとそんなものを使って実装しなきゃいけない気になってしまいますが、とにかくお手軽なので、cronで実装します。なので、実際にすることは

  • チェックする間隔を決める
  • 監視ツールのスクリプトをcronに登録する

となります。チェックする間隔ぎめはしっかりやるなら、「Pingは毎秒でー、DNSは毎分でー、HTTPでアクセスできるかは5分おきでー」とか監視項目ごとに決める必要がありますが、お手軽なので一括設定しています。

まとめ

上記をまとめると以下のようになります。

  • もし、「死」の場合はアラートを通知する
    • メールサーバーを立てる
    • メールクライアントを作成する
  • 予め決めた項目をチェックする
    • 監視項目を決める
    • 監視ツールに即した監視の設定かいて、監視ツールのスクリプトを作成する
  • 一定期間毎に
    • チェックする間隔を決める
    • 監視ツールのスクリプトをcronに登録する

それでは、App::MadEyeの概要に解説してから、上記の仕様に即して具体的に監視する手順を追っていきたいと思います。

App::MadEyeの概要

作者でもないのに、勝手に解説すると間違いがあるかもしれませんが、あまりドキュメントがないので勇気を持って書きます。

App::MadEyeは、Class::ComponentというMooseのようなクラス作成モジュールに依存しており、コードの内部を詳細に追うのはちょっと難しいです。コードはさくっと流れを追う程度がいいでしょう。基本的には、Plugin以下のクラスを設定とあわせてロードすることによって使います。現時点でのプラグインの構成は、以下のようになっています。

2012-02-24時点で確認したPlugin一覧

プラグインの種類 クラス
監視 *::Agent::DBI
監視 *::Agent::DJabberd
監視 *::Agent::DNS
監視 *::Agent::FTP
監視 *::Agent::FileSync
監視 *::Agent::Gearmand
監視 *::Agent::HTTP
監視 *::Agent::Memcached
監視 *::Agent::Mogilefsd
監視 *::Agent::MySQLSlave
監視 *::Agent::POP3S
監視 *::Agent::Perlbal
監視 *::Agent::Ping
監視 *::Agent::Process
監視 *::Agent::SMTP
監視 *::Agent::SMTPTLS
監視 *::Agent::SNMP::Disk
監視 *::Agent::SNMP::IPAddress
監視 *::Agent::SNMP::Process
監視 *::Agent::SSLExpireDate
監視 *::Agent::Sleep
監視 *::Agent::TheSchwartz::Error
監視 *::Agent::TheSchwartz::Job
監視 *::Agent::WriteDisk
制限 *::Check::Flock
制限 *::Check::Network
制限 *::Check::User
アラート通知 *::Notify::Debug
アラート通知 *::Notify::Email
アラート通知 *::Notify::IKC
アラート通知 *::Notify::IMKayac
アラート通知 *::Notify::Nakanobu
アラート通知 *::Notify::XMPP
使用ワーカー *::Worker::Gearman
使用ワーカー *::Worker::Simple

お手軽に使うには、「プラグインの種類」の項目の「制限」「使用ワーカー」は無視して構いません。実質、「アラート通知」も無視して大丈夫です。なので、基本的に、Agent以下の監視項目を見ていけば良いのです。また、App::MadEye::Plugin::Agentという名前空間に束縛されますがAgent以下に監視したい項目を作成すれば独自のプラグインも書けます。

お手軽監視の仕様に即した作業のApp::MadEyeサポート可否

これから行う作業をApp::MadEye自体がどれだけサポートするかについて、以下でまとめておきたいと思います。

実作業 App::MadEyeサポート可否 コメント
メールサーバーを立てる × postfixなど自分で立てる必要があります
メールクライアントを作成する App::MadEye::Plugin::Notify::Emailが使えます
監視項目を決める × 監視するか判断するのはあなたです
監視ツールに即した監視の設定かいて、監視ツールのスクリプトを作成する Agent以下のプラグインを書いていきます
チェックする間隔を決める × 判断するのはあなたです
監視ツールのスクリプトをcronに登録する × cronに書きこむはあなたです

お手軽監視の仕様に即してApp::MadEyeを使って死活監視

やっとこ・・・という感じですが、前述した「お手軽監視の仕様」に即して、App::MadEyeを使うまでをまとめていきたいと思います。実作業は、ubuntu10.04の64ビット版の状況下を前提にし、監視対象は私のサイト「hirobanex.net」ということにして話を進めます。

もし、「死」の場合はアラートを通知する

メールサーバーを立てる

postfixを入れます。手順は以下の通りです。

  • sudo aptitude install postfix
  • 「Internet Site」を選択
  • 後はデフォルト

お手軽なんで、SMTPだけでいいです。

メールクライアントを作成する

*::Notify::Emailを使いますが、以下でまとめて設定方法を書きます。

予め決めた項目をチェックする

監視項目を決める

とにかく、お手軽なんで、以下をチェックするくらいにしておきます。

  • Pingを飛ばしてサーバーの応答を確認する(*::Agent::Ping)
  • DNSサーバーが名前解決してくれるかどうか確認する(*::Agent::DNS)
  • HTTPステータスコードが200かどうか確認する(*::Agent::HTTP)

できればやりたいのが以下ですがお手軽ではないのでパスします。

  • ディスク容量が一定量超えていないかどうか確認する(*::Agent::SNMP::Diskでできますが、snmpdを入れて設定をする必要)
  • バックエンド動かしているPerlのサーバープロセスが活きているか確認する(*::Agent::Processでできますが、SSHを使用するので公開鍵を登録するなどが必要)

監視ツールに即した監視の設定かいて、監視ツールのスクリプトを作成する

監視項目が決まったところで、やっところコードが登場です(笑)


#! /usr/bin/env perl
use strict;
use warnings;
use App::MadEye;

my $config = +{
    plugins => [
        #アラートメールの送信元/送信先の設定
        +{
            module => 'Notify::Email',
            config => +{
                to_addr   => 'hirobanex@example.com',
                from_addr => 'monitor@madeye',
            },
        },
        #「Pingを飛ばしてサーバーの応答を確認する」設定
        +{
            module  => 'Agent::Ping',
            config => +{
                target  => [qw/182.48.41.140/],
                timeout => 30,
            },
        },
        #「DNSサーバーが名前解決してくれるかどうか確認する」設定
        +{
            module  => 'Agent::DNS',
            config => +{
                target  => +[
                    +{
                        host    => [qw/ns2.dns.ne.jp ns1.dns.ne.jp/],
                        name    => 'hirobanex.net',
                        ip      => '182.48.41.140',
                        timeout => 30,
                    },
                ],
            },
        },
        #「HTTPステータスコードが200かどうか確認する」設定
        +{
            module  => 'Agent::HTTP',
            config => +{
                target  => +[qw(http://hirobanex.net/)],
                timeout => 30,
            },
        },

    ],
};

App::MadEye->new({config => $config})->run;

簡単ですね!!!それでは、これを、/home/hirobanex/madeye.plとして保存しましょう。

一定期間毎に

チェックする間隔を決める

お気軽なんで、1時間に一回とします。

監視ツールのスクリプトをcronに登録する

cronに登録するのは以下のように行います。

  • crontab -e
  • 以下のように基本的に絶対パスで書き込む

30 * * * *  /home/hirobanex/perl5/perlbrew/perls/perl-5.10.1/bin/perl /home/hirobanex/madeye.pl

cronは環境変数をいちいち独自にエクスポートしなきゃいけないのがはまりどころなので要注意です。

まとめとその他もろもろ

なんだか、App::MadEyeの話より、だらだらとした前置きがやたらに長くなってしまいましたが、「自分頑張った!」とポジティブに受け止めます。それでも、お手軽と言いながらこれだけダラダラ書いてしまうと、「お手軽じゃなくね?」ってツッコまれそうですが、実コードはホント簡単なので、App::MadEyeはとてもいいと思います!お手軽観点のツッコミとして、「普通にcronに監視したいスクリプトを1つずつ設定すればよくね?」っていう話もあるんですが、そういうときでも、App::MadEye::Plugin::Agent::*のコードは参考になるから、そこを一読する価値はあると思います。

また、App::MadEyeの実はつけておいたほうがいいオプションの書き方をnekokakさんがブログに書いているので、是非合わせて参考にしてみるといいと思います。

あと、実はこれ、hachioji.pm#14のLTにしようと思っていたんですが、諸事情でお蔵入りになったネタです。hachioji.pm#14の感想は、別途アップしますが忘れないうちに先にこれをアップしておきます。

ではでは、毎度ですが、何かTwitterなりコメントなりで、どしどしツッコミください!

Perl update_at : 2013-08-19T10:38:59
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus