Kafka Consumer Rebalance는 Kafka Consumer 그룹내에서 파티션 할당이 변경되는 과정이다. Kafka Broker의 Group Coordinator는 아래와 같은 경우 Consumer Group내의 Consumer 들에게 파티션을 재할당하는 Rebalancing을 하도록 요청한다.
- Consumer Group 내에 새로운 Consumer가 추가되는 경우
- 기존 Consumer가 종료 될 때
- Topic에 새로운 Partition이 추가 될 때
Kafka Partition Rebalance 시 Consumer Group의 안정성과 중단 시간을 줄이기 위한 방법으로 Eager Protocol과 Cooperative Protocol 방식이 있다.
Rebalance 작업 방식
Eager Protocol
Kafka Consumer의 전통적인 Rebalance 동작 방식으로 Consumer Group 내 Consumer 수가 적고, 파티션 수가 많지 않으며 처리 중단 시간이 상대적으로 중요하지 않은 경우 사용을 권장한다.
- Consumer의 모든 파티션 할당을 반환하고 잠시 메시지를 읽지 않음
- 새롭게 Consumer에 파티션을 다시 할당 받고 메시지를 읽음
- 모든 Consumer가 잠시 메시지를 읽지 않는 시간으로 인해 Lag이 발생 할 가능성이 있음
Cooperative Protocol
Kafka 2.4 이후 도입된 Rebalance 동작 방식으로 Eager 모드의 단점을 보완하여 Rebalance 과정에서 Consumer Group의 안정성을 높이고 처리 중단 시간을 최소화한다
- Consumer가 처리 중인 파티션을 즉시 해제하지 않고, 안전한 시점에 재분배를 점진적으로 수행한다.
- 기존 Consumer는 처리중인 파티션을 대부분 유지하고 새로 추가된 Consumer만 일부 파티션을 할당 받는다.
- 많은 Consumer를 가지는 Consumer Group 내에서 Rebalance 시간이 오래 걸릴 시 활용도 높음
Consumer가 재시작되거나 일시적으로 연결이 끊어질 때마다 Rebalance를 한다면 처리 중단 시간 증가와 데이터 손실 위험이 발생할 수 있다. 이러한 문제를 방지하기 위해 Static Group Membership이 도입 되었다.
Static Group Membership
Kafka 2.3에서 도입된 기능으로, Consumer Group의 Rebalancing 비용을 줄이고 안정적인 그룹 멤버십 유지를 목표로한다. Consumer가 동일한 그룹 내에서 유지되도록 하여, Consumer가 재시작되거나 일시적으로 연결이 끊어졌을 때에도 고정된 ID를 사용해 그룹 내에서 기존 상태를 유지하여 Rebalancing을 방지할 수 있다.
- Consumer Group 내의 Consumer 들에게 고정된 id 부여
- Consumer 가 ShutDown되어도 session.timeout.ms내에 재기동 되면 rebalance가 수행되지 않고 기존 파티션이 재할당
Kafka Consumer 파티션 할당 전략
Consumer의 부하를 파티션 별로 균등하게 할당하고 데이터 처리 및 리밸런싱의 효율성 극대화
props.setProperty(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, RangeAssignor.class.getName());
props.setProperty(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, RoundRobinAssignor.class.getName());
props.setProperty(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, StickyAssignor.class.getName());
props.setProperty(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, CooperativeStickyAssignor.class.getName());
Range 할당 전략
- 기본적인 할당 전략
- 서로 다른 2개 이상의 토픽을 Consumer들이 Subscription 할 시 토픽별 동일한 파티션을 특정 Consumer에게 할당하는 전략
- 여러 토픽들에서 동일한 키값으로 되어 있는 파티션은 특정 Consumer에 할당하여 해당 Consumer가 여러 토픽의 동일 키값으로 데이터 처리를 용이하게 할 수 있도록 지원
Round Robin 할당 전략
- 파티션 별로 Consumer들이 균등하게 부하를 분배하는 전략
- 여러 토픽들의 파티션들을 Consumer 들에게 순차적인 Round Robbin 방식으로 할당
Sticky 할당 전략
- 최초에 할당된 파티션과 Consumer 매핑을 Rebalance 수행되어도 가급적 그대로 유지 할 수 있도록 지원하는 전략
- Eager Protocol 기반으로 Rebalance 시 모든 Consumer의 파티션 매핑이 해제 된 후에 다시 매핑되는 형태
Cooperative Sticky 할당 전략
- 최초 할당된 파티션과 Consumer 매핑을 Rebalance 수행되어도 가급적 그대로 유지 할 수 있도록 지원
- Cooperative Protocol 기반으로 Rebalance 시 모든 Consumer의 파티션이 매핑이 해제 되지 않고 Rebalance 연관된 파티션과 Consumer만 재매핑
'Kafka' 카테고리의 다른 글
[Apahce Kafka] Kafka Consumer (1) | 2024.12.28 |
---|---|
[Apache Kafka] Kafka Producer (0) | 2024.12.26 |
[Apache Kafka] Kafka Replication란? (0) | 2024.09.18 |
[Apache Kafka] 카프카란 무엇인가? (0) | 2024.09.18 |