概要
fluent-plugin-kinesisを使っているが、バッファまわりの設定が気になって調べた。
fluent-plugin-kinesisに限定しない話が多い。
メモなのでバラバラ書いていく。
メモ
Fluentdのアーキテクチャ(バッファ)
チャンク、バッファ、キューの概念を抑えておく。
設定値について
fluent-plugin-kinesis
スループットを上げるための設定が上記の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
を継承しているため。
ファイルを使うようにするには、<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側に渡すことで、読み込み速度を調整しているのかもしれない。