Apache Kafka - Partition Assignment Strategy

현시기얌·2022년 2월 14일
0

Apache Kafka

목록 보기
12/12

Partition Assignment Strategy

Conumser의 설정 파리미터 중에서 partition.assingment.strategy로 할당 방식을 조정할 수 있다.

  • org.apache.kafka.clients.consumer.RangeAssginor : Topic별로 작동하는 Default Assignor
  • org.apache.kafka.clients.consumer.RoundRobinAssignor : Round Robin 방식으로 Consumer에게 Partition을 할당한다.
  • org.apache.kafka.clients.consumer.StickyAssginor : 최대한 많은 기존 Partition 할당을 유지하면서 최대 균형을 이루는 할당을 보장한다.
  • org.apache.kafka.clients.consumer.CooperativeStickyAssignor : 동일한 StickyAssignor 논리를 따르지만 협력적인 Rebalance를 허용한다.
  • org.apache.kafka.clients.consumer.ConsumerPartitionAssginor : 인터페이스를 구현하면 사용자 지정 할당 전략을 사용할 수 있다.

Range Assignor

Default Assignor

  • partition.assignment.strategy 파라미터의 Default Assginor

가정 : Consumer Group안에 Consumer가 3개 있고 이 Consumer 들이 Topic 0과 Topic 1의 Partiton 0,1을 모두 Polling 해서 Consume하고 있다.

  • 이 때 Default Assignor는 무조건 0부터 순서대로 할당해준다.
  • 동일한 Key를 가지고 있는 메세지들에 대한 Topic 간에 "co-partitioning" 하기에 유리하다.
  • ex) Delivery ID를 Key로 가지고 있는 delivery_status 메시지와 delivery_location 메시지

Round Robin Assignor

Range 방식 보다 효율적으로 분배하여 할당

T0-P0 = Consumer 0
T0-P1 = Consumer 1
T0-P2 = Consumer 0
T1-P0 = Consumer 1
T1-P1 = Consumser 0
T1-P2 = Consumer 1

  • Reassign(재할당) 후 Consumer가 동일한 Partition을 유지한다는 보장이 없다.
    ex) Consumer 0이 지금 Topic0의 Partiton0에 할당되어 있지만 재할당이 발생하면 Topic0의 Partition0이 다른 Consumer에게 할당될 수 있다.

할당 불균형이 발생할 가능성 존재

  • Consumer간 Subscribe 해오는 Topic이 다른 경우 할당 불균형이 발생할 가능성이 있다.
  • 3개의 Consumer C0,1,2와 3개의 Topic T0,1,2,를 가정
  • T0은 Partition 1개, T1은 Partition 2개, T2는 Partition 3개를 가정
  • C0은 T0만, C1은 T0과T1만, C2는 T0,T1,T2를 Subscribe 한다고 가정

T0-P0 - C0
T1-P0 - C1
T1-P1 - C2
T2-P0 - C2
T2-P1 - C2
T2-P2 - C2

Sticky Assginor

Range 방식보다 Rebalancing 오버헤드를 줄임

  1. 가능한한 균형적으로 할당을 보장한다.
  • Consumer들에게 할당된 Topic Partition의 수는 최대 1만큼 다르다.
  • ConsumerA가 ConsumerB에 비해 2개이상 더 적은 Topic Partition이 할당된 경우, A에 할당된 Topic의 나머지 Partition들은 B에 할당될 수 없다.
  1. 재할당이 발생했을 때 기존 할당을 최대한 많이 보존하여 유지한다.
  • Topic Partition이 하나의 Consumer에서 다른 Consumer로 이동할 때의 오버헤드를 줄인다.

  • 3개의 Consumer C0,C1,C2와 4개의 Topic T0,T1,T2,T3를 가정
  • T0,T1,T2,T3는 모두 Partition 2개를 가정
  • C0,C1,C2 모두 T0,T1,T2,T3를 Subscribe 한다고 가정
  • Rounb Robin과 비슷한 과정이다.

C1이 제거되고 재할당이 발생한다고 가정

  • Round Robin은 처음부터 다시 순차적으로 할당한다. : 전체를 다시 재할당
  • Sticky Assignor는 C1을 제외한 기존에 할당되었던 형태를 유지하면서 C1에 붙어있는 Topic들만 다시 순차적으로 재할당한다. : 기존 할당을 유지하면서 나머지 부분만 재할당

할당 불균형이 발생할 가능성을 줄임

Round Robin 방식에서 설명했던 할당 불균형이 발생했던 시나리오

  • 3개의 Consumer C0,C1,C2와 3개의 Topic T0,T1,T2를 가정
  • T0은 Partiton 1개, T1은 Partition 2개, T2는 Partition 3개를 가정
  • C0은 T0만, C1은 T0,T1만, C2는 T0,T1,T2를 Subscribe한다고 가정

T0-P0 : C0
T1-P0 : C1
T1-P1 : C1 (C2가 너무 많이 할당되는 것을 방지)
T2-P0: C2
T2-P1: C2
T2-P2: C2

Consumer 0이 제거되고 재할당이 발생한다고 가정

Sticky 방식을 사용하면 재할당 되었을 때 Consumer간 차이가 많이 벌어지지 않도록 Partition의 개수가 더 적은 쪽으로 할당된다.

요약

  • org.apache.kafka.clients.consumer.RangeAssignor : Topic 별로 작동하는 Default Assignor
  • org.apache.kafka.clients.consumer.RoundRobinAssginor : Round Robin 방식으로 Consumer에게 Partition을 할당한다.
  • org.apache.kafka.clients.consumer.StickyAssignor : 최대한 많은 기존 Partition 할당을 유지하면서 최대 균형을 이루는 할당을 보장한다.
profile
현시깁니다

1개의 댓글

comment-user-thumbnail
2024년 3월 18일

안녕하세요 잘봤습니다. 혹시 이미지는 출처가 어떻게 되는지 공유받을 수 있을까요?

답글 달기