fluentd

fluentd을 이용하여 s3로 로그전송시 전송지연 발생

iolle 2020. 5. 14. 20:18

fluentd가 flush하는 구조를 보면 다음 그림과 같이 buffer file에 tag값과 time 키값으로 chunk가 쌓이게 되고 flush_interval 에 설정된 시간이 지나거나 buffer_chunk_limit가 초과하게 되면 enqueue가 발생하게 됩니다. 

fluentd output flush 구조

buffer chunk가 flush되는 조건은 다음과 같습니다.

buffer chunk가 flush되는 조건

flush_interval 설정값에 의하여 조건이 바뀌게 됩니다.

flush_interval를 설정하였을 때의 조건

  • buffer chunk 사이즈가 chunk_limit_size * chunk_full_threshold 에 도달했을 경우
  • buffer chunk가 생성되고 나서 flush_interval에 지정된 시간이 경과하였을 경우 (chunk_limit_size * chunk_full_threshold 에 도달하지 않은 경우에도 이 시간이 경과하면 강제적으로 flush됩니다)

flush_interval를 설정하지 않았을 때의 조건

  • buffer chunk사이즈가 chunk_limit_size * chunk_full_threshold에 도달한 경우
  • timekey로 지정된 시간폭 + timekey_wait 로 지정된 시간을 경과한 경우
    • 다음과 같은 값이 설정되었다고 한다면 매시 9분 59초 ( 매시 59분 9초 + 10분 )에 flush 됩니다.
      • timekey: 1h
      • timekey_wait: 10m

 

fluentd(V 1.10.0)을 이용하여 애플리케이션 로그를 S3에 전송하도록 하였습니다.

td-agent.conf에서 flush간격을 flush_interval 을 60초로 설정하였습니다.

설정내용은 다음과 같이 했습니다.

<buffer tag,time>
    @type file
    path /var/log/td-agent/buffer/app
    flush_mode interval
    flush_interval 60s
    flush_at_shutdown true
</buffer>

운영을 하다보니 다음과 같은 warning 메세지(flush하는데에 시간이 초과되었습니다)가 기록되면서 s3에 전송되는 로그파일이 최대 12시간 정도후에 전송되는 일이 발생했습니다.

2020-05-07 21:31:22 +0900 [warn]: #0 buffer flush took longer time than slow_flush_log_threshold: elapsed_time=21.624852824024856 slow_flush_log_threshold=20.0 plugin_id="object:3fde83f49f4c" 

그리고 buffer의 output type를 file로 설정하여서 /var/log/td-agent/buffer/app/ 밑에 buffer file이 생성되는데 

buffer.b******************* 파일만 생성이 되고 60초가 지나도 buffer.q******************* 파일이 제대로 생성되지 않은 것을 알게 되었습니다. buffer.b******************* 파일이 2만개 정도 쌓이게 되었고 queue파일이 드문드문 생성되어 S3에 전송된다는 사실을 알게 되었습니다.

queue파일이 제대로 생성되지 않는 다는 원인에 기인하여 flush가 제대로 되고 있지 않는 것이었습니다. 그래서 공식document https://docs.fluentd.org/configuration/buffer-section를 찾아보게 되고 flush_thread_count가 default 한 개인 것을 알게 되어 flush thread를 좀 많게 하면 어떨까 하고 검증하게 되었습니다. 

flush_thread_count 설정값과 연동하여 queued_chunks_limit_size값이 셋팅되기 때문에 다른 값을 설정하려면 queued_chunks_limit_size도 설정해야 될 필요가 있습니다. 

・queued_chunks_limit_size [integer] (since v1.1.3)
    Default: 1 (equals to the same value as the flush_thread_count parameter)

 

그래서 td-agent.conf 다음과 같이 flush_thread_count를 4로 설정하여 테스트해 보았습니다.

<buffer tag,time>
    @type file
    path /var/log/td-agent/buffer/app
    flush_mode interval
    flush_interval 60s
    flush_at_shutdown true
    flush_thread_count 4
</buffer>

td-agent restart할 때엔 다음과 같이 하면 됩니다.

sudo service td-agent reload

reload함과 동시에 buffer.b******************* 파일buffer.q******************* 파일로 바뀌게 되고 2만개 정도의 buffer.q******************* 파일이 서서히 s3로 output되는 것을 볼 수가 있었습니다.

 

파일 변경 모니터링을 할 때에 watch command를 사용하면 모니터링을 할 수 있습니다.

watch -n 5 -d ls -l
반응형