개발 일지

Kafka Consumer #2 Partition Assignor Strategy

북극곰은콜라 2023. 6. 15. 19:37
반응형


개요

Kafka Consumer에 대한 세부 조사
#1 글에 이어서

 


Consumer Partition Assignor

파티션을 할당하기 위한 Interface
consumer 설정의 partition.assingment.strategy 로 구현체를 세팅할 수 있다.
ConsumerGroup의 정보와, Topic의 Partition 정보를 받아서, 배분한다.
5개 정도의 구현체가 있다.
Custom한 전략도 구현 가능하다.
Consumer Rebalancing 전략은 Broker의 Coordinator가 아닌 Consumer들이 정한다.
따라서 Rebalance에서 발생하는 모든 오퍼레이션은 Consumer (Leader)가 관장하여, coordinator는 leader가 오퍼레이션 하기 위한 브로커 역할을 한다.



Range Assignor

기본 partition Assignor
파티션과 컨슈머를 사전순으로 정렬하고 파티션을 컨슈머에게 순차적으로 할당하는 방식
토픽별로 배분 한다.

RoundRobin Assignor

파티션을 전체적으로 sort하고 컨슈머를 번갈아가면서 매핑
Reassign 후 Consumer ↔︎ Partition 간의 매핑이 달라질 수 있다.
Consumer Group내 Consumer들이 같은 토픽들을 subscribe 할 때 효율적

Sticky Assignor

기본 배분 로직은 RoundRobin과 같음

init:

RoundRobin After Consumer1 Dead

Sticky After Consumer1 Dead

최대한 균등한 할당을 보장 (Consumer의 Partition 수의 차이는 최대 1)
가본적으로 Round Robin
→ A +2 <= B 인경우 A의 Topic의 남은 Partition은 B에 할당 불가
Reassign시 최대한 기존 할당을 유지
우선순위: 1. 균등 2. 기존 유지

CooperativeStickyAssignor (Kafka ver >= 2.4, stable in 2.5)

동작은 StickyAssignor와 동일하지만
위 3가지에 사용되는 EAGER rebalance을 사용 안함.
목적은 Consumer의 다운타임 최소화
STW 관련 설명은 후술

EAGER rebalance

1. Consumer의 변동 감지
2. 모든 파티션의 할당을 취소한다.
3. 파티션 재할당 전략을 통해 재 할당

Cooperative reablance

1. Consumer의 변동 감지
2. 모든 Comsumer는 자신의 구독정보 및 선호도(이전 할당 이력 등)를 그룹 코디네이터로 전송
3. 그룹 코디네이터는 정보를 조합해 consumer 리더에게 전송
4. 리더는 현 파티션 정보를 고려해 할당 정보를 생성한다.
5. 재할당 전략으로 불필요한 재할당 (Sticky) 및 선호도 (이전 할당 이력)을 최대한 반영

StreamsPartitionAssignor

Kafka Streams 에서 사용하는 할당 전략
자세한 사항은 추후 조사

 


Rebalance와 STW

기본 Reablance 상황의 STW

Consumer 3가 join 하는 상황이다.
1. consumer → coordinator: 참가 요청
2. coordinator → 기존 consumers: heartbeat 또는 offsetFetch(consume) 의 response로 rebalance 시작을 noti
3. rebalance를 수신받은 consumer1, 2 는 STW
4. consumers → coordinator: joinGroupRequest
5. coordinator → consumers: leader에게 전체 정보, 각 컨슈머에게 memberId 정보를 response로 전달
6. consumer ↔︎ coordinator: 지속적으로 Sync Group을 진행하면서, rebalancing 완료를 기다림
7. Rebalance 종료 후 STW 해제

Rebalance 불합리

위 상황에서 Consumer 1,2의 p0, p1는 rebalance 전후로 변화가 없다.
따라서 p0의 경우 STW에서 제외하는 것이 효율적이다.
또한 Range, RoundRobin Assignor에서는 p0의 state 또한 재구성하는 오버헤드가 있다.

CooperativeStickyAssignor를 통한 STW 최소화

Step 1

신규 Consumer 3가 Join하는 상황이다.
기존 Consumer 1,2는 join → sync를 수행하지만, STW는 하지 않는다.
Sync를 통해서 자신이 제외해야할 파티션을 결정한다.

Step 2

Step 1에서 결정된 제외할 파티션을 revoke 한다.
다시 Join, Sync 프로세스를 통해 Consumer3가 p2를 할당 받으면서 합류합니다.

 


REFERENCE

 

 

 

반응형

'개발 일지' 카테고리의 다른 글

Kafka Consumer #4 Offset Commit Strategy  (0) 2023.06.22
Kafka Consumer #3 Consume 로직  (0) 2023.06.21
Kafka Consumer #1 Startup / Rebalance Flow  (0) 2023.06.14
Expand Kafka Cluster  (0) 2023.06.13
Webclient 동작 원리 및 Configuration  (0) 2023.05.30