読者です 読者をやめる 読者になる 読者になる

彼女からは、おいちゃんと呼ばれています

ウェブ技術や日々考えたことなどを綴っていきます

GrowthForecast を CentOS 6.3 にインストールして Supervisor で管理する

Perl

WebAPI 経由でいろんな値を送り込んでグラフ化できる GrowthForecast。Fluentd との相性が抜群ですっかり定番ツールになりましたね。僕もサイトのレスポンスタイム等をグラフ化して、パフォーマンス監視に利用しています。

また最近 Supervisor というツールを知りまして。要は growthforecast.pl などのスクリプトをデーモンプロセスとして管理して、

  • プロセスの生死を監視する
  • プロセスが死んだら自動で再起動する
  • 標準出力やエラー出力のログを取る

というようなことをやってくれます。

というわけで、GrowthForecast や Supervisor を導入したときのメモです。特に目新しい内容ではないですが、できるだけ丁寧に書き留めておきますので、よろしければ参考にしてくださいまし。

なお、下記の記事を大変参考にさせて(パクらせて)いただきました。@ さん、いつもありがとうございます。

GrowthForecast をインストールして Supervisor で管理してみた

  1. GrowthForecast のインストール
  2. GrowthForecast を Supervisor で管理
  3. Supervisor を Upstart 経由で起動

1. GrowthForecast のインストール

まずはメインの GrowthForecast をインストールするところから。今回のエントリーは結構長いので、とりあえず GrowthForecast を試してみたいという人は、この 1. のところで手を止めても良いと思います。

1-1. 依存パッケージのインストール

GrowthForecast が利用している RRDTool が依存するライブラリをインストールします。root ユーザで下記コマンドを実行。

# yum groupinstall "Development Tools"
# yum install pkgconfig glib2-devel gettext libxml2-devel pango-devel cairo-devel

(注意)コマンド行の先頭に「#」を付けているものは root ユーザで実行(もしくは sudo を付けて実行)。「$」を付けているものは一般ユーザで実行。以下同じです。

1-2. GrowthForecast 用のユーザの作成

GrowthForecast では、OS に最初から入っている Perl ではなく Perlbrew の利用が推奨されています。Perlbrew を入れて GrowthForecast を動かすためのユーザを作成。あわせてパスワードも設定します。

# useradd growthforecast
# passwd growthforecast

1-3. Perlbrew のインストール

growthforecast ユーザに切り替えてから、Perlbrew をインストール。またインストール後に設定ファイルを読み込みます。

# su - growthforecast
$ curl -kL http://install.perlbrew.pl | bash
$ echo '[[ -s "$HOME/perl5/perlbrew/etc/bashrc" ]] && source "$HOME/perl5/perlbrew/etc/bashrc"' >> .bash_profile
$ source $HOME/perl5/perlbrew/etc/bashrc(設定ファイル読込)

ちなみに Perlbrew は複数のバージョンの Perl を切り替えて使うのに便利なツールです。cpanm(cpanminus)は CPAN をさらに便利にしたツール。perlbrew + cpanm は、root 権限を持たないユーザのホームに環境を構築できるのが大きな特長です。

1-4. Perlbrew から Perl をインストール

$ perlbrew available

でインストールできる Perl のバージョンが列挙されるので、その中からインストールするバージョンを指定します。

$ perlbrew available
perl-5.17.8
perl-5.16.2
perl-5.14.3
perl-5.12.5
perl-5.10.1
perl-5.8.9
perl-5.6.2
perl5.005_04
perl5.004_05
perl5.003_07

perl-5.xx の xx が奇数のバージョンは開発版なので、perl-5.17.8 は避けて perl-5.16.2 を選びました。

$ perlbrew install perl-5.16.2
$ perlbrew switch perl-5.16.2
$ perl -v(バージョンが 5.16.2 になっているか確認)

ちなみに、インストールには結構時間がかかります。10分くらい待っても返ってこなくて、その後20分くらいご飯を食べて戻ってきたら終わってました(ご飯のくだりとかどーでもいい)

1-5.cpanm のインストール

Perlbrew を入れている環境では、cpanm のインストールは簡単です。

$ perlbrew install-cpanm

1-6. GrowthForecast のインストール

cpanm から GrowthForecast のインストール。引き続き growthforecast ユーザで行いますよ。

$ cpanm -n GrowthForecast

なお、-n オプションは --notest の略。テストを行わずにインストールするというオプションです。

1-7. GrowthForecast のデータディレクトリ等の作成

$ mkdir /home/growthforecast/data
$ mkdir /home/growthforecast/log

(失敗談)以前、/var/run/growthforecast というディレクトリを作ってそこにデータを保存していました。/var/run 配下がサーバを再起動したタイミングで削除されると知らずに。

1-8. GrowthForecast の起動及び動作確認

GrowthForecast をバックグラウンドで起動します。ポート番号はデフォルトで 5125 なので、べつに指定しなくても構いません。

$ growthforecast.pl --port=5125 --data-dir=/home/growthforecast/data > /home/growthforecast/log/growthforecast.log 2> /home/growthforecast/log/growthforecast.err &

このタイミングで一度動作確認しておくと良いと思います。

  • (1) http://(IP アドレス):5125 にアクセスして、GrowthForecast のトップページが表示されるか確認。
  • (2) 下記コマンドを打って、グラフが登録されるか確認(下記は公式サイトに載っているサンプルに一部手を加えたもの)
$ curl -F number=10 http://(IP アドレス):5125/api/socialgame/member/register

API を叩いたら、下記のような感じで返ってくるはずです。

$ curl -F number=10 http://xxx.xxx.xxx.xxx:5125/api/socialgame/member/register
{"error":0,"data":{"number":10,"llimit":-1000000000,"mode":"gauge","stype":"AREA","adjustval":"1","meta":"","service_name":"socialgame","gmode":"gauge","color":"#3366cc","created_at":"2013/02/10 23:37:45","section_name":"member","ulimit":1000000000,"id":1,"graph_name":"register","description":"","sulimit":100000,"unit":"","sort":0,"updated_at":"2013/02/10 23:37:45","adjust":"*","type":"AREA","sllimit":-100000,"md5":"c4ca4238a0b923820dcc509a6f75849b"}}%   

表示されるグラフは下記のような感じ。「hour・8hours(1min)」というのを選択すると確認しやすいかもです。


2. GrowthForecast を Supervisor で管理

さて、ここまで無事に確認できたら、GrowthForecast はひととおり動きますので、とりあえず動けばよい、細かいことは気にしないという方は、以下すっ飛ばしてもらって良いと思います。

一方、業務で使うとかいう場合は、GrowthForecast が落ちたときに自動で再起動してくれる仕組みを作っておいた方が安心だと思うので、引き続き以下を参考にしてください。

2-1. 起動中の GrowthForecast を停止

GrowthForecast がバックグラウンドで起動したままになっているので停止させます。

$ pkill -u growthforecast

pkill コマンドって何?という方(僕もそうでした)は、下記を参照してください。便利です。

2-2. Supervisor のインストール準備(yum リポジトリの追加)

Supervisor を yum からインストールするために、epel リポジトリを追加します(Supervisor のインストール方法は他にもあるのですが、いまはせっかく yum で管理できるようになっているので、そっちを利用した方が良いんじゃないかと思います)

ここからは root ユーザで実行します。

# cd /usr/local/src
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -Uvh epel-release-6-8.noarch.rpm

明示的に指定したときだけ epel リポジトリが参照されるように設定しておいた方が安全です。

# vi /etc/yum.repos.d/epel.repo

「enabled=1」となっている箇所を「enabled=0」に書き換えれば OK です。

2-3. Supervisor のインストール

上で追加した epel リポジトリから Supervisor をインストールします。

# yum --enablerepo=epel install -y supervisor
...
Installed:
  supervisor.noarch 0:2.1-8.el6

Dependency Installed:
  python-meld3.x86_64 0:0.6.7-1.el6

2-4. Supervisor 設定ファイルの編集

# vi /etc/supervisord.conf

ファイルの末尾に、GrowthForecast の管理に関する設定を追加します。

[program:growthforecast]
command=/home/growthforecast/perl5/perlbrew/perls/perl-5.16.2/bin/perl /home/growthforecast/perl5/perlbrew/perls/perl-5.16.2/bin/growthforecast.pl --data-dir /home/growthforecast/data
process_name=%(program_name)s
stdout_logfile_maxbytes=1MB
stderr_logfile_maxbytes=1MB
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
user=growthforecast
autostart=true
autorestart=true

フルバージョンは こちら です。

2-5. Supervisor の起動及び動作確認

Supervisor を起動させて、ログにエラーを吐いてないか確認します。

# service supervisord start
Starting supervisord: [ OK ]

# tail /var/log/supervisor/superviserd.log

growthforecast が起動していることも合わせて確認します。

# supervisorctl status
growthforecast RUNNING pid 18283, uptime 0:00:24

http://(IP アドレス):5125 にアクセスして確認。さらに、GrowthForecast のプロセスを一度殺してみて、自動的に再起動されるかも確認します。

# pkill -u growthforecast

3. Supervisor を Upstart 経由で起動

ここまでで、GrowthForecast のプロセスが落ちても、Supervisor が自動で再起動してくれるところまで実現できました。

ここからはさらに進めて、Supervisor を Upstart 経由で起動するようにし、Supervisor が落ちたときでも自動で再起動してくれるようにする設定です。

3-1. Supervisor を一旦停止

Supervisor を Upstart 経由で起動するために、一旦停止させます。

# service supervisord stop

3-2. Supervisor を Upstart 経由で起動

まず設定ファイルを用意します。

# vi /etc/init/supervisord.conf
description "supervisord"
 
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /usr/bin/supervisord -n

そして Upstart 経由で起動。

# initctl start supervisord

3-3. Supervisor 及び GrowthForecast の動作確認

設定は全て終わっているので、あとは動作確認のみ。まずは growthforecast が落ちたときに自動で起動されるか確認します。

# pkill -u growthforecast

http://(IP アドレス):5125 にアクセスして確認。

次に Supervisor が落ちてもなお大丈夫かどうか確認。

# service supervisord stop

http://(IP アドレス):5125 にアクセスして確認。

以上です。長文にお付き合いくださいまして、ありがとうございました。

おまけ - Perlbrew から Perl をインストールできなくてシステムの Perl を使用したとき

ここからは完全におまけです。

まだ原因が分かっていないのですが、あるサーバ(そのサーバも CentOS 6.3)で試してみたとき、Perlbrew から Perl をインストールしようとすると、下記のエラーが出て失敗しました。

$ perlbrew available
ERROR: Unable to retrieve the list of perls.

$ perlbrew install perl-5.16.2
ERROR: Failed to download perl-5.16.2 tarball. at /loader/0x1802950/App/perlbrew.pm line 1.

そのような場合は OS に最初から入っている Perl を使うと良いと思います。僕もそうしましたが、いまのところ特に支障は出ていません。