リソースモニタリングツール「CloudForecast」入門

kazeburo さんが開発をされているサーバリソースの可視化ツール「CloudForecast」ですが、個人的に使ってみていてとても使いやすいなと思っています。もっと使ってくれる人が増えるといいなと思い、自重せずに入門エントリを書いてみました。

CloudForecast って何?

そもそも何なの?という話ですが、CloudForecast とはリソースのグラフ作成ツールとして有名な「RRDTool」の薄いラッパーとして作られています。記述言語は Perl ですので、Perl と RRDTool の使い方が大体分かっている人にとっては導入さえしてしまえばかなりかゆいところまで手が届く=カスタマイズが簡単かつ自由自在なツールだと思います。とりあえずのイントロとしては kazeburo さんの YAPC::Asia 2010 でのこちらのスライドをご覧頂ければと思います。

RRDTool って何よ?という人もいるかと思いますが、リソースモニタリングとしてよく使われる Munin, Ganglia, Cacti などはどれもそのグラフ作成部分を RRDTool に依存していますので、実は結構みなさんおなじみだったりします(表示されているグラフの右上の方をみると「RRDTOOL / TOBI OETIKER」と入っていると思います。)。Zabbix は独自に RDB にレコードを突っ込んでグラフ描画をしているようですが、それ以外は RRDTool を使って、RRD(ラウンドロビン DB)に値を記録しておき、それを使ってグラフ描画を行っています。

ただ、どのツールも統合環境として富豪化し過ぎていて、「簡単にグラフを出したい」というだけの欲求に使うには大掛かりすぎます。その点、CloudForecast は非常にシンプルな Perl のコードで組み立てられており、CPAN モジュールさえ入れてしまえば、データ取得デーモンや WEB サーバなども、スクリプトを叩くだけで動作させることができます。

また、小規模だけでなく大規模環境での動作も想定されており、Gearman を使ってデータ取得部分を並列分散処理させることも非常に簡単にできますし、自分が取りたいデータも Perl スクリプトを 1 枚書くだけで柔軟に追加することができます。

さらには作りが非常にシンプルなので全体のカスタマイズも非常に見通しが良いです。自分はサーバ構成情報を YAML に書くのが面倒だったので、RDB に入っている構成情報を取得して動作させるように改造したりしていますが、1 日で作ることができました。

お仕事でこういうプロダクトを使うときには「導入が容易」なことと「カスタマイズが容易」なことが重要だと思いますが、リソースモニタリングに特化したツールとしては現状最適じゃないかなーと個人的に思っています。

では試してみよう!の前に

お手元に試せるサーバのある方はとりあえずそちらをご利用頂くとして、そうでない方は今なら AmazonEC2 を使うのが簡単かなと思いますので、とりあえずそのイントロをスライドにしました。適当に作ったので間違ってたらすいません。

Start ec2-micro-instance

View more presentations from riywo

なお、ssh の設定に関しては myfinder さんのこちらの記事が非常によくまとまっていますので、その辺が不安な方は一読されることをおすすめします。(Amazon Linux でUsePAM noしたら入れなくなったので注意><)

では以降、Amazon Linux(≒CentOS)での作業を想定して進んでいきます。

まずはソースをゲット

レポジトリは github で公開されているので、とりあえずそれを取得しましょう。git コマンドが入っていないので、yum でいれます(Amazon の yum レポジトリは色々入ってて便利ですね)。CentOS の場合は標準レポジトリにはないので、EPEL というレポジトリを使うといいと思いますが、紹介は割愛(詳細は kazeburo さんのスライドにあります)。

# yum install git
# su - ec2-user
$ cd ~/
$ git clone https://github.com/kazeburo/cloudforecast.git

CPAN モジュールを cpanm で入れよう&その他インストール

続いて、CloudForecast を動作させるのに必要な CPAN モジュールを入れていきます。最近の Perl はかつての様に root で cpan shell を使っていれる必要などなくなっていますのでご安心を。必要なモジュールは先程 clone したディレクトリ配下に extlib というディレクトリを作り、全てそこにインストールしてしまいます。こうしておけば、他のアプリケーションには全く影響することなく自由に CPAN モジュールを使うことができます。

その鍵を握るのが cpanm というスクリプトです。一番簡単な使い方は tokuhirom さんが紹介されているように cpanm を wget してしまって、実行するという方法です。

ただ、Amazon Linux でなんにもない状態で cpanm で入れようとすると config.h がないとかで怒られたので perl-devel(と依存いくつか)と、XS を入れるために gcc を入れておきます。

# yum install gcc perl-devel

あとは cpanm で~/cloudforecast/extlibに入れていくのですが、先んじて Module::Install と CPAN を入れておく必要があるので先に実行(本来は inc が配布されるべきなのかな?)。JSON::XS の Yes/No で止まったりするので注意。

$ cd ~/cloudforecast
$ mkdir extlib
$ wget --no-check-certificate http://cpanmin.us/
$ perl cpanm -v -L extlib Module::Install CPAN

Module::Install 入れるのに 10 分くらいかかるかなと思いますが気長に待ちます。終わったらあとは CloudForecast が依存する CPAN モジュールを一気にいれます!【注意】多分 micro instance だと数時間かかるので、寝る前に実行しましょう

$ cd ~/cloudforecast
$ perl cpanm -v -L extlib --installdeps .

最後の「.」を忘れずに。あとはひたすらテストがこけないことを祈って待つのみです>< 割と時間がかかりますが忍耐強く待って下さいね。あと、不幸にもどこかでこけてしまっていたら、ログをたどって「Can't locate *** in @INC...」となっているモジュールを探して、perl cpanm -v -L extlib ***とすると良いと思います(さっき試したら Proc::ProcessTable が無いということでコケていましたので、入れてから installdeps を再実行)。

最後に、snmp と rrdtool 関係を yum で入れてしまいます。

# yum install net-snmp net-snmp-utils net-snmp-perl rrdtool-perl

これでインストール関係は終了です。

設定していこう

SNMP の設定

とりあえずリソースモニタリングするサーバとして、インストールしたサーバ自身を対象にしましょう。CloudForecast に限らず、監視ツールの類は SNMP を使うことが多いと思いますのでまずはそれをセットアップします。

# vim /etc/snmp/snmpd.conf
以下3行を設定します
  #       name           incl/excl     subtree         mask(optional)
  view    all              included      .1                80
  #       group       context sec.model sec.level prefix read   write  notif
  access  notConfigGroup ""      any       noauth    exact all none none
  # Check the / partition and make sure it contains at least 10 megs.
  disk / 10000

# service snmpd start

snmpwalkで動いているか確認
# snmpwalk -c public -v 2c localhost
SNMPv2-MIB::sysDescr.0 = STRING: Linux test-cf 2.6.34.7-56.40.amzn1.x86_64 #1 SMP Fri Oct 22 18:48:49 UTC 2010 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: ccitt.1
...

SNMP の詳しい仕組みについては割愛しますが、アクセスする際にコミュニティ名とバージョンが必要になります。ここではデフォルトの「public」というコミュニティで MIB を手広く取れる様にしてみましたが、この辺はご自由に。

いよいよ CloudForecast 起動!

それでは最後、CloudForecast の設定をしましょう。

$ cd ~/cloudforecast
$ mv cloudforecast_sample.yaml cloudforecast.yaml
$ mv server_list_sample.yaml server_list.yaml
$ vim cloudforecast.yaml
とりあえずsampleのままで大丈夫です。

$ vim server_list.yaml
--- #Test
servers:
  - config: basic.yaml
    label: localhost
    hosts:
      - 10.10.10.10 test-cf test for cloudforecast

こんな感じで sample を元に server_list.yaml に自分自身を追加します。IP アドレスはifconfigとかで調べて下さい。config を basic.yaml としていますが、これは host_confg ディレクトリにあるファイルを指しています。詳細は kazeburo さんのスライドに詳しいですが、デフォルトの basic.yaml では「eth0 の traffic」と「basic(cpu,LA,mem,TCP)」を取得します。全て SNMP 経由になります。

これで準備完了しました。それではまずはリソース取得デーモンを起動します。データ保存用のディレクトリがないので初回はそれも作っておきます。

$ cd ~/cloudforecast
$ mkdir data
$ CF_DEBUG=1 ./cloudforecast_radar -r > /tmp/cloudforecast_radar.log 2>&1 &

これでバックグラウンドプロセスとして稼働し始めます(このターミナルログインを抜けると終了してしまうので注意)。デフォルトでは CloudForecast の巡回は 5 分単位なので気長に待ちます(自分は 1 分間隔が好きなのでパッチを当てて利用しています)。

ログを見ていると巡回が始まったことがわかります。

2011-02-26T17:41:10 [WARN] first radar start in Sat Feb 26 17:42:00 2011 {lib/CloudForecast/Radar.pm#52}
2011-02-26T17:42:00 [WARN] (Sat Feb 26 17:42:00 2011) radar start  {lib/CloudForecast/Radar.pm#76}
2011-02-26T17:42:00 [DEBUG] c:Host,h:test-cf,ad:10.10.10.10 run host: test-cf(10.198.131.155) {lib/CloudForecast/Radar.pm#124}
2011-02-26T17:42:00 [DEBUG] c:Host,as:eth0,h:test-cf,ad:10.10.10.10 load resource traffic {lib/CloudForecast/Host.pm#96}
...
2011-02-26T17:42:00 [WARN] radar finish pid: 4206, code:0 {lib/CloudForecast/Radar.pm#63}
2011-02-26T17:42:00 [WARN] next radar start in Sat Feb 26 17:43:00 2011 {lib/CloudForecast/Radar.pm#64}

そうしたら、これを WEB インタフェースからグラフにして見てみましょう。特に Apache など入れる必要はなく、Starlet というサーバで起動することができます。楽チンですね。

$ cd ~/cloudforecast
$ CF_DEBUG=1 ./cloudforecast_web -r > /tmp/cloudforecast_web.log 2>&1 &

これで 5000 番ポートで web サーバが起動しています。あとは EC2 の FW 設定で、5000 番を自分の PC の IP アドレスだけに解放して「http://ec2-XX-XX-XX-XX.compute-1.amazonaws.com:5000」にブラウザからアクセスすれば画面が表示されると思います。

カスタマイズの世界へ!

基本的な導入は以上です。普段から Perl を触っている人には非常に簡単だったと思いますが、そうでない人にとっても今は cpanm を使ってかなり容易に CPAN 環境を構築できるので、ぜひ一度体験して欲しいと思います。

ここまで来てしまえば、後は必要なところをどんどんカスタマイズしていけばいいと思います。自分は以下の様なカスタマイズをして利用しています。

  • サーバ構成情報を YAML だけでなく RDB から取得できる様に

    • config の読み込みをこまめに行う様にする必要あり
  • 巡回間隔を調整可能にして 1 分間隔で実行

    • RRA の定義も自分好みに変えています
  • 複数サーバの RRD ファイルを使ってグラフ作成

    • まだ作成途中ですが、Ganglia の様に複数のサーバのリソースを合計して表示してます
  • あとはもちろんプラグイン多数

    • 既に利用していた RRD の取得・表示スクリプトを移植

この辺はできれば fork して github に上げたいのですが、整えるのに手間取ってまだやれてません。すみません。。。

あとプラグインの作成と Gearman を使った構成、daemontools についても入門を書く必要がある気がしますが、とりあえず今回は割愛します。また時間が取れたら書こうと思います。基本的には kazeburo さんのスライドに全て書かれていますので、興味ある方はそちらを見つつやって頂ければと思います。

おわりに

CloudForecast という Perl で書かれたリソースモニタリングツールの導入を説明しました。インストールが簡単かと言われると、cpanm に慣れていない人にはちょっと手間取るかも知れません。ただ、他にミドルウェアを入れる必要もなく、root での作業も少なく、監視される側も大した設定をする必要もないという点で、非常にお手軽だと思います。

また、CloudForecast を触ることで、自分は cpanm や RRDTool や plack、Gearman の効果的な使い方を知ることができているので、勉強材料としても非常に優れていると思います。例えば WEB インタフェースを Apache 経由にしたいなと思ったら、kazuho さんの記事を参考にして mod_proxy を使うことでお手軽に設定できる、というのを勉強できたりしました。

リソースモニタリングツールはすでに他のを使っているよ、という方もぜひ一度試してみると、モダンな Perl と RRDTool の勉強になってインフラ屋さんとしては損はないかなと思います。あと、CloudForecast のグラフはクエリストリングで渡すことで自由に調整して描画させることができるので、既にお使いのサーバ管理ツールなどがあれば、img タグをうまく出してあげることでそこにグラフを組み込むことも容易だと思います。

以上です。最後に kazeburo++

  • Johann 11-02-28 (月) 8:33

    おもしろそうですね。僕の会社も似たような仕組みで、一台でウン万台のリソースを監視しています。CloudForecast は Github に上がっているみたいなので、取り入れられそうなアイデアは活用させていただきます。


Ryosuke Iwanaga

Software engineer / Anime / NFL / Father. Posts are my own, not endorsed by any org.