Consumer Group Rebalance

2024. 12. 16. 00:09Kafka

반응형

리벨런싱이란

컨슈머 그룹 내의 컨슈머들은 자신들이 읽는 파티션의 소유권을 공유합니다. 즉 하나의 켠슈머 그룹에서 컨슈머 A가 담당하던 파티션 읽기 작업을 컨슈머 B가 이관받아 작업을 처리할 수 있습니다. 이와 같은 컨슈머 그룹 내의 소유권 이관 작업을 리밴런싱(Rebalance)라고 합니다. 이처럼 리밸런싱은 컨슈머 파티선 소유권을 조정할 수 있기 때문에 컨슈머 그룹의 확장성과 가용성을 높여줍니다.

컨슈머 그룹 코디네이터

컨슈머 그룹 코디네이터는 특정 컨슈머 그룹을 관리하는 브로커입니다. 즉, 컨슈머 그룹 별로 관리하는 브로커가 지정되는데 이 브로커가 해당 컨슈머 그룹의 코디네이터가 됩니다. 그룹 코디네이터는 아래와 같은 정보를 추적하고 관리하는데 만약 해당 정보에 대해 변경이 발생하면 리밸런싱을 실시합니다.

  • 켠슈머 그룹 내의 컨슈머가 제외되거나 추가된 경우
  • 컨슈머 그룹이 구독하고 있는 토픽의 파티션이 추가 혹은 변경된 경우

컨슈머 그룹 내의 컨슈머가 제외되거나 추가된 경우

컨슈머 그룹의 컨슈머는 폴링하거나 커밋할 때 하트비트 메시지를 그룹 코디네이터에게 전달합니다. 그룹 코디네이터는 하트비트를 성공적으로 전달한 컨슈머를 정상 작동 중이라고 판단합니다. 하지만 그룹 코디네이터가 일정 기간 동안 컨슈머의 하트비트를 받지 못하면, 해당 컨슈머는 어떠한 이유로 작업이 불가한 것으로 판단하고 해당 컨슈머의 파티션 소유권을 다른 컨슈머로 이관합니다. 즉, 리밸런싱을 실시합니다. 반대로 컨슈머 그룹에 컨슈머가 추가된 경우도 리밸런싱이 발생합니다. 추가된 컨슈머는 그룹 코디네이터에 joinGroup 메시지를 전송하고 메시지를 전달받은 그룹 코디네이터는 해당 컨슈머를 포함하여 리밸런싱을 실시합니다.

새로운 파티션의 추가 및 변경

특정 토픽의 파티션이 증가하거나 re-assign으로 변경이 발생하면 해당 파티션에 대한 소유권을 재조정해야합니다. 그렇기 때문에 리밸런싱을 통해 컨슈머 그룹 내의 컨슈머가 추가된 파티션을 구독할 수 있도록 합니다.

적극적 리밸런싱(Eager Rebalance)

  1. 그룹 코디네이터는 컨슈머 그룹 내의 모든 컨슈머들의 파티션 소유권을 박탈한 뒤, 컨슈머들의 JoinGroup 요청을 일정 시간 기다립니다.
  2. 그룹 코디네이터는 제일 먼저 JoinGroup을 요청한 컨슈머를 그룹 리더로 지정하고 그룹 리더에게 파티션 정도와 컨슈머 목록을 전달합니다.
  3. 그룹 리더는 전달받은 정보를 바탕으로 파티션 소유권을 재조정하고 이를 그룹 코디네이터에게 다시 전달합니다.
  4. 그룹 코디네이터는 재조정된 파티션 소유권을 각 컨슈머에게 알리고 리밸런싱을 중료합니다.

적극적 리밸런싱의 위험

적극적 리밸런싱은 컨슈머의 소유권을 재조정하는 일입니다. 그렇기 때문에 리밸런싱이 발생한 컨슈머 그룹 내의 모든 컨슈머의 읽기 작업은 중단됩니다. 그래서 컨슈머 측의 일시적인 서비스 중단이 발생할 수 있습니다.

협력적 리밸런싱

협렬적 리밸런싱은 kafka v.24부터 도입된 진보된 리밸런싱 방식입니다. 협력적 리밸런싱은 파티션의 일부만이 한 컨슈머에서 다른 컨슈머로 이동하는 특징을 가지며, 이는 리밸런싱과 직접적인 관련이 없는 다른 카프카 컨슈머들이 데이터 처리를 계속 진행할 수 있게 하여 전체 그룹의 처리 성능에 미치는 영향을 최소화합니다. 헙력적 리밸런싱은 안정적인 파티션 할당 상태를 점진적으로 찾아가는 과정으로 여러 차례의 리밸런싱을 거칩니다.

  1. 리더가 모든 컨슈머에게 일부 파티션의 소유권을 일게 될 것임을 알립니다.
  2. 컨슈머는 알림받은 파티션의 소유권을 포기합니다.
  3. 컨슈머가 소유하지 않은 파티션을 재할당합니다.

이러한 방식은 안정적인 상태가 되기까지 여러 차례의 반복이 필요할 수 있지만, 적극적 리밸런싱과 같이 서비스 중단을 할 필요가 없습니다. 하지만 이 방식을 활용할 때에도 신중하게 접근해야합니다.

파티션 할당 전략

레인지 파티션 할당 전략

  1. 구독 중인 토픽의 파티션과 컨슈머를 순서대로 나열합니다.
  2. 이후 각 컨슈머가 받아야할 파티션의 수를 결정하는데, 이는 해당 토픽의 전체 파티션 수를 컨슈머 그룹의 총 컨슈머 수로 나눈 값입니다.
  3. 만약 컨슈머 수와 파티션 수가 정확히 일치한다면, 모든 컨슈머는 파티션을 균등하게 할당받습니다.
  4. 그러나 파티션 수가 컨슈머 수로 균등하게 나누어지지 않는다면, 순서상 앞에 있는 컨슈머들이 추가로 파티션을 할당받게 됩니다.

레인지 파티션 할당 전략의 장접은 특정 도메인에 대한 데이터 처리를 한 컨슈머에서 일관되게 관리할 수 있다는 점입니다. 예를 들어 토픽 A가 로그 데이터를 토픽 B가 해당 로그 데이터에 대한 에러 정보를 관리하는 경우를 예를 들어 보겠습니다. 레인지 전략을 사용하면 동일한 파티션 번호를 가진 두 종류의 데이터가 동일한 컨슈머로 할당됩니다. 이렇게 되면, 한 컨슈머 내에서 로그 데이터와 그에 대한 에러 정보를 함꼐 처리하고 분석할 수 있어 데이터의 일관성을 유지하면서 처리 효율성을 높일 수 있습니다.
그러나 이 전략의 단점은 분배가 균등하지 않을 수 있다는 점입니다.

라운드 로빈 파티션 할당 전략

라운드 로빈 전략은 파티션을 컨슈머 그룹의 모든 컨슈머에게 균등하게 분배하는 방식입니다. 라운드 로빈 전략의 장점은 모든 사용 가능한 컨슈머를 효과적으로 활용하고 성능을 향상시킨다는 점입니다. 즉, 모든 컨슈머가 균등하게 작업을 분산받아 처리하게 되므로 효율적인 리소스 활용이 가능합니다.
그러나 라운드 로빈 전략의 단점은 리밸런싱이 발생할 때 파티션 이동을 최소화하지 못한다는 점입니다. 예를 들어 특정 컨슈머의 연결이 끊어지면 해당 컨슈머에 할당되었던 파티션들은 다른 컨슈머들에게 균등하게 재할당되어야 합니다.

스티키 파티션 할당 전략

스티키 할당 전략은 리밸런싱 작업이 필요할 때, 리밸런싱 작업이 일어나기 전의 컨슈머 파티션 정보를 우선적으로 매핑하여 리밸런싱 과정에서 발생할 수 있는 불필요한 파티션 이동을 최소화합니다. 스티키 할당 방식은 라운드 로빈 방식에서 발생할 수 있는 불필요한 파티션 이동 문제를 개선했습니다. 하지만 스티키 할당 전략이 항상 기존의 파티션과 컨슈머를 유지하는 것은 아닙니다. 이 전략의 최우선 순위는 가능한 균형 잡힌 파티션 할당을 유지하는 것이며, 그 다음 목표가 리밸런싱이 발생할 때 기존의 할당된 파티션 정보를 유지하는 것이기 때문입니다.

협력적 스티키 파티션 할당 전략

협력적 스티미 할당 전략은 기존의 스티키 할당 전략에 협력적 리밸런싱이라는 개념을 추가한 것입니다. 리밸런싱이 발생할 때, 컨슈머 재할당이 필요한 특정 파티션의 소비만 중지하고 다른 나머지 파티션에서는 계속해서 데이터를 소비합니다.

리밸런싱 리스크를 해결하는 방법

max.poll.records 조정

max.poll.records를 줄이면 아래와 같은 장점들이 있습니다.

  • 리밸런싱 시간 단축
  • Poll 지연에 의한 리밸런싱 발생 가능성 감소
  • 메시지 중복 컨슈밍 가능성 감소

수동 커밋 사용하기

중복 컨슈밍을 최대한 막기 위해, 서비스에 적절한 전략을 사용해야 합니다. 기본 설정은 Poll 요청 때마다 커밋을 하는 AckMode.BATCH입니다. 만약 max.poll.records=1로 설정하고 기본 전략인 BATCH를 사용한다면 단일 메시지 단위로 커밋이 될 것이라고 기대할 수 있습니다.

반응형

'Kafka' 카테고리의 다른 글

Kafka Consumer Group  (0) 2024.12.02
Reactor Kafka  (0) 2024.11.16