실시간 데이터 처리를 위해 널리 사용되는 Apache Kafka는 대용량 데이터를 효율적으로 처리할 수 있는 분산 메시징 시스템입니다. 그러나 시스템의 효율성을 유지하고 준실시간성을 보장하려면 지속적인 Metric 모니터링과 적절한 조치가 필요합니다. 특히 Consumer Lag은 시스템의 성능과 실시간성을 직접적으로 나타내는 중요한 지표입니다.
이번 글에서는 Kafka의 주요 Metric인 Consumer Lag에 대해 자세히 알아보고, Lag 관리의 핵심인 파티션과 컨슈머의 1:1 매핑에 대해 설명하겠습니다. 또한, Kafka Lag이 증가했을 때 Concurrent Consume을 도입하여 어떻게 개선했는지 공유하고자 합니다.
Consumer Lag은 Kafka에서 Consumer가 Producer로부터 받아야 할 메시지 중 아직 처리되지 않은 메시지의 수를 나타냅니다. 이는 특정 파티션의 최신 오프셋(latest offset)과 Consumer의 현재 오프셋(current offset) 간의 차이로 계산됩니다.
Lag는 다음과 같이 계산됩니다:
Consumer Lag = Latest Offset - Current Offset
Consumer Lag (Lag Latency)
Lag Sum Offset
Prometheus & Grafana
consumer lag 관련 모니터링
Kafka에서 파티션과 Consumer는 1:1 매핑이 될 때 최적의 성능을 발휘합니다.
따라서, Consumer 수가 파티션 수보다 많을 경우 일부 Consumer는 할 일이 없게 되어 리소스 낭비가 발생합니다. 반대로, 파티션 수가 많고 Consumer 수가 적을 경우 각 Consumer에 부하가 증가합니다. 최적의 성능을 위해 파티션과 Consumer의 수를 동일하게 맞추는 것이 중요합니다.
파티션 수 증가
Consumer 인스턴스 조정
(가상의 시나리오입니다.)
운영 중인 Kafka 시스템에서 Lag Sum Offset이 지속적으로 증가하는 현상을 발견했습니다. 이에 따라 메시지 처리 지연이 발생하고, 시스템의 준실시간성이 저하되었습니다.
Consumer 수와 파티션 수의 불균형
Consumer 처리 속도 한계
파티션 수 증가
Concurrent Consume 구현
파티션 수 증가 및 Consumer 수와의 매핑 조정
kafka-topics.sh
스크립트를 사용하여 파티션 수를 증가시켰습니다.멀티스레드 Consumer 적용
파티션 재분배 확인
Lag Sum Offset 감소
파티션 수 증가와 Consumer의 효율적 활용으로 메시지 소비 속도가 향상되어 Lag이 감소했습니다.
Lag Latency 개선
메시지 처리 지연이 해소되어 준실시간성이 회복되었습니다.
Kafka 시스템에서 Consumer Lag는 실시간성을 판단하는 중요한 지표입니다.
그런데 사람이 계속 모니터링할 수는 없잖아요?
그래서 Lag가 특정 임계치를 넘으면 자동으로 알림이 오도록 설정하면 문제를 빠르게 대응할 수 있어요.
우리 팀에서는 Lag가 20분을 넘으면 알림이 오도록 설정했어요.
이 값은 시스템의 특성과 요구 사항에 따라 달라질 수 있어요.
실시간성이 중요하다면 더 짧은 시간으로 설정하고, 약간의 지연이 허용된다면 길게 잡을 수도 있어요.
Kafka의 준실시간성을 유지하기 위해서는 Consumer Lag을 지속적으로 모니터링하고 관리해야 합니다. 특히 파티션과 Consumer의 1:1 매핑은 Lag 관리의 핵심 전략 중 하나입니다. 이를 통해 병렬 처리를 극대화하고 부하를 고르게 분산시켜 시스템의 효율성을 높일 수 있습니다.
Lag이 증가하는 문제가 발생한다면, 파티션 수를 조정하고 Concurrent Consume과 같은 방법을 도입하여 처리 성능을 개선할 수 있습니다. 또한, 파티션 수와 Consumer 수를 적절히 조정하여 Lag를 효과적으로 관리하시길 바랍니다.