로그를 분석하기 위해 Fluentd, Kafka, ELK(Elastic Search, Logstash, Kibana)를

연동하여 사용하고 있는데 특정 토픽의 로그가 지연되고 있었다.

처음엔 Logstash에서 Elastic Search로 전송하여 인덱싱하는 게 느린 것으로

판단하여 Elastic Search의 설정을 다음과 같이 바꿨다.

refresh_interval: -1
number_of_replicas: 0

처음엔 되는 듯 싶었지만 여전히 로그가 지연되고 있어 혹시 Kafka에 제대로 들어오고 있는지를

확인해보니 최근 메시지가 한참 이전의 메시지였다.

그리고 Fluentd에서 Kafka로 전송하기 전에 버퍼 파일에 메시지를 쌓도록 돼있는데

아직 전송되지 않은 메시지들이 파일들에 남아있었다.

그래서 Fluentd의 로그를 살펴보니 다음과 같았다.

buffer flush took longer time than slow_flush_log_threshold: elapsed_time=329.28148816525936 slow_flush_log_threshold=20.0 plugin_id="object:3ff42b981278"

버퍼를 비우는 시간이 설정된 시간보다 오래 걸려서 생긴 문제였다.

다음과 같이 Fluentd의 설정을 변경하여 버퍼 파일을 작게 하고 비우는 시간을 1초에서 5분으로 늘렸다.

buffer_queue_limit 16
buffer_chunk_limit 4m
flush_interval 5m
num_threads 4
slow_flush_log_threshold 60.0

위와 같이 설정한 후로 기존에 쌓인 로그를 모두 Kafka로 전송할 수 있었고 로그가 지연되는 현상도 해결할 수 있었다.

참고 문헌

  1. https://m.blog.naver.com/PostView.nhn?blogId=inho1213&logNo=220774551220&proxyReferer=https%3A%2F%2Fwww.google.com%2F
  2. https://docs.fluentd.org/v/0.12/output/kafka