Fluentdとfluent-plugin-mongoを
       試してみたよ
                 Webサーバ勉強会
                     2012/04/21
自己紹介

名前: 松崎 学

所属: 株式会社キャム(SaaS型の経営管理システムを提供中)

Twitter: matsumana

最近のお仕事: インフラ、Javaプログラマ(Rubyもほんの少し)

最近の興味: Scala, Ruby, Python, Play, Node.js,
            Hadoop, Asakusa Framework, MongoDB, Fluentd, Vyatta
アジェンダ
Fluentdって?

どんな所が良いの?

弊社ではどう使いたいのか

各プロセスが落ちた場合の動作を確認する

Javaで出力したログを収集するデモ

RDBMSに保存するには?
公式ドキュメント
http://fluentd.org/doc/

GitHub
https://github.com/fluent/

@frsyukiさんのBlog
http://d.hatena.ne.jp/viver/20110929/p1

Fluentd meetup in Japan
http://www.zusaar.com/event/193104
http://johtani.jugem.jp/?eid=60
どんな所が良いの?
既存システムの構成を変えずに
ログ収集を始める事が可能。

MessagePackを使っている。

設定が簡単。

充実したプラグインにより柔軟な構成が可能。

JSONにパースしてくれる。

既に大規模サイトでの運用実績が!!
弊社ではどう使いたいのか

 アプリ(Java)からlog4jで出力した
 デバッグログの収集と保管を行いたい。
 (ローテーションして消えていくので、
 障害調査をする時にログがない事がある。)
Fluentdへのinput方法
 ログファイルをtailする。
 → 既存システムに手を加えずに導入可能。
  標準のin_tailは単一行のみ対応。
  複数行にまたがるログの場合、
  自分でプラグインを作る必要がある。

 アプリから直接Fluentdにログを投げる。
 → 今回はこれを試しました。

 別のFluentdから転送される。
複数行にまたがるログを
  処理するプラグインを作る時の参考


fluent-plugin-mysqlslowquery
http://d.hatena.ne.jp/yuku_t/20120122/1327209206
今回試した構成



bufferingしておけば、forward先やoutput先が落ちても、
         復旧後にちゃんと処理されます。
   fluent-plugin-mongo @repeatedlyさん作成
   fluent-logger-java   @mugaさん作成
                       (RubyやPythonもあるよ)
・APサーバの設定ファイル
https://gist.github.com/2422761

・LOGサーバの設定ファイル
https://gist.github.com/2422773

・ログ出力テストのソース(Java)
https://gist.github.com/2422818
各プロセスが落ちた場合の動作を確認する

 MongoDBが落ちた場合
 → LogサーバのFluentdの再起動が必要。
  再起動した時にbuffer fileを使ってMongoDBに保存される。

 LogサーバのFluentdが落ちた場合
 → LogサーバのFluentdが起動した時にAPサーバがbufferを使って
  LogサーバのFluentdに転送後、MongoDBに保存される。

 APサーバのFluentdが落ちた場合
 → Javaで例外が発生するが、printStackTrace()するだけなので、
  システムが止まる事はない。
$ java FluentLogClient
2012/04/21 1:43:47 org.fluentd.logger.sender.RawSocketSender open
SEVERE: Failed to connect fluentd: localhost/127.0.0.1:24224
2012/04/21 1:43:47 org.fluentd.logger.sender.RawSocketSender open
SEVERE: Connection will be retried
java.net.ConnectException: 接続を拒否されました
 at gnu.java.net.PlainSocketImpl.connect(libgcj.so.10)
 at java.net.Socket.connect(libgcj.so.10)
 at java.net.Socket.connect(libgcj.so.10)
 at org.fluentd.logger.sender.RawSocketSender.connect(RawSocketSender.java:144)
 at org.fluentd.logger.sender.RawSocketSender.open(RawSocketSender.java:132)
 at org.fluentd.logger.sender.RawSocketSender.<init>(RawSocketSender.java:127)
 at org.fluentd.logger.FluentLogger.getLogger(FluentLogger.java:53)
 at org.fluentd.logger.FluentLogger.getLogger(FluentLogger.java:40)
 at org.fluentd.logger.FluentLogger.getLogger(FluentLogger.java:36)
 at FluentLogClient.<clinit>(FluentLogClient.java:10)
 at java.lang.Class.initializeClass(libgcj.so.10)
Logging.
RDBMSに保存したい場合
 MySQL
 → fluent-plugin-mysql

 PostgreSQL
 → fluent-plugin-pghstore
Ruby 1.9.3 p125 + jemalloc

        を使いましょう。

詳しくは@tagomorisさんのブログを。
 http://d.hatena.ne.jp/tagomoris/
     20120403/1333417657
ご清聴ありがとう
ございました。

Webサーバ勉強会 LT資料