リソースモニタリングツール「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を使うのが簡単かなと思いますので、とりあえずそのイントロをスライドにしました。適当に作ったので間違ってたらすいません。

なお、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に上がっているみたいなので、取り入れられそうなアイデアは活用させていただきます。