DataOps/Kafka

[Kafka] 컨슈머 리밸런싱: 파티션 할당 전략 깊이 있게 이해하기

BenKangKang 2025. 5. 30. 11:20

리밸런싱의 종류

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

 

- '레인지(Range), 라운드 로빈(RoundRobin), 스티키(Sticky)이 사용하는 전략

- 리밸런싱이 일어나는 경우 모든 컨슈머가 데이터 수신을 중단하고 파티션 그룹 구성 포기함 이로인해 모든 작업을 멈추는 stop the wolrd 현상 일어남

- 리밸런싱 이후에 컨슈머들이 새롭게 파티션을 할당 받는 방식

 

순서

1. 모든 컨슈머는 아파치 카프카로부터 데이터 수신을 중단.

2. 자신들이 가지고 있던 파티션의 그룹 구성을 포기 (대기 시간 동안에는 LAG가 급격하게 증가).

3. 리밸런싱 이후에는 컨슈머들이 그룹에 다시 참여하고, 새로운 파티션을 할당 받음.

 

 

2. 협력적 리밸런싱(Cooperative Rebalance, Incremental Rebalance)

 

- Kafka v2.4부터 도입된 꽤나 최근에 나온 진보된 리밸런싱 방식

- 파티션의 일부만이 한 컨슈머에서 다른 컨슈머로 이동하는 특징을 가지며, 이는 리밸런싱과 직접적인 관련이 없는 다른 카프카 컨슈머들이 데이터 처리를 계속 진행할 수 있게 함

 

순서

1. 첫 번째 단계에서는 리더가 모든 컨슈머에게 일부 파티션의 소유권을 잃게 될 것임을 알림.

2. 컨슈머는 이러한 파티션의 소유권을 포기.

3. 조정자는 이 고아가 된 파티션을 새로운 컨슈머에게 할당.

 

파티션 할당 전략 종류

1. 레인지 파티션 할당 전략

- 아파치 카프카 v2.4이전까지는 기본으로 설정된 '적극적 리밸런싱' 방식의 파티션 할당 전략

- Range 할당 전략보다는 파티션 이동이 적음

 

순서

1. 먼저 구독 중인 토픽의 파티션과 컨슈머를 순서대로 나열

2. 컨슈머가 받아야 할 파티션의 수를 결정하는데, 이는 해당 토픽의 전체 파티션 수를 컨슈머 그룹의 총 컨슈머 수로 나눔 

3. 만약 컨슈머 수와 파티션 수가 정확히 일치한다면, 모든 컨슈머는 파티션을 균등하게 할당

4. 파티션 수가 컨슈머 수로 균등하게 나누어지지 않는다면, 순서상 앞에 있는 컨슈머들이 추가로 파티션을 할당

 

예시

파티션: P0, P1, P2, P3, P4, P5
컨슈머: C1, C2, C3

분배 과정
C1: P0-P1
C2: P2-P3
C3: P4-P5

 

 

장점

- 구현이 간단

- 특정 범위의 파티션을 일관되게 할당

 

단점

- 컨슈머 수에 따라 불균등한 파티션 분배 발생 가능

- 일부 컨슈머가 더 많은 파티션을 처리할 수 있음

 

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

- 사용 가능한 컨슈머를 효과적으로 활용하고 성능을 향상

- 파티션 재분배 시, 파티션 이동이 많이 발생할 수 있음

 

 

예시

파티션: P0, P1, P2, P3, P4, P5
컨슈머: C1, C2, C3

분배 과정
P0 -> C1
P1 -> C2
P2 -> C3
P3 -> C1
P4 -> C2
P5 -> C3

 

 

장점

파티션을 더 균등하게 분배

특정 컨슈머에게 부하가 집중되는 것을 방지

 

단점

연관된 파티션들이 서로 다른 컨슈머에 분산될 수 있음

메시지 처리의 일관성에 영향을 줄 수 있음

 

3. 스티키 파티션 할당 전략

 

- 리밸런싱 작업이 일어나기 전의 컨슈머의 파티션 정보를 우선적으로 매핑하여 리밸런싱 과정에서 발생할 수 있는 불필요한 파티션 이동을 최소화하는 전략

- 스티키 할당 방식은 라운드 로빈 할당 전략에서 발생할 수 있는 불필요한 파티션 이동 문제를 개선

-  항상 기존의 파티션과 컨슈머를 유지하는 것은 아닙니다. 이 전략의 최우선 순위는 가능한 한 균형 잡힌 파티션 할당을 유지하는 것이며, 그다음 목표가 리밸런싱이 발생할 때 기존의 할당된 파티션 정보를 최대한 유지하는 것

- 처음에는 라운드 로빈 전략 사용

 

장점

- 단순하고 예측 가능: 재균형 시 clean slate로 시작

- 완벽한 균형: 매번 최적의 파티션 분배 보장

 

단점

- Stop-the-World

- 높은 지연시간 (리밸런싱 중 메시지 처리 중단)

 

예시

초기 상태
- 컨슈머 그룹: C1, C2, C3
- 파티션: P0(주문), P1(결제), P2(배송)

기존 할당:
C1: P0
C2: P1
C3: P2

새 컨슈머 C4 추가:
모든 파티션 재분배
  C1: P0
  C2: P1
  C3: P2
  C4: (최소 영향)

 

 

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

- '협력적 스티키(CooperativeSticky) 파티션 할당 전략'은 기존의 '스티키 할당 전략'에 '협력적 리밸런싱'이라는 새로운 개념을 추가한 것

- 카프카 2.4 부터 default 전략

- 협력적 리밸런싱은 리밸런싱이 필요한 특정 파티션에만 집중하며, 그 외의 나머지 파티션들은 그대로 유지되는 방식

- 컨슈머 재할당이 필요한 특정 파티션의 소비만 중지하고, 다른 나머지 파티션에서는 계속해서 데이터를 소

- 전체 컨슈머 그룹이 아닌 개별 컨슈머의 작업 중단을 최소화하므로, 전체적인 데이터 처리 성능에 더 적은 영향

 

장점

- 증분 재균형

예시: Consumer2 제거 시
1차: Consumer2의 파티션만 해제
2차: 해제된 파티션을 나머지에 재분배
→ Consumer1, Consumer3는 기존 파티션 계속 처리

 

- 최소 중단: 영향받는 파티션만 재할당

- 빠른 복구: 대부분의 파티션은 중단 없이 계속 처리

 

단점:

- 복잡한 프로토콜: 2단계 재균형으로 로직이 복잡

- 일시적 불균형:

예시: 4개 파티션, 2→3 컨슈머
재균형 전: C1[P0,P1], C2[P2,P3]
1단계 후: C1[P0,P1], C2[P2,P3], C3[]  // 불균형
2단계 후: C1[P0], C2[P2,P3], C3[P1]   // 재균형

 

 

예시

초기 상태:
- 컨슈머 그룹: C1, C2, C3
- 파티션: P0(주문), P1(결제), P2(배송)

기존 할당:
C1: P0
C2: P1
C3: P2

새 컨슈머 C4 추가:
가능한 기존 할당 유지
  C1: P0
  C2: P1
  C3: P2
  C4: (최소 영향)

 

 

기타

1. 파티션 할당 전략에 여러개를 넘기는 이유

의미

 

- 컨슈머는 partition.assignment.strategy 설정에 여러 전략을 리스트로 지정할 수 있습니다

- 예: [RangeAssignor, RoundRobinAssignor, StickyAssignor]

- 이 순서가 바로 우선순위를 나타냅니다

 

 

순서

 

1. 그룹 코디네이터가 모든 컨슈머가 공통으로 지원하는 전략을 찾습니다

2. 여러 전략이 공통으로 지원되면, 가장 높은 우선순위(리스트 앞쪽)의 전략을 선택합니다

3. 만약 공통 전략이 없으면 리밸런싱이 실패합니다

 

예시

Consumer A: [RangeAssignor, RoundRobinAssignor]
Consumer B: [RoundRobinAssignor, RangeAssignor]
Consumer C: [RangeAssignor, RoundRobinAssignor]

- 모든 컨슈머가 두 전략을 모두 지원합니다

- Consumer A와 C는 RangeAssignor를 우선시합니다

- 다수결에 의해 RangeAssignor가 선택됩니다