티스토리 뷰
kafka consumer rebalance 란?
토픽의 파티션이 다른 consumer에게로 할당될 때 이것을 consumer rebalance라고 한다.
다음과 같은 상황에서 발생한다.
- consumer가 그룹을 떠날 때(leave)
- group에 다시 들어올 때(join)
- topic에 파티션이 추가될 때
기본적으로 eager rebalancing이 이뤄지면 아래와 같이 전체 consumer가 할당 받은 partition을 revoke하고 다시 할당을 받는다
이때 모든 consumer는 메시지 consuming을 중지하면서 이 기간 동안 모든 처리가 멈춘다.
이걸 stop the world 라고 부른다.
기본적으로 consumer의 partition.assignment.strategy 설정을 하지 않으면 RangeAssinor가 사용된다.
2.4부터 incremental cooperative rebalancing 을 지원하는 group protocol을 제공한다.
3.0.0부터는 기본값이 [RangeAssignor, CooperativeStickyAssignor] 로 변경됐으나 첫번째 Assignor가 사용되기 때문에 RangeAssignor가 사용된다. 그러나 기본값이 변경됨에 따라서 partition.assignment.strategy 설정을 CooperativeStickyAssignor로만 해줘도 된다.
CooperativeStickyAssignor 를 설정했을 때 cooperative rebalacing이 이루어지고 가장 이상적인 리밸런싱이 진행된다.
위에 그림처럼 consumer C가 들어왔지만 consumer B는 할당 받은 2번 partition에 대해서 stop the world 없이 계속 처리가 가능하다.
consumer A는 할당 받은 partition 3에 대해서만 revoke하고 consumer C는 partition 3을 할당 받으면서 rebalacing이 종료된다.
CooperativeStickyAssignor 로 설정하기 위한 방법
- 2.4 이상 지원
- 1차로 partition.assignment.strategy 에 [RangeAssignor, CooperativeStickyAssignor] 설정
- 2차로 partition.assignment.strategy 에 [CooperativeStickyAssignor] 설정해서 적용함.
3.0부터는 바로 [CooperativeStickyAssignor] 로 설정해서 적용할 수 있지만 2.4 ~ 3.0 미만에서는 아래와 같은 오류가 발생한다.
org.apache.kafka.common.errors.InconsistentGroupProtocolException: The group member's supported protocols are incompatible with those of existing members or first group member tried to join with empty protocol type or empty protocol list
Static Membership
기본적으로 consumer가 그룹을 떠날 때 partition들이 revoke 되고 다시 할당된다.
배포 등으로 consumer가 다시 들어올 때 새로운 member.id를 가지고 있고 새로운 파티션이 할당된다.
2.3 이상부터 group.instance.id를 명시하면 static member로 만들 수 있다.
static member인 consumer가 떠날 때 session.timeout.ms 안에 다시 들어오면 리밸런싱없이 다시 파티션을 가져올 수 있다.
group.instance.id와 session.timout.ms를 조정해서 불필요한 리밸런싱을 줄일 수 있다.
3.0.0 부터 session.timeout.ms 기본값이 10초에서 45초로 변경됨
아래 참고 자료들 중에 kafka 기본 문서와 더불어 conduktor kafkademy, confluent 자료를 같이 보면 도움이 많이 된다.
참고
https://www.conduktor.io/kafka/consumer-incremental-rebalance-and-static-group-membership
https://www.verica.io/blog/understanding-kafkas-consumer-group-rebalancing/
https://www.conduktor.io/blog/kafka-partition-assignment-strategy