리눅스/kafka

consumer partition 할당 전략 종류( range , roundRobin , sticky , cooperative sticky )

정지홍 2024. 10. 21. 16:48

Range 할당 전략

  • kafka의 기본 파티션 할당 전략 
  • 파티션을 범위로 나누어서 할당하는 방식
  • 파티션을 순차적으로 나누고, 각 consumer가 하나 이상의 연속된 파티션을 할당받음
  • 동작 방식...
    • 1. consumer ID와 topic의 partition을 정렬
      • ex) consumer1, consumer2, consumer3처럼 정렬하고, 파티션도 partition 0, partition 1, partition 2로 정렬
    • 2. 각 cinsumer에게 할당될 파티션 범위를 계산
      • 파티션 수를 consumer 수로 나누어서 몇 개의 파티션을 할당하는 방식
    • 3. 파티션을 순서대로 나누어서 각 consumer에게 할당.
      • 연속된 파티션을 할당하니, 같은 topic안의 파티션을 여러개 가진 consumer가 존재 가능
  • 장점
    • 파티션이 연속적으로 할당되니, consumer가 데이터의 일정한 범위를 담당하게 됨
    • 간단하다
  • 단점
    • 파티션이 균등하지 않을수 있음. 즉, 파티션이 특정 consumer에게 몰릴 수도 있음
    • consumer 그룹의 크기가 작거나 너무 크면, 특정 consumer에게 과도한 파티션이 할당될 수 있음

consumer를 ckfPfh 2개,3개 실행시켰을때이다.... consumer-ID에서 변함을 확인 가능


Round Robin 할당 전략

  • 원형 순환 방식으로 고르게 나누어 할당하는 전략
  • 모든 consumer가 가능한 동일한 수의 partition을 할당 받음
  • 동작 과정...
    • 1. consumer 및 파티션 정렬
    • 2. 라운드 로빈 방식으로 할당
  • 예시...
    • 만약 consumer 3 , partition 6 존재시...
      • consumer 1 : partition 0 3
      • consumer 2 : partition 1 4
      • consumer 3 : partition 2 5
  • 장점
    • 파티션이 고르게 분배 
  • 단점
    • 같은 topic안에서 연속된 파티션을 하나의 consumer가 담당하는게 아니라서, 파티션간의 연속성이 보장 안됨
    • partition or consumer가 많아질수록 라운드 로빈 순환이 복잡해짐 
props.setProperty( ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG , RoundRobinAssignor.class.getName() );

Stickt 할당 전략

  • consumer가 기존에 할당된 파티션을 최대한 유지하는 것을 목표
  • 최소한의 변경 및 고른 분배가 목표
  • 과정...
    • consumer 3 , partition 6 존재시 새로운 consumer가 추가 or 삭제될때, 기존 consumer들은 할당 받은 파티션들을 최대한 유지
  • 장점
    • consumer 그룹의 안전성 및 데이터 처리 연속성 보장

 


cooperative sticky 할당 전략

  • cooperative sticky assignor는 sticky assignor에서 더 발전된 형태로, 중단 없는 리밸런싱을 목표로 한다.
  • 기존의 파티션을 유지하며 점진적 리벨런싱을 한다
  • 단점
    • 구현의 복잡함
    • rebalacing 시 소수의 파티션만 이동하니, 큰 규모인 경우 처리 속도가 느림
  • 장점
    • 소비 중단의 최소화
props.setProperty( ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG , CooperativeStickyAssignor.class.getName());

1개만 실행시킴( 총 6개중 6개가 할당되었음을 확인 가능)

 


2개 실행시킨 경우의 1번째 쉘( 기존에는 6개였으나 3개를 할당 받음을 확인 가능)
2개 실행시켰을때 2번째 쉘( 최초 실행시 할당은 0이였다가 3개를 할당 받음을 확인 )


3개 실행시켰을때의 2번째 쉘( 3개에서 2개로 할당받음을 확인)
3개 실행 시켰을때의 3번째 쉘 ( 처음부터 2개를 할당 받음)