Kafka 컨슈머 그룹과 파티션 리밸런싱 전략 이해하기
Kafka에서 컨슈머 그룹의 구성이 변경될 때마다 파티션 리밸런싱이 발생한다. 이 과정은 컨슈머가 그룹에 합류하거나 떠날 때, 또는 관리자가 토픽에 새 파티션을 추가할 때 발생하는 중요한 메커니즘이다. 리밸런싱을 효율적으로 관리하는 것은 Kafka 시스템의 안정성과 성능에 큰 영향을 미친다.
리밸런싱이란?

리밸런싱은 Kafka 컨슈머 그룹 아키텍처의 기본 개념으로, 컨슈머 그룹 내에서 파티션을 재분배하는 과정이다. 이는 컨슈머가 그룹에 합류하거나 떠날 때, 또는 토픽에 새 파티션이 추가될 때 발생한다.
리밸런싱이 발생하면 Kafka는 파티션을 컨슈머 간에 재분배하여 각 컨슈머가 대략적으로 동일한 수의 파티션을 처리하도록 한다. 이를 통해 데이터 처리가 컨슈머 간에 균등하게 분산되고 각 컨슈머가 최대한 효율적으로 데이터를 처리할 수 있다.
리밸런싱 유형
1. 적극적 리밸런싱(Eager Rebalancing)

적극적 리밸런싱은 전통적인 리밸런싱 방식으로, 다음과 같은 특징이 있다:
- 리밸런싱이 발생하면 모든 컨슈머가 데이터 수신을 중단하고 파티션 소유권을 포기한다.
- 이를 "Stop the World" 이벤트라고 부른다.
- 모든 컨슈머가 그룹에 다시 합류하여 새로운 파티션 할당을 받는다.
- 컨슈머가 이전에 처리하던 파티션으로 돌아갈 보장이 없다.
- Range, RoundRobin, Sticky 할당 전략이 이 유형에 속한다.
2. 협력적 리밸런싱(Cooperative Rebalancing)

협력적 리밸런싱은 Kafka 2.4에서 도입된 개선된 방식으로, 다음과 같은 특징이 있다:
- 리밸런싱이 필요한 특정 파티션에만 영향을 주며, 그 외의 파티션들은 그대로 유지된다.
- 개별 컨슈머의 작업 중단을 최소화한다.
- 리밸런싱을 작은 하위 작업으로 분할하고, 이러한 하위 작업이 완료되는 동안 컨슈머는 계속 데이터를 소비한다.
- "Stop the World" 이벤트를 방지하여 데이터 처리의 지연과 중단을 최소화한다.
- CooperativeStickyAssignor가 이 유형에 속한다.
파티션 할당 전략
Kafka는 여러 파티션 할당 전략을 제공하며, 각 전략은 리밸런싱 중에 파티션을 컨슈머에게 할당하는 방식을 결정한다.
1. RangeAssignor
- 기본 파티션 할당 전략(과거)
- 토픽별로 작동하며, 각 토픽에 대해 사용 가능한 파티션을 숫자 순서로 배치하고 컨슈머를 사전 순서로 배치한다.
- 파티션 수를 컨슈머 수로 나누어 각 컨슈머에게 할당할 파티션 수를 결정한다.
- 균등하게 나누어지지 않으면 처음 몇 개의 컨슈머에게 추가 파티션이 할당된다.
- 토픽별로 배분하기 때문에 균형을 맞추기 어려울 수 있다.
2. RoundRobinAssignor
- 모든 파티션을 컨슈머에게 라운드 로빈 방식으로 할당한다.
- 모든 컨슈머의 구독이 동일한 경우 파티션이 균등하게 분배된다.
- 컨슈머 간 구독이 다를 경우 불균형한 할당이 발생할 수 있다.
- 리밸런싱 시 파티션 이동을 최소화할 수 없다.
3. StickyAssignor
- 가능한 한 균형 잡힌 할당을 보장한다.
- 재할당 시 기존 할당을 최대한 유지하려고 한다.
- 우선순위: 1. 균등 분배 2. 기존 할당 유지
- 적극적 리밸런싱 프로토콜을 사용한다.
4. CooperativeStickyAssignor
- StickyAssignor와 동일한 할당 로직을 따르지만 협력적 리밸런싱 프로토콜을 사용한다.
- 리밸런싱 중에도 컨슈머가 계속해서 데이터를 처리할 수 있게 한다.
- Kafka 2.4에서 도입되었으며 2.5에서 안정화되었다.
- 현재 Kafka 3.0의 기본 할당자 목록 중 하나다(RangeAssignor와 함께).
정적 그룹 멤버십(Static Group Membership)
정적 그룹 멤버십은 컨슈머 그룹 내에서 컨슈머의 ID를 유지하는 방법이다:

- 컨슈머 구성에
group.instance.id를 설정하여 활성화

- 컨슈머가 일시적으로 그룹을 떠났다가 돌아올 때 리밸런싱을 방지

- 컨슈머가 세션 타임아웃 내에 다시 합류하면 이전 파티션이 자동으로 재할당
- 로컬 캐시와 상태를 유지해야 하는 컨슈머에게 특히 유용
- 쿠버네티스와 같은 환경에서 컨슈머 재시작 시 유용
- 하나의 컨슈머 그룹 내에서 각 컨슈머는 고유한
group.instance.id를 가져야 함
리밸런싱 트리거 요인
리밸런싱은 다음과 같은 상황에서 발생할 수 있다:
- 컨슈머 합류 또는 이탈: 새 컨슈머가 그룹에 합류하거나 기존 컨슈머가 그룹을 떠날 때 리밸런싱이 발생한다.
- 일시적인 컨슈머 장애: 컨슈머가 일시적인 장애나 네트워크 중단을 경험하면 Kafka는 이를 실패한 컨슈머로 간주하고 그룹에서 제거할 수 있다.
- 컨슈머가 너무 오래 유휴 상태: 컨슈머가 너무 오래 유휴 상태로 있으면 Kafka는 이를 실패한 컨슈머로 간주하고 그룹에서 제거할 수 있다.
- 토픽 파티션 추가: 토픽에 새 파티션이 추가되면 Kafka는 리밸런싱을 시작하여 새 파티션을 그룹의 컨슈머 간에 분배한다.
파티션 할당 전략 비교
리밸런싱 방식
| 리밸런싱 방식 | 설명 | 영향 범위 | 적용 전략 |
|---|
| 적극적 리밸런싱(EAGER) | 리밸런싱 발생 시 모든 컨슈머가 데이터 수신을 중단하고 파티션의 소유권을 포기 | 전체 컨슈머 그룹 | Range, RoundRobin, Sticky |
| 협력적 리밸런싱(COOPERATIVE) | 리밸런싱이 필요한 특정 파티션에만 영향을 주며, 그 외의 파티션들은 그대로 유지. 개별 컨슈머의 작업 중단을 최소화 | 특정 파티션 | CooperativeSticky |
파티션 할당 전략
| 파티션 할당 전략 | 설명 | Rebalancing Protocol |
|---|
| Range Partition 할당 전략 | Topic 별로 동일한 Partition을 특정 Consumer에게 할당하는 방식 | EAGER |
| Round Robin Partition 할당 전략 | 사용 가능한 Partition과 Consumer를 순차적으로 할당 | EAGER |
| Sticky Partition 할당 전략 | Consumer가 구독 중인 Partition을 계속 유지하게 끔 할당 | EAGER |
| Cooperative Sticky Partition 할당 전략 | Sticky와 유사하지만, 전체 Rebalancing이 아닌 필요한 Partition끼리 점진적으로 Rebalancing 하는 방식 | COOPERATIVE |
결론
Kafka의 리밸런싱 전략은 시스템의 안정성과 성능에 큰 영향을 미친다. 최신 버전의 Kafka에서는 협력적 리밸런싱과 정적 그룹 멤버십을 통해 리밸런싱으로 인한 중단을 최소화하고 시스템의 안정성을 향상시킬 수 있다. 특히 CooperativeStickyAssignor는 대부분의 사용 사례에서 최적의 선택이 될 수 있으며, 로컬 상태를 유지해야 하는 애플리케이션의 경우 정적 그룹 멤버십을 고려해볼 만하다.
Kafka Connect와 Kafka Streams는 이미 협력적 리밸런싱을 기본값으로 사용하고 있으며, Kafka 3.0부터는 일반 컨슈머에서도 RangeAssignor와 CooperativeStickyAssignor가 기본 할당자 목록으로 제공된다.