Log/fluentd

05. Fluentd buffer plugins

우라릭 2022. 10. 8. 23:40

본 글은 https://docs.fluentd.org/을 번역/요약/정리/사견 추가한 글입니다.

1. 개요

Fluentd는 9가지 종류의 플러그인이 있습니다. 그 중 buffer 플러그인에 대해 살펴보겠습니다. Buffer plugin은 output plugin에 의해 사용되는 플러그인입니다.

버퍼는 본질적으로 chunk의 집합입니다. Chunk는 이벤트의 집합입니다. 각각의 chunk는 파일 혹은 메모리에 관리됩니다. Chunk는 화물 상자로 비유될 수 있습니다. Fluentd는 input source로부터 화물 상자에 이벤트를 차곡차곡 쌓습니다. 화물 상자가 가득차면 목적지로 배송됩니다.

내부적으로 버퍼는 2개의 분리된 공간으로 구분됩니다. "Stage"는 chunk가 채워지는 공간이며 "queue"는 chunk가 배송 전에 기다리는 곳입니다.

1.1. 재시도 동작 컨트롤하기

Chunk는 매우 다양한 이유로 목적지에 쓰여지지 못할 수 있습니다. 이런 실패에 멋찌게 대응하기 위해서 buffer 플러그인들은 내부적인 재시도 매커니즘을 가지고 있습니다.

 

매커니즘 중 하나는 exponential backoff 입니다. 처음 쓰기에 실패하면 1초, 그다음 실패하면 2초, 4초, 8초, . . .로 늘려 기다린 후, 다시 시도하는 매커니즘입니다.

0 1 3 7 15
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 중에서 랜덤하게 결정되고(설정으로 고정시킬 수도 있음) 대기 시간의 상한선을 정할 수도 있게 합니다. 

 

만약 최대 재시도 횟수를 초과하거나 첫 시도 이후로 정해놓은 시간(기본: 72h)이 초과한 경우 큐의 모든 chunk는 버려집니다. 이를 피하고 싶다면 retry_forever 옵션을 줘서 fluentd가 영원히 재시도하게 할 수 있습니다.

 

어떤 에러는 회복불가능합니다. 예를 들어 chunk 파일의 내용이 손상된 경우, 다시 파일을 쓰는 것 말고는 고칠 방도가 없습니다. 이럴 때, 그냥 무지성으로 재시도를 하는 건 상황을 더 악화시킬 뿐입니다. v.1.2.0부터 fluentd는 이런 상황에서 그러한 chunk를 secondary 혹은 backup 디렉토리로 보내버립니다. 

2. buffer_memory

buffer_memory는 chunk를 저장하기 위해 메모리를 사용합니다. Fluentd가 뻗었을 때, 버퍼에 있는 로그는 삭제됩니다.

<match pattern>
  <buffer>
    @type memory
  </buffer>
</match>

3. buffer_file

buffer_file은 디스크에 chunk를 씀으로써 영속적인 버퍼를 제공합니다.

<match pattern>
  ...
  <buffer>
    @type file
    path /var/log/fluent/buf
  </buffer>
</match>

4. buffer_file_single

buffer_file_single은 buffer_file과 비슷하지만 metadata 파일을 가지지 않는다고 합니다.

 

'Log > fluentd' 카테고리의 다른 글

07. Fluentd fomatter plugins  (0) 2022.10.09
06. Fluentd parser plugins  (0) 2022.10.09
04. Fluentd filter plugins  (0) 2022.10.08
03. Fluentd output plugins  (0) 2022.10.08
02. Fluentd input plugins  (0) 2022.10.08