前回の記事で静的ファイルを別サーバから配信することにしましたが、今度はアクセスログがサーバ毎に分散してしまうので、少々やっかいだなと思いました。
出来るだけ正確でリアルタイムに近い形でログを収集できればいいなという感じです。
まず、考えていたのは一定期間毎に一つのサーバにログを収集していく方法です。せっかくlsyncdも入れているので、rsyncで収集するのが一番簡単そうです。しかし、lsyncdでそのままログファイルをミラーしてしまうと、ログが書き込まれる度に送信しちゃうわけで。。。この辺りはどうにか出来るとは思いますが、みんなはどうやっているのかちょっと調べてみました。
とりあえず、検索してみたら下記のページが見つかりました。
ログ集約・収集について【syslog – 集約】 – プログラマ 福重 伸太朗 〜基本へ帰ろう〜
どうやら、「集約」と「収集」では意味合いが違う模様。たしかにそうだなと思い、妙に納得してしまうのでありました。こちらに書いてあったのは、syslogやsyslog-ngを使う方法のようです。
「集約」を目的にするとどうしても精度が落ちてしまうらしい、当然に集約するためにログサーバなどに送信するわけで、データが正しく送れる保証はないということです。
それに比べて「収集」は、ローカルに保存されたデータを定期的にログサーバなどに送信するといった感じでしょうか。精度の高いデータを必要する場合は、こちらがいいようです。今回はアクセスログで、ログ解析などを必要とするためにある程度の精度が必要です。
ここでふと思い出したのが、Scribeというものです。知っている方も多いと思いますがFacebookで利用されているログを集約・収集するためのツールです。調べてみた所、けっこういいんじゃないかと思ったので導入してみることにしました。
・中間程度の信頼性がある。通信が失敗したときはローカルに保存し、次に成功したときに自動的に送信してくれる。
・メッセージ構造がシンプル。カテゴリとメッセージ本体のみで保存される。
とりあえず、使ってみることにします。
Thriftというものを使っているらしく、まずこちらを入れてみます。
# ThriftもFacebookが開発したもので、RPCフレームワークらしいです
Apache Thrift
その前にBoost1.36以上に依存しているため新しいものを入れます。今回はRPMで入れる事にしました。yumではインストール出来ませんので、下記サイトを参考にSRPMからインストールします。
Boost 1.37.0のRPMパッケージ作成メモ – torutkの日記
263229387914-1370-3
-1370-3
02246
$ /usr/src/redhat/SPECS
$ /usr/src/redhat/SOURCES
-1370-1-1370-1
$ tar zxvf thrift.tgz
$ cd thrift
$ ./bootstrap.sh
configure.ac:50: error: possibly undefined macro: AC_PROG_MKDIR_P
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
26
2642959985-261-2
-261-2
$ ./bootstrap.sh
$ ./configure && make
$ cd thrift/contrib/fb303
$ ./bootstrap.sh
$ ./configure && make
次に下記のページからScribe本体をダウンロードします。
Scribe | Free Development software downloads at SourceForge.net
$ tar zxvf scribe-version-2.01.tar.gz
$ cd scribe
$ ./bootstarp.sh
$ ./configure && make
これでインストール完了です。早速使ってみることにします。
$ /usr/local/bin/scribed examples/example1.conf
/usr/local/bin/scribed: error while loading shared libraries: libthrift.so.0: cannot open shared object file: No such file or directory
$ /usr/local/bin/scribed examples/example1.conf
Thrift: Thu Jul 30 12:44:18 2009 libevent 1.1a method epoll
この状態ではまだデーモンとして立ち上げず、別のシェル上からログメッセージを送信してみます。Scribeのビルドディレクトリ内のexamplesの中にサンプルのプログラムが入っているみたいです。
scribe_catはメッセージを追記、scribe_ctrlはサーバの状態を確認するもののようです。pythonで出来てました。
$ echo "hello japan." | ./examples/scribe_cat test
[Thu Jul 30 12:48:30 2009] "Exception < boost::filesystem::create_directory: No such file or directory: "/tmp/scribetest/test" > trying to create directory"
[Thu Jul 30 12:48:30 2009] "[test] Failed to open file </tmp/scribetest/test/test_00000> for writing"
[Thu Jul 30 12:48:30 2009] "[test] Opened file </tmp/test/test_00000> for writing"
$ mkdir /tmp/scribetest
[Thu Jul 30 12:49:38 2009] "[test] Opened file </tmp/scribetest/test/test_00000> for writing"
[Thu Jul 30 12:49:38 2009] "[test] Changing state from <DISCONNECTED> to <SENDING_BUFFER>"
[Thu Jul 30 12:49:38 2009] "[test] successfully read <1> entries from file </tmp/test/test_00000>"
$ cat /tmp/scribetest/test/test_current
hello japan.
とりあえず、無事に動いているようでインストール成功しました。長くなりそうなので記事を別けて掲載します。次の記事ではネットワーク経由でログを出力させてみようと思います。