書いた人: sonots (@sonots)
皆さんは Fluentd をご存知でしょうか? 「Fluentd」はトレジャーデータのメンバおよびコミュニティメンバーにより開発が進められている Ruby 実装のオープンソースログ収集ツールです。
クラウド化が進むことでますますシステムが大規模・複雑化している近年、大量・多様に出力されるログを効率良く管理し、活用できるツールとして注目され、実際に多くの会社によって利用されています。1
今回私は、そのメジャーバージョンアップとなる Fluentd v11 にまつわる噂を記事にしたいと思います。噂、としているのは v11 はまだ開発途中であり、これらの仕様はまだ確定したものではなく、今後変更もあり得るためです。
Fluentd v11 は今までの Fluentd v10 と内部実装が全く異なり、フルスクラッチで再実装されています。 それに伴い多くの仕様変更、機能追加がされていますのでご紹介していきます。
v11 の fluentd コマンドには -g GEMFILE および -G GEM_INSTALL_PATH オプションが追加されました。 このオプションを利用することにより、指定した Gemfile に対して起動時に bundle install を実行し、依存 plugin をインストールさせることができるようになります。
試しに次の Gemfile を作成してみましょう。
config ファイルも必須なので、適当に次のファイルをデフォルトパスである /etc/fluentd.conf に用意しておくことにします。
以下のように -g オプションで Gemfile を指定して fluentd を起動すると、gem のインストールが始まり、fluentd が起動されます。
拙作の fluentd-plugin-grep が追加インストールされました。
Gemfile で gem のバージョンを指定すればバージョンコントロールが可能です。実は fluentd のバージョンを指定して、fluentd をすげ替えることもできるので、興味深いかと思います。
尚、bundle exec bin/fluend のように bundler を使って fluentd を起動した場合は、-g オプションで指定した Gemfile は読み込まれない仕様ですのでご注意ください。
Fluentd v11 は Fluentd v10 までと内部実装が全く異なり、serverengine と呼ばれる unicorn のように prefork モデルでマルチプロセスサーバを実装するためのフレームワークをベースに作成されています。
これにより、今までは CPU リソースを有効に活用するためには、コア数分の Fluentd プロセスを supervisord や daemontools を利用するなどしてユーザが独自に管理する必要があったのですが、Fluentd 単体で複数プロセスを管理することができるようになりました。
※ 尚、serverengine の作者は fluentd のコアデベロッパーである古橋さんであり、おそらく Fluentd v11 で利用するために実装したものと思われます。
Fluentd を複数プロセスで起動するには worker ディレクティブを使用します。
では、fluentd を起動して、ps コマンドでプロセス数を見てみましょう。
fluentd:worker プロセスが3つ立ち上がっていることがわかりますね。
尚、Fluentd v11 では、設定ファイルに worker ディレクティブの記載がない場合は、v10 compatible configuration file モードで設定ファイルが読み込まれます。
worker ディレクティブのない次のような設定ファイルを指定すると、次のような warning メッセージがログに出力されるのですぐわかりますね。
Fluentd v11 では内部ルーティングラベルが導入されました。
今までは、ログを加工するようなフィルタリングプラグインに処理を渡す場合には、add_tag_prefix といった設定オプションを用いてタグを変更していました。 つまり、入力時にログファイルの種別を区別するために付けたタグが、フィルタリングプラグインを介すにつれて、 ルーティング用のタグが付加されていき、ごちゃごちゃになってしまっていました。
内部ルーティングラベルが導入されたことにより、 入力時のタグをそのまま出力プラグインに引き渡し保存することができるようになります。 これで出力プラグインの remove_tag_prefix オプションとはおさらばですね。
内部ルーティングラベルを指定するために、設定ファイルの文法に label ディレクティブが新しく導入されています。 また、label を付与してルーティングされるための redirect プラグインが fluentd 本体で用意されています。
設定ファイルは例えば次のようになります。
設定ファイルを DSL で書く記法が追加されました。例として次のような設定ファイルを DSL に変更してみます。
拡張子を .rb に変更して次のように書きます。<hoge></hoge> のようなディレクティブが hoge {} のように変わっただけで、 他はほとんどそのままです。簡単に移行できそうですね。
ruby の DSL になりましたので、設定ファイル中で ruby コードを書く事ができるようになります。 例えば以下のように書けば、in_forward の設定をコピー&ペーストせずに worker プロセスを複数で起動させることができます。
実は、Fluentd v0.10.38 にも experimental な実装として、v11 の DSL 記法がバックポートされています! Fluentd v10 には worker ディレクティブがありませんので、以下のように書きます。是非、試してみてください。
Fluentd プラグインの設定パラメータに、配列およびハッシュを指定できるようになります。
今まで利用可能だった以下のパラメータの型に加え、
次の型が追加されます。
any は数値、文字列など型を限定することなくパラメータを指定できる型です。
プラグインでこれらの型を受け取るパラメータを用意するには、次のようなコードを書きます。
すると、設定ファイルで次のように配列およびハッシュを指定できます。
今までは、パラメータで配列を受け取りたい場合は、プラグイン内部で文字列を split(“,”) して配列に変換するなどの必要があったのですが、any および hash の導入により、これらのコードが不要になるので、プラグイン制作者にとって嬉しい機能です。
Fluentd v11 の設定ファイルの記法として ${} 記法が追加されます。これにより、設定ファイル中に ruby コードを書けるようになります。
例えば ${Float::NAN} とか ${1+1} のような任意の ruby コードを書けます。${ENV[‘XXXX’]} のように環境変数を呼び出すこともできますね。
尚、ruby のコードは Object.new のコンテキストで実行されます。
TCP ソケットを閉じない graceful restart ができるようになります。
serverengine では以下の Signal を受け取ることができ、Fluentd v11 でも同様に USR1 シグナルで graceful restart させることができます。
serverengine のシグナル一覧:
試しに fluentd に USR1 シグナルを送るには以下のようにします。
プラグイン制作者向けの話となります。
Fluentd v11 用のプラグインは Fluentd v10 用のプラグインと互換性がありません。そこで、プラグインの名前空間が Fluent::Plugin から Fluentd::Plugin に変更となりました。合わせて gem の名称も fluent-plugin-xxx から fluentd-plugin-xxx に変更となりますので、対応が必要です。
Fluentdプラグインのv10→v11移植ガイド がありますので、そちらを参考して、v11 移行を実施してください。
fluent-plugin-grep や fluent-plugin-datacounter のようなメッセージを受け取って次のプラグインにフィルタリングするようなプラグインの仕組みとして filter プラグインという枠組みができました。
今までは output プラグインとして実装していましたが、output プラグインはデータベースや他のアプリケーションにデータを出力するもの、filter プラグインはフィルタリング処理をするもの、として役割が明確化されました。
設定ファイルの記述方法も変わっています。v10 までは match ディレクティブを使用していましたが、v11 からは filter プラグイン専用の filter ディレクティブが用意されました。match ディレクティブは output プラグイン用のディレクティブとなります。
プラグイン制作者向けの話となりますが、フィルター系のプラグインを v11 に移行するには、Fluentdプラグインのv10→v11移植ガイド (filterぷらぎん編) を参考にしてください。
Fluentd v11 では Windows に初めから対応する予定です。Windows 対応にあたってネックとなっていた coolio のコミット権を得て、Windows 対応を進めているとの噂。また、JRuby など他の処理系のことも考え、v10 とは違いライブラリへの依存度を減らすような設計にしているとのこと。
Fluentd v10 の最新ブランチに format none
が導入されました!今まで Fluentd では、ログをパースすることなく送信したい場合でも、
のように正規表現を記述する必要がありました。正規表現でのパースはそれだけでも充分大きなオーバーヘッドとなりえます。
そこで、上記の設定と同等な効用を持ちつつも、正規表現でのパースを必要としない format none
が pull request #182 によって実装されました。
v0.10.39 および v11 以降で使用できるようになるでしょう。
Fluentd v11 の新機能について解説しました。マルチプロセスや DSL など夢が広がる機能がたくさんあったのではないでしょうか? Fluentd v11 はまだ開発途中であり、仕様も fix されたものではありませんが( 2013 年 9 月 30 日現在)、近々リリース予定とのことで、前もって新機能を知っておけるとうれしいかと思い、僭越ながらご紹介させて頂きました。
この記事がお役に立てれば幸いです。
本文書は Fluentd コミッターである frsyuki 氏、repeatedly 氏、tagomoris 氏 (順不同) にレビューして頂きました。ありがとうございました。
瀬尾 直利 (@sonots)
株式会社ディー・エヌ・エー所属。インフラアプリケーションエンジニア。Ruby で Fluentd クラスタ管理ツール Haikanko やグラフツール Yohoushi などの開発をしている。このたび Fluentd コミッターの一員となりました。
任天堂でも利用されているとか。 http://www.nintendo.co.jp/3ds/interview/streetpass_relay/vol1/index4.html ↩