Kafka에서 리밸런싱이란 컨슈머 그룹 내 컨슈머들의 파티션 할당이 변경되는 과정을 의미하며, 주로 다음과 같은 4가지 상황에서 발생한다.
- 1) 컨슈머 그룹에 새로운 컨슈머 추가
- 2) 기존 컨슈머가 컨슈머 그룹에서 제거
- 3) 구독중인 토픽에 새로운 파티션 추가
- 4) 컨슈머가 구독하는 토픽 변경
리밸런싱은 주로 애플리케이션 배포 시 발생하는데, 이와 관련하여 Kafka 리밸런싱 방식과 파티션 할당 전략에 대해 알아보자.
리밸런싱 방식
리밸런싱은 ‘적극적 리밸런싱’과 ‘협력적 리밸런싱’ 두 가지 방식으로 나뉘어진다.
적극적 리밸런싱(Eager Rebalance)
적극적 리밸런싱은 리밸런싱이 발생할 때 모든 컨슈머가 브로커로부터 메시지 소비를 중단하고, 기존 할당된 파티션들을 재분배하는 방식이다.
- 1) Detection 단계: 새로운 컨슈머(consumer3)가 그룹에 합류한다.(트리거)
- 2) Stopping 단계: 해당 컨슈머 그룹내 모든 컨슈머에게 할당된 모든 파티션을 제거한다.(downtime 발생)
- 3) Restart 단계: 모든 컨슈머들의 파티션 무작위 재할당 후 메시지 소비 재개한다.
해당 방식은 컨슈머들이 이전에 할당되었던 파티션을 반드시 다시 받는다는 보장이 없다. 즉, 리밸런싱 후에는 기존 컨슈머들이 새로운 파티션을 할당받을 가능성이 있다.
또한, Stopping 단계에서 모든 컨슈머의 메시지 소비가 중단되기에 Stop the world 현상이 발생한다. 이로 인해 컨슈머 메시지 처리 성능에 일시적인 영향을 미칠 수 있으며, 프로듀서에는 영향이 없기에 컨슈머 Lag이 증가할 수 있다.
협력적 리밸런싱(Cooperative Rebalance)
Kafka v2.4부터 도입된 진보된 리밸런싱 방식으로, 컨슈머 그룹의 메시지 소비 중단 없이 파티션 재분배가 일어난다. 기존에 할당된 파티션을 새로 합류한 컨슈머에게 양도하는 방식으로 동작한다.
- 1) Detection 단계: 새로운 컨슈머(consumer3)가 그룹에 합류한다.(트리거)
- 2) First Rebalance 단계: 컨슈머 그룹의 리더는 현재 컨슈머가 소유한 파티션 정보를 활용해 제외할 파티션 정보를 담은 새로운 파티션 할당 정보를 컨슈머 그룹 멤버들에게 전달한다. 새로운 파티션 할당 정보를 받은 컨슈머 그룹 멤버들은 필요없는 파티션을 골라 제외한다. 이전 파티션 할당 정보와 새로운 파티션 할당 정보가 동일한 파티션들에 대해서는 중단 없이 메시지 소비가 가능하게 된다.
- 3) Second Rebalance 단계: 제외한 파티션 할당을 위해 컨슈머들은 다시 합류 요청을 전송한다. 이 때 두 번재 리밸런싱이 트리거 되고, 컨슈머 그룹의 리더는 제외된 파티션을 새로 합류한 컨슈머에게 할당한다.
해당 방식의 핵심 포인트는 두 가지다.
- 컨슈머의 downtime이 발생하지 않는 점
- 파티션 할당이 안정적인 상태가 될 때 까지 몇 번의 반복이 필요할 수 있다는 점
이를 통해, 전체 컨슈머의 메시지 소비 중단 없는 리밸런싱할 수 있는 장점을 얻을 수 있다.
파티션 할당 전략
파티션 할당 전략(Partition Assignment Strategy)은 컨슈머가 토픽의 어떤 파티션을 소비할 것인지 결정하는 방식을 뜻한다.
이 전략에 따라 컨슈머와 파티션 간의 매핑이 이뤄지며, 데이터 처리 효율성과 성능에 큰 영향을 미친다.
파티션 할당 전략은 총 4가지가 존재한다.
- 1) 레인지 파티션 할당 전략(EAGER)
- 2) 라운드 로빈 파티션 할당 전략(EAGER)
- 3) 스티키 파티션 할당 전략(EAGER)
- 4) 협력적 스티키 파티션 할당 전략(COOPERATIVE)
1. 레인지 파티션 할당 전략(EAGER)
‘적극적 리밸런싱’ 방식 중 하나로, Kafka v2.4 이전까지의 디폴트 파티션 할당 전략이다.
https://www.conduktor.io/blog/kafka-partition-assignment-strategy/
이 전략은 다음과 같은 방식으로 진행된다.x
- 1) 구독 중인 토픽의 파티션과 컨슈머를 순서대로 나열한다.
- 2) 이후 각 컨슈머가 받아야 할 파티션의 수를 결정하는데, 이는 해당 토픽의 전체 파티션 수를 컨슈머 그룹의 총 컨슈머 수로 나눈 값이다.
- 3) 만약 컨슈머 수와 파티션 수가 정확히 일치한다면, 모든 컨슈머는 파티션을 균등하게 할당받는다.
- 4) 그러나 파티션 수가 컨슈머 수로 균등하게 나누어지지 않는다면, 순서상 앞에 있는 컨슈머들이 추가로 파티션을 할당받게 된다.
장점
- 특정 도메인에 대한 데이터 처리를 한 컨슈머에서 일관되게 처리할 수 있다.
- 예를 들어 정상 로그와 에러 로그를 각각 처리하는 두 토픽(topic01, topic02)이 있다고 가정하자. 두 토픽의 파티션 수가 같을 때 로그 프로듀서가 동일한 메시지key를 사용하면 동일한 파티션(ex. partition0)으로 발행된다. 두 토픽의 partition0 은 모두 동일한 컨슈머에서 처리되기에 일관된 데이터 처리가 가능하다.
단점
- Eager 프로토콜로 동작하기에 리밸런싱 발생시 모든 컨슈머가 작업을 중단하게 된다.
- 컨슈머의 파티션 할당이 불균형하기 때문에 특정 컨슈머에만 메시지가 몰리는 현상이 생길 수 있다.
2. 라운드 로빈 파티션 할당 전략(EAGER)
‘적극적 리밸런싱’ 방식 중 하나이다.
https://www.conduktor.io/blog/kafka-partition-assignment-strategy/
레인지(Range) 전략과 동일하게 파티션과 컨슈머는 할당 전에 사전식 순서로 정렬된후, 파티션을 컨슈머 그룹의 모든 컨슈머에게 균등하게 분배하는 방식이다.
장점
- 모든 컨슈머에 균등한 파티션 분배가 이뤄지기에, 컨슈머를 효율적으로 활용하여 성능을 향상시킬 수 있다.
단점
- Eager 프로토콜로 동작하기에 리밸런싱 발생시 모든 컨슈머가 작업을 중단하게 된다.
- 모든 파티션을 균등하게 분배하려 하기에, 컨슈머가 다운되었을때 불필요한 파티션 재할당이 발생하게 되어 컨슈머 성능에 영향을 주게 된다.
- 예를 들어, 위 이미지에서 컨슈머2의 연결이 끊어질 경우 파티션 A-1, B-0, B-1의 할당이 변경되는 것을 볼 수 있다.
- 이로 인해 4개의 파티션 중 3개의 파티션이 다른 사용 가능한 컨슈머에게 다시 재할당되는 상황이 발생한다.
3. 스티키 파티션 할당 전략(EAGER)
‘적극적 리밸런싱’ 방식 중 하나이다.
https://www.conduktor.io/blog/kafka-partition-assignment-strategy/
앞선 두 전략은 리밸런싱 발생시 기존 매핑정보와 전혀 다른 매핑이 이뤄진다. 스티키 파티션 할당 전략은 이와 달리 리밸런싱이 발생하더라도 기존 매핑 정보를 최대한 유지하는 컨슈머-파티션 할당 전략이다.
스티키 파티션 할당 전략은 2가지 목적으로 컨슈머에 파티션을 할당한다.
첫 번째는 가능한 한 균형 잡힌 파티션 할당이고, 두 번째는 리밸런싱이 발생할 때 되도록 기존 할당된 파티션을 유지하는 것이다. 이 중 첫 번째 목적의 우선순위가 더 높기 때문에 항상 기존 파티션과 컨슈머 매핑을 보장하진 않는다.
장점
- 라운드 로빈 전략의 불필요한 파티션 재할당 문제가 발생하지 않습니다.
- 예를 들어, 위 이미지에서 컨슈머2의 인스턴스가 다운되거나 실패한 경우를 살펴보자.
- 컨슈머1과 컨슈머3은 기존에 할당받았던 파티션을 그대로 유지하고, 컨슈머2가 가지고 있던 파티션은 새로운 컨슈머3에게 할당된다.
- 이렇게 함으로써 불필요한 파티션 재할당을 최소화하고 시스템 균형을 유지할 수 있게 된다.
단점
- Eager 프로토콜로 동작하기에 리밸런싱 발생시 모든 컨슈머가 작업을 중단하게 된다.
Note: 스티키 파티션 할당 전략은 컨슈머들의 균형있는 파티션 할당과 리밸런싱 과정의 효율성이 중요할 때 적합하다.
4. 협력적 스티키 파티션 할당 전략(COOPERATIVE)
기존 스티키 파티션 전략에 ‘협력적 리밸런싱’ 방식이라는 새로운 방식을 추가한 것이며, kafka v2.4부터 디폴트로 지정되었다.
COOPERATIVE 프로토콜을 사용하여 리밸런싱이 필요한 특정 파티션에만 집중하며, 그 외의 나머지 파티션들은 컨슈머와 매핑을 그대로 유지한다.
즉, Stop the world 없이 재할당이 필요한 파티션의 메시지 소비만 중단되기에, 전체적인 데이터 처리 성능을 큰 영향을 주지 않는다.
이 같은 특징 덕분에 협력적 스티키 전략은 컨슈머 그룹의 구성 변경이 자주 발생하는 환경에 특히 유용하며 효율적인 리밸런싱을 수행할 수 있다.
정리
리밸런싱 방식
리밸런싱 방식 | 설명 | 영향 범위 | 적용 전략 |
---|---|---|---|
적극적 리밸런싱 (EAGER) | 리밸런싱 발생 시 모든 컨슈머가 데이터 수신을 중단하고 파티션의 소유권을 포기 | 전체 컨슈머 그룹 | 레인지, 라운드로빈, 스티키 |
협력적 리밸런싱 (COOPERATIVE) | 리밸런싱이 필요한 특정 파티션에만 영향을 주며, 그 외의 파티션들은 그대로 유지. 개별 컨슈머의 작업 중단을 최소화 | 특정 파티션 | 협력적스티키 |
파티션 할당 전략
파티션 할당 전략 | 설명 | 리밸런싱 프로토콜 |
---|---|---|
레인지 할당 전략 | 토픽 별로 동일한 파티션을 특정 컨슈머에게 할당하는 방식 | EAGER |
라운드 로빈 할당 전략 | 사용 가능한 파티션과 컨슈머를 순차적으로 할당하는 방식 | EAGER |
스티키 할당 전략 | 컨슈머가 기존 할당된 파티션을 최대한 유지하는 방식 | EAGER |
협력적 스티키 할당 전략 | Sticky와 동일하지만 Stop the world 없는 점진적인 방식 | COOPERATIVE |