[Kafka] Kafka Lag exporter를 이용한 Kafka Consumer Lag 모니터링

tedigom·2021년 11월 9일
2
post-thumbnail
post-custom-banner

배경

Kafka를 운영하며 중점적으로 확인해야 하는 지표 중 하나는 바로 Consumer Lag 입니다. 우선, Consumer lag이 무엇인지 간단하게 살펴보도록 하죠

Consumer Lag이란?

Kafka에서 Producer는 토픽의 파티션에 메세지를 넣고, 파티션 내에서는 데이터가 들어오는 순서대로 offset이라는 숫자를 붙입니다. Partition이 한개인 토픽에 메세지가 들어온다면 아래와 그림과 같이 offset이 붙게 됩니다.(0,1,2,3,4...)

Consumer에서 메세지를 처리하는 속도가 Producer에서 메세지를 전송하는 속도보다 늦어지면 Producer가 넣은 메세지의 Offset과 Consumer가 가져간 메세지의 Offset간의 차이가 발생하게 되는데, 이를 Consumer lag이라 부릅니다.

Consumer Lag은 Consumer group 별로 측정되어야 하며, Lag 값의 절대값 자체는 모니터링에 크게 의미가 없지만, 시간이 흐름에 따라 Lag이 어떤 양상을 보이는지를 주의깊게 보아야 합니다. ( 줄어드는지, 서서히 증가하는지, 급격히 증각하는지 등등)
결국 이것이 카프카와 연결된 컨슈머 서비스와 전체 데이터 흐름에 영향을 주기 때문입니다.

카프카의 Consumer Lag를 모니터링 할수 있는 대표적인 도구로 주로 Burrow를 활용하는 방법을 많이 소개하지만, 이번에 저는 LightBend사의 Kafka Lag Exporter를 이야기해볼까 합니다.

Kafka Lag Exporter

Kafka Lag Exporter는 다른 Lag 모니터링 프로젝트와 비교해볼 때 몇가지 차별점이 있습니다.

1. 프로메테우스 Exporter 기반의 프로젝트

Kafka Lag "Exporter"는 이름에서 부터 알 수 있듯이 Prometheus Exporter 기반의 프로젝트입니다. Exporter는 간단하게 말해 모니터링 대상의 Metric 데이터를 수집하고 Promethues가 접속했을 때 정보를 알려주는 역할을 합니다. 대표적으로 호스트 서버의 CPU, Memory, Disk 정보등을 수집하는 node-exporter나 nginx의 데이터를 수집하는 nginx-exporter 등 외에도 여러 솔루션/어플리케이션을 metric 기반 모니터링의 표준으로 자리잡고있는 Prometheus로 모니터링하기 위해 많은 Exporter 프로젝트들이 만들어지고 있습니다.

Kafka Lag Exporter는 Consumer group 정보를 얻기위해 주기적으로 Kafka 브로커를 폴링하고, 이를 Prometheus에서 참조할 수 있도록 Exporter 형식으로 데이터를 노출시킵니다. Kafka 모니터링을 위해 프로메테우스를 사용하고 있는 환경이라면 Kafka Lag Exporter를 어렵지 않게 추가할 수 있습니다.

Kafka Lag Exporter에서 지원하는 메트릭은 아래와 같습니다.

kafka_consumer_group_offset : 해당 consumer group의 토픽 파티션에서 consumer가 마지막으로 consume한 offset 값
kafka_consumergroup_group_lag : 해당 consumer group의 토픽 파티션에 대한 lag 값 (마지막으로 produced 된 offset과 마지막으로 consumed 된 offset의 차이값)
kafka_consumergroup_group_lag_seconds : offset의 지연과 관련 있으며, 예상 지연시간(latency) 값
kafka_consumergroup_group_max_lag : 해당 consumer group의 가장 높은 lag 값 ( consumer group이 여러 토픽의 파티션을 바라보고 있는 경우, 그 중 가장 높은 lag 값을 표시합니다.)
kafka_consumergroup_max_lag_seconds : 해당 consumer group의 가장 높은 예상 지연시간 값
kafka_partition_latest_offset : 토픽 파티션에서의 사용가능한 가장 마지막 offset 값

2. Consumer group의 시간 지연(Latency) 추정 기능

Kafka Lag Exporter는 크게 단순히 Consumer Group 별 Lag이 얼마나 있는지를 알려주는 것과 더불어 message 전송에 대한 예상 지연 시간(Latency)를 보여주는 기능도 있습니다.

Producer-Consumer 간 메세지 전송 Latency를 측정하기 위해서 일반적으로는 양 끝단(Producer/Consumer) application에 모니터링 에이전트 등을 통해 정보를 수집하는 방법을 채택합니다. 대표적으로 Confluent 사의 Kafka Monitoring Interceptor를 예로 들 수 있습니다.

https://docs.confluent.io/platform/current/control-center/installation/clients.html

이와 같이 각 Producer 와 Consumer에 모니터링 에이전트/모듈을 심어 모니터링하는 방법은 서비스 환경에 따라 도입이 부담스러울 수 있습니다. Kafka를 사용하는 모든 application에 대해 적용되어야하기 때문입니다.

Kafka Lag Exporter는 주기적으로 KafkaConsumer endOffset API를 사용하여 메타데이터를 수집합니다. 수집한 데이터로 Consumer group의 시간 지연을 추정하는 방법을 설명해보도록 하겠습니다.

왼쪽 표에서는 Kafka Lag Exporter가 3초 주기로 last produced offset과 last consumed offset을 수집한다고 가정해 보았습니다. 해당 표는 오른쪽 그림과 같은 그래프 형태로 표로 나타낼 수 있는데요,

y축의 Offset 값 25를 기준으로 해당 offset이 produced된 시간은 00:06초 이고, 해당 offset이 consumed된 시간은 00:12초 입니다. 그리고 이 두 timestamp 값의 차이를 우리는 pub-sub 간 지연 속도(Latency)라 볼 수 있습니다.

y 축의 Offset 값 30을 기준으로 볼때, 해당 offset이 consumed된 시간은 00:15초로 수집한 데이터를 통해 확인할 수 있지만, 해당 offset이 produced된 시간은 정확하게 알순 없습니다. 다만, 00:06초 ~ 00:09초 사이 어딘가에서 Produced 된것을 알 수 있습니다.

Kafka Lag Exporter는 Linear interpolation(선형보간법)이라는 방법을 통해 해당 point를 예측하여 예상 latency 값을 계산하게 됩니다. Linear interpolation(선형보간법)에 대한 설명은 아래 링크에서 잘 설명해 주고 있으니 참고하시기 바랍니다.

https://spiralmoon.tistory.com/entry/Algorithm-%EC%84%A0%ED%98%95-%EB%B3%B4%EA%B0%84%EB%B2%95-Linear-interpolation

기타

아래 그림들은 Lag Exporter를 통해 Prometheus로 수집된 데이터를 Grafana로 나타낸 예시입니다.

  1. Max consumer group time lag over offset lag

  2. Max Consumer Group Time Lag Over Summed Offsets

아래 github 주소를 통해 Kafka Lag Exporter에 대해 더 많은 정보를 확인할 수 있습니다.

https://github.com/lightbend/kafka-lag-exporter

<참조>
Kafka Lag Exporter : https://www.lightbend.com/blog/monitor-kafka-consumer-group-latency-with-kafka-lag-exporter
Kafka Consumer API : https://kafka.apache.org/25/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html
Prometheus : https://blog.outsider.ne.kr/1254#recentComments

profile
아키텍처(Infra / SW), 클라우드, 모바일에 관심이 많습니다. 쉬운말로 쓰려 노력합니다
post-custom-banner

0개의 댓글