-
[Kafka] Rebalancing (리밸런싱)📖 개발 공부/kafka 2023. 1. 31. 00:16
리밸런싱 (Rebalancing)
컨슈머 그룹 내의 컨슈머들은 자신들이 읽는 파티션의 소유권을 공유한다. 컨슈머 A가 담당하던 파티션 읽기 작업을 컨슈머 B가 이관받아 작업할 수 있음. 이를 리밸런싱이라고 한다.
- 컨슈머 그룹 내의 컨슈머 인스턴스끼리 파티션을 적절히 분배하는 프로세스
- 파티션 소유권 조정이 가능하기 때문에 컨슈머 그룹의 확장성과 가용성을 높여준다.
- 리밸런싱이 발생하는 경우: 특정 토픽의 파티션 수 변화 || 컨슈머 그룹의 멤버십 변화
예시
상황: 1개의 컨슈머 그룹(3개의 컨슈머 인스턴스), 토픽에 생성된 3개의 파티션
ㄴ 컨슈머-1이 셧다운 되었을 때, 컨슈머-1에 할당되어 있던 파티션은 재할당 필요
컨슈머 그룹 구성 정리하고, 파티션 재할당 작업을 진행 ⇒ 리밸런싱- 리밸런싱이 발생하면 컨슈머 그룹 내의 모든 컨슈머 읽기 작업이 중단된다.
컨슈머 그룹 코디네이터 (Consumer GroupCoordinator)
컨슈머 그룹별 브로커 하나 지정되는데, 이 브로커가 해당 컨슈머 그룹의 코디네이터가 된다.
코디네이터는 브로커 중 한대로 지정된다. GroupCoordinator 인스턴스를 백그라운드 프로세스로 실행하면서 컨슈머 그룹을 관리하는 역할을 가진 카프카 브로커다.그룹 코디네이터는 다음과 같은 정보를 추적하고 관리한다. 다음 변화가 일어나면 리밸런싱을 실시한다.
⇒ 특정 토픽의 파티션 수 변화 || 컨슈머 그룹의 멤버십 변화- 컨슈머 그룹의 멤버십 변화 - 컨슈머 그룹 내의 컨슈머가 제외되거나 추가되었을 경우
컨슈머 그룹의 컨슈머는 폴링(polling)하거나 커밋(commit)할 때 하트비트(Heartbeat) 메시지를 그룹 코디네이터에게 전달한다.
- [컨슈머 제외] 그룹 코디네이터가 일정 기간(session.timeout.ms)동안 컨슈머의 하트비트를 받지 못하면, 해당 컨슈머는 작업이 불가한 것으로 판단
→ 리밸런싱 실시(다른 컨슈머로 파티션 소유권 이관) - [컨슈머 추가] 추가된 컨슈머는 그룹 코디네이터에게 JoinGroup 메세지를 전송한다.
→ 메세지를 전달받은 그룹 코디네이터는 해당 컨슈머를 포함해 리밸런싱 실시
- [컨슈머 제외] 그룹 코디네이터가 일정 기간(session.timeout.ms)동안 컨슈머의 하트비트를 받지 못하면, 해당 컨슈머는 작업이 불가한 것으로 판단
- 특정 토픽의 파티션 수 변화 - 컨슈머 그룹이 구독하고 있는 토픽의 파티션이 추가 혹은 변경(re-assign) 된 경우 (해당 파티션에 대한 소유권 재조정)
컨슈머 그룹 리밸런싱 과정
그룹 코디네이터는
- 컨슈머 그룹 내의 모든 컨슈머들의 파티션 소유권을 박탈시킨다.
- 컨슈머들의 JoinGroup 메세지를 기다린다.
- 가장 먼저 JoinGroup 을 요청한 컨슈머를 그룹 리더로 지정한 후, 해당 컨슈머(리더)에게 파티션 정보와 컨슈머 목록을 전달한다.
- 그룹 리더는
전달받은 정보를 바탕으로 파티션 소유권을 재조정하고, 다시 그룹 코디네이터에게 전달한다. - 그룹 코디네이터는
재조정된 파티션 소유권을 각 컨슈머에게 알리고 리밸런싱을 종료한다.
리밸런싱은 컨슈머의 소유권을 재조정하기 때문에 리밸런싱이 발생한 컨슈머 그룹 내의 모든 컨슈머의 읽기 작업은 중단된다.
컨슈머의 일시적인 서비스 중단이 발생하므로 데이터 처리에 지연이 발생할 수 있다.
→ 리밸런싱은 컨슈머가 데이터를 처리하는 도중에 언제든지 발생할 수 있으므로 데이터 처리 중 발생한 리밸런싱에 대응하는 코드를 작성해야한다.
반응형'📖 개발 공부 > kafka' 카테고리의 다른 글
[Kafka] Spring Kafka JSON Batch (0) 2023.03.26 [Kafka] Commit (0) 2023.03.26 [Kafka] reset offset (0) 2023.02.25 [Kafka] Partition 딥다이브 (0) 2023.01.18 [Kafka] Kafka Architecture (0) 2023.01.14