Kafka consumer group에서 rebalance가 너무 자주 일어나면 겉으로는 lag 증가, idle consumer, 작업이 계속 흔들리는 증상으로 보이기 쉽습니다. 하지만 많은 경우 Kafka 자체가 불안정한 것이 아니라 flapping runtime, delayed poll, deployment churn에 Kafka가 정상적으로 반응하고 있는 것입니다.
핵심은 먼저 membership이 실제로 흔들리는지 확인하고, 그다음 runtime instability, missed poll deadline, assignment나 protocol 문제를 분리해서 보는 것입니다. heartbeat 계열 설정을 먼저 만지기 전에 이 분기를 해야 합니다.
frequent rebalancing은 보통 무엇을 뜻하나
실무적으로 보면 frequent rebalancing은 group이 유효한 작업을 멈추고 assignment를 계속 다시 나누고 있다는 뜻입니다.
보통 아래 패턴 중 하나와 연결됩니다.
- consumer가 자꾸 restart됨
- consumer가 poll deadline을 놓침
- heartbeat와 session timing이 환경과 맞지 않음
- assignment 변경 비용이 workload에 비해 너무 큼
consumer가 실제로 안정적인지 먼저 보세요
설정을 바꾸기 전에 group 자체가 안정적인지 확인해야 합니다.
좋은 첫 질문은 아래입니다.
- consumer가 자주 restart되거나 redeploy되는가
- container가 부하 중에 reschedule되는가
- downstream timeout 때문에 member가 흔들리는가
- rollout 직후부터 rebalance가 시작됐는가
membership 자체가 불안정하다면 fix는 Kafka 바깥에 있을 가능성이 큽니다.
poll timing은 여전히 가장 먼저 볼 항목 중 하나입니다
Kafka consumer config 문서에서 max.poll.interval.ms는 poll() 호출 사이 최대 지연 시간입니다.
즉 프로세스가 살아 있어도 handler가 느리면 rebalance loop가 생길 수 있습니다.
흔한 흐름은 이렇습니다.
- 처리 속도가 느려진다
poll()이 너무 늦어진다- consumer가 실패한 것으로 간주된다
- group이 rebalance한다
- lag가 오르고 useful work가 멈춘다
group protocol과 assignment 전략은 생각보다 중요합니다
Kafka rebalance protocol 문서는 newer group behavior가 rebalance 시간을 줄이고 더 disruptive한 패턴을 피할 수 있다고 설명합니다.
많은 팀이 모든 rebalance를 Kafka 원래 동작으로 보지만, 실제로는 protocol이나 assignor choice가 disruption을 키우는 경우도 있습니다.
흔한 원인
1. consumer가 계속 restart됨
group이 흔들리는 이유가 Kafka보다 runtime 불안정성일 수 있습니다.
2. 처리 때문에 poll()이 너무 늦어짐
애플리케이션은 살아 있지만 Kafka 기준으로는 assignment를 유지하기에 너무 느립니다.
3. session과 heartbeat 기대치가 환경과 맞지 않음
network jitter, overloaded runtime, 좋지 않은 기본값이 group을 불안정하게 보이게 할 수 있습니다.
4. assignment churn 비용이 너무 큼
빈번한 변경이 반복적인 stop-and-resume 사이클로 이어집니다.
실전 점검 순서
1. membership이 실제로 flapping하는지 확인하세요
member가 실제로 바뀌지 않는데도 다른 증상을 rebalance churn으로 오해하고 있을 수 있습니다.
2. restart, deployment, rescheduling을 확인하세요
여기서 조사 방향이 훨씬 단순해지는 경우가 많습니다.
3. poll() timing과 handler latency를 보세요
많은 rebalance 문제는 Kafka 문제가 아니라 consumer-loop 문제가 Kafka 증상처럼 보이는 것입니다.
4. 어떤 group protocol과 assignment behavior를 쓰는지 확인하세요
팀이 기대하는 동작과 실제 동작이 다를 수 있습니다.
5. rebalance 빈도와 lag 증가, downstream slowdown을 비교하세요
Kafka가 불안정한 것인지, 불안정한 앱에 정상적으로 반응하는 것인지 구분할 수 있습니다.
바로 확인할 명령
kafka-consumer-groups.sh --bootstrap-server <broker:9092> --group <group> --describe
kafka-topics.sh --bootstrap-server <broker:9092> --describe --topic <topic>
grep -i rebalance <consumer-log-file>
이 명령으로 group membership, partition ownership, 로그 속 rebalance event 빈도를 같이 볼 수 있습니다.
초반 분기에 좋은 shortcut
group이 계속 rebalance할 때는 아래 중 무엇이 먼저 보이는지 보세요.
- member가 반복적으로 join과 leave를 한다
- handler가 느리고
poll()간격이 길다 - rollout이나 infrastructure churn이 같은 시점에 시작됐다
- assignment 변경 자체가 workload에 특히 큰 비용을 만든다
이 분기만으로도 heartbeat 설정부터 만지는 실수를 줄일 수 있습니다.
실전 관점
frequent rebalance는 근본 원인인 경우보다, 이미 불안정한 consumer loop나 deployment loop, runtime loop가 있다는 신호인 경우가 많습니다.
즉 rebalance knob만 만지면 group은 조용해질 수 있어도 실제로 건강해지는 것은 아닐 수 있습니다.
하나 더 던지면 좋은 질문
group이 계속 rebalance할 때는 “Kafka가 interruption을 만들고 있나, 아니면 이미 있는 interruption에 반응하고 있나?”를 같이 물어보세요.
이 질문으로 보통 아래를 빠르게 좁힐 수 있습니다.
- runtime churn
- slow handler와 delayed poll
- deployment나 infrastructure churn
이 관점이 heartbeat 계열 설정을 먼저 만지는 것보다 훨씬 실전적입니다.
FAQ
Q. rebalance가 자주 일어나면 항상 Kafka가 문제인가요?
아니요. consumer 애플리케이션이나 runtime이 불안정한 경우가 더 많습니다.
Q. 가장 빠른 첫 단계는 무엇인가요?
member restart와 missed poll deadline이 있는지 보는 것입니다.
Q. 다음으로 같이 보면 좋은 글은 무엇인가요?
보통 Kafka max.poll.interval.ms Troubleshooting이나 Kafka Consumer Lag Increasing입니다.
Q. 언제 heartbeat 계열 설정부터 만지는 걸 멈춰야 하나요?
restart churn이나 느린 handler가 rebalance를 만든다는 증거가 보이기 시작할 때입니다.
Read Next
- rebalance loop가 delayed poll과 이어진다면 Kafka max.poll.interval.ms Troubleshooting을 보세요.
- 주요 증상이 backlog라면 Kafka Consumer Lag Increasing을 보세요.
- assignment는 받았는데도 idle처럼 보이면 Kafka Messages Not Consumed를 보세요.
Related Posts
- Kafka max.poll.interval.ms Troubleshooting
- Kafka Consumer Lag Increasing
- Kafka Messages Not Consumed
Sources:
- https://kafka.apache.org/42/operations/consumer-rebalance-protocol/
- https://kafka.apache.org/42/configuration/consumer-configs/
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: Redis vs RabbitMQ vs Kafka 개발자를 위한 미들웨어 트러블슈팅 허브 글입니다. Redis, RabbitMQ, Kafka 중 어떤 증상부터 먼저 봐야 하는지와 어떤 문제 패턴이 각 시스템에 가까운지 정리합니다.
- Kubernetes CrashLoopBackOff: 먼저 볼 것들 startup failure, probe, config, resource limit 관점에서 CrashLoopBackOff를 어떻게 나눠서 봐야 하는지 정리한 가이드입니다.
- Kafka consumer lag가 계속 늘 때: 트러블슈팅 가이드 Kafka consumer lag가 계속 늘어날 때 무엇부터 봐야 하는지 정리합니다. poll 주기, 처리 속도, rebalance, consumer 설정까지 실전 기준으로 다룹니다.
- Docker container가 계속 재시작될 때: 먼저 확인할 것들 exit code, command failure, environment mistake, health check 관점에서 Docker restart loop를 푸는 실전 가이드입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.