Fluentd v0.14 で buffer chunk が flush されるまでの動きをまとめてみた

Written by @ryysud

Jul 25, 2017 01:01 · 1032 words · 3 minutes read #fluentd

前置き

fluent-plugin-webhdfs を利用して HDFS に転送するファイルのサイズを制御する際に Buffer Plugin のパラメータ周りで少し混乱したので備忘録的にまとめておくことにした。

そもそも buffer chunk の制御はどこで行われているか?

  • Buffer Plugin が buffer chunk の制御を行う
  • Buffer Plugin は Output Plugin に組み込む形で利用される
  • flunetd に組み込みで提供されている Buffer Plugin

buffer-internal-and-parameters.png 引用:Buffer Plugin Overview v0.14

Fluentd v0.14 における Output Plugin のバッファリング

以下の3つのモードに分かれており Non-Buffered mode を除いた Output Plugin 内の Buffer Plugin によって chunk buffer が制御される

  • Non-Buffered mode(バッファせずに書き込む)
  • Synchronous Buffered mode( section で chunk と queue を制御して書き込む)
  • Asynchronous Buffered mode( section での制御して非同期に書き込む)

v0.12 で以下のように3つのクラスで分けられていた Output Plugin は v0.14 では1つのクラスにまとめられたようです

  • Non-Buffered output plugin
  • Buffered output plugins
  • Time Sliced output plugin

※ 詳細はこちら → Updating plugin for v0.14 from v0.12

こちらのコミットにあるとおり Fluent::TimeSlicedOutput を継承して実装されていた fluent-plugin-webhdfs も Fluent::Plugin::Output に変更されていることがわかります
https://github.com/fluent/fluent-plugin-webhdfs/commit/0b822df0a753a00b97f61abba5c9fec204b6e8e1

buffer chunk が flush される条件

flush_interval の設定値によって条件が変わってくるためそれぞれ列挙していきます

flush_interval を指定した場合の条件

  • buffer chunk のサイズが chunk_limit_size * chunk_full_threshold に達した場合
  • buffer chunk が作られてから flush_interval で指定した時間が経過した場合( chunk_limit_size * chunk_full_threshold に達していない場合にもこの時間が経過したら強制的に flush される)

flush_interval を指定していない場合の条件

  • buffer chunk のサイズが chunk_limit_size * chunk_full_threshold に達した場合
  • timekey で指定した時間幅終端 + timekey_wait で指定した時間を経過した場合
    • 以下の設定値なら 毎時9分59秒(毎時59分59秒 + 10分)に flush される
      • timekey: 1h
      • timekey_wait: 10m

v0.12 と v0.14 でのパラメータ差異には要注意!

バージョン間でのパラメータが異なるので注意が必要
Updating plugin for v0.14 from v0.12 には目を通したようが良い

ググりまくった挙句「パラメータ効かないなと思ったら v0.12 のパラメータだった」を繰り返して地味にハマりました… (´・ω・`)

v0.14 では Buffer Plugin の設定は section 内での指定する形となります

compatibility-of-configurations.png 引用:Fluentd v0.14 Plugin API Details

今回の説明に出てきたパラメータでいうとこのような対応になってる

v0.12 v0.14
buffer_chunk_limit chunk_limit_size
time_slice_format(少し意味合い違うかもだけど) timekey
time_slice_wait timekey_wait

さいごに

恥ずかしながら fluentd を最近触りはじめた勢なので細かな仕様を理解出来てませんが、めちゃくちゃ便利で感動したので今後も仲良くしていきたいなと思いました。 細々と contribute していくぞ (๑•̀ㅂ•́)و✧

参考資料

困ったときの公式ドキュメント