Fluentdは JSONストリームとしてログを扱うログ収集デーモンです。
これまでのところ、最大のユーザーではピーク時で
100台以上のサーバ、650GB daily 、70,000msgs/sec のログを収集しています。
モダンなWebおよびモバイルアプリケーションは、
非常に多数の イベントログ (例:ログイン、ログアウト、購入、フォローなど)を生成しています。
このイベントログを分析することによって、これらのサービスを大きく向上させることが可能です。
しかし、シンプルで信頼性の高い方法で、これらのログを収集することが課題として残されています。
Fluentdは、次の機能をユーザに提供することによってこの問題を解決します:
- 簡単なインストール
- 小さなフットプリント
- 半構造化データ·ロギング
- 柔軟なプラグイン機構
- 信頼性のあるバッファリング
- ログの転送
FluentdはRuby gemにパッケージされています。これは、1回のコマンドでインストールできます。
そのシンプルなアーキテクチャのため、Fluentdのコアは、
わずか3,000行のRubyコードで構成されています。
Fluentdは、さまざまな 入力 元からイベントを収集し、 出力 先に書き込みます。
- 入力元例: HTTP, Syslog, Apache Log
- 出力先例: Files, Mails, RDBMS databases, NoSQL storages
下図は、 入力 と 出力 の基本的な考え方を示しています。
Input Output
+--------------------------------------------+
| |
| Web Apps ---+ +--> File |
| | | |
| +--> ---+ |
| /var/log ------> Fluentd ------> Mail |
| +--> ---+ |
| | | |
| Apache ---+ +--> S3 |
| |
+--------------------------------------------+
収集されたイベントログには、 tag 、 time 、 record の3つのエンティティで構成されます。
tagは '.'(例:myapp.access) で区切られた文字列であり、イベントを分類するために使用されます。
timeはイベントが発生したUNIX時間です。recordはJSONオブジェクトです。
Fluentdの入力元と出力先は、適切なRubyプラグインを書くことで拡張することができ、
そのプラグインは、Ruby gemsとして公開することができます。
使用可能なプラグインのリストは、次のコマンドで見ることができます:
$ gem search -rd fluent-plugin
従来のシステムでは、予期しない書き込み障害が発生した場合(例:ネットワーク障害)
イベントログが失われる可能性があります。
Fluentdはこの問題と戦うために設計されており、信頼性のあるバッファリング戦略が装備されています。
Fluentdのバッファは、イベントログを含むチャンクのキューを一時的に格納します。
Queue
+---------+
| |
| Chunk <-- Write events to the top chunk
| | (never block)
| Chunk |
| |
| Chunk |
| |
| Chunk --> Write out the bottom chunk
| | (transactional)
+---------+
Fluentdがその入力元からイベントを受信すると、イベントログがバッファ内の一番上のチャンクに追加されます。
一時的に記憶する為、この操作は次にサーバがダウンしてもブロックされません。
新しい空のチャンクは、(1)一番上のチャンクのサイズが限界に達するか、
または(2)タイマーが切れるキューの先頭にプッシュされます。
別のスレッドでは、次のサーバー、またはストレージサーバーのいずれかにボトムチャンクを書き出します。
この書き込み操作が成功した場合、チャンクはキューから削除されます。
それ以外の場合は、スレッドはキュー内のチャンクを残し、後で再試行します。
Fluentdのバッファはプラグインで実装可能です。
デフォルトのプラグイン、 'memory'は、メモリにチャンクを格納します。
処理速度は速いですが、データの持続性はありません。
別のプラグインに'file'があります。これはファイルにチャンクを格納します。
Fluentdは、シングルノード、およびマルチノード構成をサポートしています。
マルチノード構成では、Fluentdは、分析を行うために1つの場所にイベントログを転送することをサポートします。
アプリケーション·サーバーは、ローカルのログをFluentdインスタンスから中央サーバのFluentdインスタンスへ転送します:
Web Server
+---------+
| Fluentd -------+
+---------+ |
|
Proxy Server |
+---------+ +--> +---------+
| Fluentd ----------> | Fluentd |
+---------+ +--> +---------+
|
Database Server |
+---------+ |
| Fluentd -------+
+---------+