fluentd multiprocessプラグインを使う

fluentd
https://pixabay.com/images/id-1885352/
この記事は約3分で読めます。

fluentdでマルチコアのサーバーリソースを生かすため、fluentdのmultiprocessプラグインを導入することにした。multiprocessプラグインについては、以下の公式ドキュメントに書かれているとおりに設定すれば、無事複数プロセスを起動することができる。

Fluentd

ただ、今までの設定を複数プロセスから共通で使うように指定したい場合には注意が必要かと思う。例えば、out_fileなどを使っていて、うっかり以下のようにすると複数プロセスからの同一ファイルへの操作が発生してしまう。

これについては、以下のページでも言及されているように、同一ファイルへの指定は避けた方が良い。

fluentdで複数箇所から同一のファイルに出力する - 酒日記 はてな支店
このエントリは「ウィークリーFluentdユースケースエントリリレー」への参加記事です。ウィークリーFluentdユースケースエントリリレーまとめ(現在12本まで。) - iをgに変えるとorangeになることに気づいたoranieの日記f...

何故なのか、理解を深めるために備忘録を含めソースを追ってみる。(バージョンは、v0.10.39、間違ってたらすみません)

まず、上記でも言及されているように、out_fileは設定ファイルの指定ごとにFileOutputオブジェクトで管理される。FileOutputクラスは、BufferedOutputを継承しているので、送られてくるデータはバッファにたまり、BufferedOutputOutputThreadによるループのサイクルでフラッシュされる(チャンクはキューに入り、最終的にファイルへ書き出される)。

FileBuffer#resumeを見ると、fluendの起動時、FileBufferBasicBufferを継承している)はpath文字列を元に既存のバッファファイルを探し、バッファファイルが見つかれば、chunkのkeyとchunkからなるマップを生成する。仮に、out_fileによる同一のpath指定が存在し、タイミングによっては前回停止時のバッファファイルが複数存在している場合、生成するマップのkeyが重複するため、一方のバッファはマップから漏れてしまうこともある。また、同一のバッファファイルを参照している時、フラッシュのタイミングによっては、バッファをキューに入れる際のrenameの処理で失敗し、知らない間にOutputThreadが死んでしまっていることもある。

access_log.20140801.b4ffb8ecb73040f17

しかし、同じプロセスであれば、FileBufferのクラス変数@@buffer_pathsで重複パスが存在している場合、fluentdの起動時の処理でConfigErrorがraiseされpathの重複は報告されるようになっている。(コミット:fbcfaa7

また、webhdfsでHDFSへ書き込んでいる場合にも、同一ファイルに対しての複数のHTTPリクエストが発生するので、注意が必要かと思う。

ということから、multiprocessで複数プロセスで処理するときには、設定を慎重に行なう(当たり前と突っ込まれそうだが)必要がありそうだ。

コメント

タイトルとURLをコピーしました