fluentdのBufferedOutputについて理解が浅かった。。
fluentdでアプリケーションサーバーからのログを集約するAggregatorノードの設定をメモリ容量をもとに見直していたところ,出力先に何らかの障害が発生し出力不可になった場合,Aggregatorノード上のfluentdが再送上限回数に到達する前に物理メモリを食い潰し詰まってしまいそうだった。
BufferedOuput
を継承するクラス(ObjectBufferedOutput
やTimeSlicedOutput
はこのクラスを継承している)は,出力先に何らかの障害が発生し,転送不可になった場合でも,データをバッファリングすることで極力データをロストしないような仕組みになっており,BufferedOutput
クラスは以下のような動作をする。以下,備忘録を兼ねて記載しておく(間違ってたらごめんなさい。v0.10.39より)
- 出力に失敗し,失敗回数が
retry_limit
より小さい場合,BufferedOutput#calc_retry_wait
で計算される時間後までwaitする。 secondary
が設定されていないかつ出力に失敗した場合,失敗回数がretry_limit
に達すると,キューに溜まったチャンクは破棄され,失敗履歴もクリアされる。secondary
が設定されているかつ出力に失敗した場合,失敗回数がretry_limit
に達すると,即座にretryされ(BefferedOutput#try_flush
のbegin…end),next_rety_time
後にsecondary
へflushされる。secondary
への出力にも失敗しsecondary_limit
を超えると,キューに溜まったチャンクは破棄され,失敗履歴もクリアされる。- キュー内のチャンク数が
buffer_queue_limit
に達していて,新たにキューにチャンクを追加しようとするとBufferQueueLimitError
が投げられ新たなチャンクは拒否される。 - キュー内のチャンク数が
buffer_queue_limit
以下で,”現在のチャンクのサイズ+emitされるデータのサイズ”がbuffer_chunk_limit
を超えた場合,新しいチャンクが生成される。 - リトライに成功した場合で,キュー内に複数のチャンクが蓄積されていた場合は,
queued_chunk_flush_interval
の間隔でflushされる。
secondary
の指定は,ドキュメントではforward
でout_file
を指定する例が紹介されているけれど,参考リンクでも言及されているように,なんでも指定可能なようである。ただし,secondary
を指定した場合,primaryとクラスが異なるとconfigtestやfluentdの起動時に警告が表示される(Output#secondary_init
)。しかし,out_file
ではsecondary_init
がオーバーライドされており,具体的な処理は定義されていないため警告は表示されない。
僕の場合は,お世話になっているout_file
と互換のfile_alternativeプラグインをsecondary
に設定したが,out_file
のようにsecondary_init
がオーバーライドされていないため警告が表示されてしまう(組み込みのOutputプラグインでないため,あえてそのようになっているものだと勝手に推測している。。)。しかし,少し様子を見てみるが,処理自体は正常に動作しているようだった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<match parsed.apache.access> type webhdfs host hadoop port 50070 path /log/access/access.log.%Y%m%d_%H output_include_time true output_include_tag false output_data_type attr:host,user,method,path,code,size,referer,agent flush_interval 120s retry_limit 13 <secondary> type file_alternative path /data/fluentd/failed/access.log.%Y%m%d_%H flush_interval 120s output_include_time true output_include_tag false </secondary> </match> |
この設定では,失敗回数が13回に達し,次のリトライ時間(約2時間強くらい?)になった時に即座にsecondary
へflushされる。
正しく扱えるようになるには,やはり細部を知る必要があると改めて実感。
参考
- http://docs.fluentd.org/ja/articles/buffer-plugin-overview
- http://d.hatena.ne.jp/tagomoris/20130123/1358929254
- http://kazegusuri.hateblo.jp/entry/2013/09/28/202504
- http://documents.mazgi.com/fluentd/doc/plugin.html
コメント