Apache Kafka - Kafka 컨슈머 그룹과 파티션 리밸런싱 전략 이해하기

이건·2025년 5월 3일

Kafka

목록 보기
11/18

Kafka 컨슈머 그룹과 파티션 리밸런싱 전략 이해하기

Kafka에서 컨슈머 그룹의 구성이 변경될 때마다 파티션 리밸런싱이 발생한다. 이 과정은 컨슈머가 그룹에 합류하거나 떠날 때, 또는 관리자가 토픽에 새 파티션을 추가할 때 발생하는 중요한 메커니즘이다. 리밸런싱을 효율적으로 관리하는 것은 Kafka 시스템의 안정성과 성능에 큰 영향을 미친다.

리밸런싱이란?

리밸런싱은 Kafka 컨슈머 그룹 아키텍처의 기본 개념으로, 컨슈머 그룹 내에서 파티션을 재분배하는 과정이다. 이는 컨슈머가 그룹에 합류하거나 떠날 때, 또는 토픽에 새 파티션이 추가될 때 발생한다.

리밸런싱이 발생하면 Kafka는 파티션을 컨슈머 간에 재분배하여 각 컨슈머가 대략적으로 동일한 수의 파티션을 처리하도록 한다. 이를 통해 데이터 처리가 컨슈머 간에 균등하게 분산되고 각 컨슈머가 최대한 효율적으로 데이터를 처리할 수 있다.

리밸런싱 유형

1. 적극적 리밸런싱(Eager Rebalancing)

적극적 리밸런싱은 전통적인 리밸런싱 방식으로, 다음과 같은 특징이 있다:

  • 리밸런싱이 발생하면 모든 컨슈머가 데이터 수신을 중단하고 파티션 소유권을 포기한다.
  • 이를 "Stop the World" 이벤트라고 부른다.
  • 모든 컨슈머가 그룹에 다시 합류하여 새로운 파티션 할당을 받는다.
  • 컨슈머가 이전에 처리하던 파티션으로 돌아갈 보장이 없다.
  • Range, RoundRobin, Sticky 할당 전략이 이 유형에 속한다.

2. 협력적 리밸런싱(Cooperative Rebalancing)

협력적 리밸런싱은 Kafka 2.4에서 도입된 개선된 방식으로, 다음과 같은 특징이 있다:

  • 리밸런싱이 필요한 특정 파티션에만 영향을 주며, 그 외의 파티션들은 그대로 유지된다.
  • 개별 컨슈머의 작업 중단을 최소화한다.
  • 리밸런싱을 작은 하위 작업으로 분할하고, 이러한 하위 작업이 완료되는 동안 컨슈머는 계속 데이터를 소비한다.
  • "Stop the World" 이벤트를 방지하여 데이터 처리의 지연과 중단을 최소화한다.
  • CooperativeStickyAssignor가 이 유형에 속한다.

파티션 할당 전략

Kafka는 여러 파티션 할당 전략을 제공하며, 각 전략은 리밸런싱 중에 파티션을 컨슈머에게 할당하는 방식을 결정한다.

1. RangeAssignor

  • 기본 파티션 할당 전략(과거)
  • 토픽별로 작동하며, 각 토픽에 대해 사용 가능한 파티션을 숫자 순서로 배치하고 컨슈머를 사전 순서로 배치한다.
  • 파티션 수를 컨슈머 수로 나누어 각 컨슈머에게 할당할 파티션 수를 결정한다.
  • 균등하게 나누어지지 않으면 처음 몇 개의 컨슈머에게 추가 파티션이 할당된다.
  • 토픽별로 배분하기 때문에 균형을 맞추기 어려울 수 있다.

2. RoundRobinAssignor

  • 모든 파티션을 컨슈머에게 라운드 로빈 방식으로 할당한다.
  • 모든 컨슈머의 구독이 동일한 경우 파티션이 균등하게 분배된다.
  • 컨슈머 간 구독이 다를 경우 불균형한 할당이 발생할 수 있다.
  • 리밸런싱 시 파티션 이동을 최소화할 수 없다.

3. StickyAssignor

  • 가능한 한 균형 잡힌 할당을 보장한다.
  • 재할당 시 기존 할당을 최대한 유지하려고 한다.
  • 우선순위: 1. 균등 분배 2. 기존 할당 유지
  • 적극적 리밸런싱 프로토콜을 사용한다.

4. CooperativeStickyAssignor

  • StickyAssignor와 동일한 할당 로직을 따르지만 협력적 리밸런싱 프로토콜을 사용한다.
  • 리밸런싱 중에도 컨슈머가 계속해서 데이터를 처리할 수 있게 한다.
  • Kafka 2.4에서 도입되었으며 2.5에서 안정화되었다.
  • 현재 Kafka 3.0의 기본 할당자 목록 중 하나다(RangeAssignor와 함께).

정적 그룹 멤버십(Static Group Membership)

정적 그룹 멤버십은 컨슈머 그룹 내에서 컨슈머의 ID를 유지하는 방법이다:

  • 컨슈머 구성에 group.instance.id를 설정하여 활성화

  • 컨슈머가 일시적으로 그룹을 떠났다가 돌아올 때 리밸런싱을 방지

  • 컨슈머가 세션 타임아웃 내에 다시 합류하면 이전 파티션이 자동으로 재할당
  • 로컬 캐시와 상태를 유지해야 하는 컨슈머에게 특히 유용
  • 쿠버네티스와 같은 환경에서 컨슈머 재시작 시 유용
  • 하나의 컨슈머 그룹 내에서 각 컨슈머는 고유한 group.instance.id를 가져야 함

리밸런싱 트리거 요인

리밸런싱은 다음과 같은 상황에서 발생할 수 있다:

  1. 컨슈머 합류 또는 이탈: 새 컨슈머가 그룹에 합류하거나 기존 컨슈머가 그룹을 떠날 때 리밸런싱이 발생한다.
  2. 일시적인 컨슈머 장애: 컨슈머가 일시적인 장애나 네트워크 중단을 경험하면 Kafka는 이를 실패한 컨슈머로 간주하고 그룹에서 제거할 수 있다.
  3. 컨슈머가 너무 오래 유휴 상태: 컨슈머가 너무 오래 유휴 상태로 있으면 Kafka는 이를 실패한 컨슈머로 간주하고 그룹에서 제거할 수 있다.
  4. 토픽 파티션 추가: 토픽에 새 파티션이 추가되면 Kafka는 리밸런싱을 시작하여 새 파티션을 그룹의 컨슈머 간에 분배한다.

파티션 할당 전략 비교

리밸런싱 방식

리밸런싱 방식설명영향 범위적용 전략
적극적 리밸런싱(EAGER)리밸런싱 발생 시 모든 컨슈머가 데이터 수신을 중단하고 파티션의 소유권을 포기전체 컨슈머 그룹Range, RoundRobin, Sticky
협력적 리밸런싱(COOPERATIVE)리밸런싱이 필요한 특정 파티션에만 영향을 주며, 그 외의 파티션들은 그대로 유지. 개별 컨슈머의 작업 중단을 최소화특정 파티션CooperativeSticky

파티션 할당 전략

파티션 할당 전략설명Rebalancing Protocol
Range Partition 할당 전략Topic 별로 동일한 Partition을 특정 Consumer에게 할당하는 방식EAGER
Round Robin Partition 할당 전략사용 가능한 Partition과 Consumer를 순차적으로 할당EAGER
Sticky Partition 할당 전략Consumer가 구독 중인 Partition을 계속 유지하게 끔 할당EAGER
Cooperative Sticky Partition 할당 전략Sticky와 유사하지만, 전체 Rebalancing이 아닌 필요한 Partition끼리 점진적으로 Rebalancing 하는 방식COOPERATIVE

결론

Kafka의 리밸런싱 전략은 시스템의 안정성과 성능에 큰 영향을 미친다. 최신 버전의 Kafka에서는 협력적 리밸런싱과 정적 그룹 멤버십을 통해 리밸런싱으로 인한 중단을 최소화하고 시스템의 안정성을 향상시킬 수 있다. 특히 CooperativeStickyAssignor는 대부분의 사용 사례에서 최적의 선택이 될 수 있으며, 로컬 상태를 유지해야 하는 애플리케이션의 경우 정적 그룹 멤버십을 고려해볼 만하다.

Kafka Connect와 Kafka Streams는 이미 협력적 리밸런싱을 기본값으로 사용하고 있으며, Kafka 3.0부터는 일반 컨슈머에서도 RangeAssignor와 CooperativeStickyAssignor가 기본 할당자 목록으로 제공된다.

0개의 댓글