fluentd을 이용하여 s3로 로그전송시 전송지연 발생
fluentd가 flush하는 구조를 보면 다음 그림과 같이 buffer file에 tag값과 time 키값으로 chunk가 쌓이게 되고 flush_interval 에 설정된 시간이 지나거나 buffer_chunk_limit가 초과하게 되면 enqueue가 발생하게 됩니다.
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
- 다음과 같은 값이 설정되었다고 한다면 매시 9분 59초 ( 매시 59분 9초 + 10분 )에 flush 됩니다.
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