fluentd

メモ:fluent-plugin-kinesisとバッファまわりの設定

概要

fluent-plugin-kinesisを使っているが、バッファまわりの設定が気になって調べた。

fluent-plugin-kinesisに限定しない話が多い。

メモなのでバラバラ書いていく。

メモ

Fluentdのアーキテクチャ(バッファ)

https://docs.fluentd.org/v0.12/articles/buffer-plugin-overview

チャンク、バッファ、キューの概念を抑えておく。

設定値について

https://tagomoris.hatenablog.com/entry/20130123/1358929254

fluent-plugin-kinesis

https://github.com/awslabs/aws-fluent-plugin-kinesis/blob/master/README.md

スループットを上げるための設定が上記のREADMEに書いてある。

  flush_interval 1
  chunk_limit_size 1m
  flush_thread_interval 0.1
  flush_thread_burst_interval 0.01
  flush_thread_count 15

前のバージョンのFluentdではこう。

  flush_interval 1
  buffer_chunk_limit 1m
  try_flush_interval 0.1
  queued_chunk_flush_interval 0.01
  num_threads 15

バッファとしてのメモリとファイル

Fluentdのデフォルトはメモリだが、ファイルに変更することもできる。fluent-kinesis-pluginは、BufferedOutputを継承しているため。

https://github.com/awslabs/aws-fluent-plugin-kinesis/blob/master/lib/fluent/plugin/kinesis.rb

ファイルを使うようにするには、<match foo.bar></match>の中に、下記を入れる。

  buffer_type file
  buffer_path /path/to/buffer

バッファのサイズ

buffer_chunk_limit × buffer_queue_limit で計算できる。
たとえば、buffer_chunk_limitが2MBでbuffer_queue_limitが100ならば、200MBまでバッファに入れておける。

バッファタイプをファイルにした場合、指定したパスに2MBのファイルが100個できているはず。

よくわからなかった点

バッファの総量を超えるデータを流し込んだときに、データがどうなっているのか。(失われてしまう?)

実験としてバッファのサイズを大きく超えるデータを流し込んだ結果、ファイルとして作成されたバッファの数・サイズは変わらず、メモリ使用量にも変化がなかった。

そして、バッファに溜まったデータが少しずつ捌けていくと、新しくバッファのファイルが作成されていた。(この傾向は30分以上続いていた)

下記のワーニングは継続している出ている状態。

2018-05-07 15:24:24 +0000 [warn]: emit transaction failed: error_class=Fluent::BufferQueueLimitError error="queue size exceeds limit" tag="test"

このログの意味は下記。

fluentdのバッファはキューが全部埋まってデータをもう入れられない場合,Inputプラグイン側にBufferQueueLimitErrorを返します.
https://qiita.com/repeatedly/items/11f8f2eefc4ae1eea2f9

inputはin_tailを使っていたが、たしかに、長い時間がたっても読み込みは完了していない様子だった。

outputがこの例外をinput側に渡すことで、読み込み速度を調整しているのかもしれない。

参考

https://tagomoris.hatenablog.com/entry/20120731/1343707793