search
LoginSignup
7

More than 3 years have passed since last update.

posted at

[fluentd] buffer pluginの理解

buffer plugin 概要

公式の翻訳しながら理解を進める

buffer の構造

fluentd-v0.14-plugin-api-overview.png

 2018-04-27 17.31.05.png

buffer は Chunk の集合

Chunk は 1 つの blob に連結されたイベントの集合

それぞれの Chunk は file か memory で管理される

buffer は Chunk を 2 つの場所に分けて管理

  • stage と呼ばれる Chunk を入力ソース(Event)で埋めていく場所
  • queue と呼ばれる送信前のチャンクが待機している場所

新しく作成された全てのチャンクは
stage に入れられ、時間内に queue に移動される (その後転送される)

retry の振る舞い

受信側が何かしらのエラーで届けられなくなっても

送信側で障害を正常に処理するメカニズムが入っている

デフォルトでリトライの試行間隔を指数的に増やしていく
(最初の待機時間が 1 の場合の例)

1 2   4       8               16
x-x---x-------x---------------x-------------------------
│ │   │       │               └─  4th retry (wait = 8s)
│ │   │       └─────────────────  3th retry (wait = 4s)
│ │   └─────────────────────────  2th retry (wait = 2s)
│ └─────────────────────────────  1th retry (wait = 1s)
└───────────────────────────────  FAIL

fluentd は 上記アルゴリズムを調整している点がある

待機間隔の分散
計算された秒数に0.875 ~ 1.125をランダムにかける

retry_randomize を false にすれば無効になる

最大待機時間の設定
例えばretry_max_interval5sにした場合

上記の例で 8s 待つことはなくなる

そもそも指数関数的なリトライ処理をさせたくない場合は

retry_typeperiodicにする

リトライの終了判定(書き込み成功以外)

デフォルトで次の条件で再試行のループを抜ける

  • retry_max_timesに達した。(default: none なので 無制限)
  • 最初の再試行から経過した時間がretry_timeoutに達した(default: 72h)

これらのイベントが発生した場合、出力 queue 内の全てのチャンクは破棄されてしまう

破棄したくない場合は、retry_foreverを有効にする

参考

公式
https://docs.fluentd.org/v1.0/articles/buffer-plugin-overview

buffer option 詳細
https://docs.fluentd.org/v1.0/articles/buffer-section#retries-parameters

forward protocol v1
https://github.com/fluent/fluentd/wiki/Forward-Protocol-Specification-v1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7