[Kafka] Kafka Consumer 할당 전략 (Range, RoundRobin, Sticky)
Kafka에서 Consumer 할당 전략(consumer assignment strategy) 은 컨슈머 그룹 내의 각 컨슈머에게 파티션을 어떻게 할당할지 결정하는 방식입니다. 이는 Kafka 클러스터의 성능 최적화와 데이터 처리의 안정성에 중요한 영향을 미칩니다.
해당 글에서는 Range, RoundRobin, Sticky 세 가지 할당 전략의 특징과 사용 사례를 정리합니다.
1. Range 할당 전략
Range 할당 전략은 각 컨슈머에게 연속된 범위의 파티션을 할당합니다.
파티션과 컨슈머의 개수가 고르게 나눠지지 않는 경우, 불균형이 발생할 수 있다는 단점이 있습니다.
예시:
- 파티션 개수: 12
- 컨슈머 개수: 3
Range 전략으로 할당하면 결과는 다음과 같습니다:
- 컨슈머 1: 파티션 0, 1, 2, 3
- 컨슈머 2: 파티션 4, 5, 6, 7
- 컨슈머 3: 파티션 8, 9, 10, 11
이 경우, 모든 컨슈머가 동일한 수의 파티션을 받는 것처럼 보이지만,
특정 컨슈머가 더 많은 데이터를 처리해야 하는 상황이 생길 수 있습니다.
예를 들어 특정 파티션에 유독 많은 메시지가 있다면 이 전략에서는 해당 파티션을 할당받은 컨슈머에 과부하가 걸릴 가능성이 있습니다.
2. RoundRobin 할당 전략
RoundRobin 할당 전략은 파티션을 순서대로 돌아가며 각 컨슈머에게 고르게 분배합니다.
이를 통해 컨슈머 간 부하를 최대한 균등하게 유지할 수 있습니다.
예시:
- 파티션 개수: 12
- 컨슈머 개수: 3
RoundRobin 전략으로 할당하면 결과는 다음과 같습니다:
- 컨슈머 1: 파티션 0, 3, 6, 9
- 컨슈머 2: 파티션 1, 4, 7, 10
- 컨슈머 3: 파티션 2, 5, 8, 11
이 방식은 모든 컨슈머가 동일한 양의 파티션과 메시지 처리량을 가질 가능성을 높입니다.
하지만 컨슈머의 재할당 상황에서는 매번 모든 파티션이 새롭게 분배되기 때문에 Rebalancing으로 인한 성능 저하가 발생할 수 있습니다.
3. Sticky 할당 전략
Sticky 할당 전략은 이전 할당 상태를 최대한 유지하면서도, 각 컨슈머에게 파티션을 균등하게 분배하려는 방식입니다.
이는 특히 컨슈머의 리밸런싱 과정에서 효과적입니다. 기존 할당을 유지하기 때문에 재할당으로 인한 서비스 다운타임을 최소화할 수 있습니다.
예시:
- 초기 할당:
- 컨슈머 1: 파티션 0, 3, 6, 9
- 컨슈머 2: 파티션 1, 4, 7, 10
- 컨슈머 3: 파티션 2, 5, 8, 11
- 컨슈머 2가 나갔을 때:
- 컨슈머 1: 파티션 0, 3, 6, 9, 1, 4
- 컨슈머 3: 파티션 2, 5, 8, 11, 7, 10
이 전략은 기존에 연결된 컨슈머가 최소한의 변경만 겪도록 하여, Kafka 클러스터가 안정적으로 동작하게 합니다.
정리
- Range: 연속된 범위로 파티션을 할당하여, 불균형 발생 가능성이 있음.
- RoundRobin: 파티션을 순서대로 고르게 분배하여 균형 잡힌 부하 제공.
- Sticky: 기존 할당을 유지하며 고르게 분배, 재할당에 따른 성능 저하를 최소화.
제가 실제 운영하는 서비스에서는 초기에 Range 전략을 사용했었습니다.
하지만 파티션 개수가 12, 6, 2, 2인 경우와 같이 파티션 수가 컨슈머 수와 비대칭적인 상황에서 심각한 불균형 문제가 생겼고 이를 해결하기 위해 RoundRobin 전략으로 변경해 균형을 맞추었습니다.
그런데 이 서비스는 무조건 실운영되어야 하는 서비스라.. 재할당 과정에서의 서비스 다운타임이 문제가 됐고 결국 이를 해결하기 위해 Sticky 전략을 도입했습니다.