본문 바로가기

Kafka

[Kafka] Partition Assignment Strategy

* Partition Assignment Strategy 설정은 Consumer의 설정 파라미터 중에서 partition.assignment.strategy 값을 아래 표와 같이 변경하여 할당 방식을 조정할 수 있다.

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

ReangeAssignor

  • Default Assignor
  • 토픽 별로 Partition 순서대로 Consumer에게 할당된다.
  • Partition 개수보다 Consumer 개수가 더 크면, Partition을 할당받지 못하는 Consumer가 발생할 수 있다.

* 해당 전략을 사용하는 유형: Order ID를 Key로 가지고 있는 order_status 데이터(Topic 0)와 order_list 데이터(Topic 1)를 Order 관련 데이터를 처리하는 Consumer에게 모두 할당할 수 있다. -> Topic들 간의 Partition 개수가 동일해야 한다.


Round Robin Assignor

  • Round Robin 방식으로 Partition들과 Consumer들을 분배하여 할당한다.
  • Topic 관계없이, Partition 순서대로 Consumer에 할당한다.
  • Partition이 추가되거나 삭제되어 Reassign(재할당)이 발생하면, Consumer가 기존에 처리하던 Partition을 다시 할당받을 수 있다는 보장이 없다.

* Round Robin 방법 -> 할당 불균형 발생 가능

Consumer 0는 Topic 0만, Consumer 1는 Topic 0, Topic 1, Consumer 2는 Topic 0, Topic 1, Topic2를 Subscribe 할 수 있다고 가정하면 위와 같은 할당 불균형이 발생할 수 있다.
즉, Consumer 간 Subscribe 해오는 Topic이 다를 경우, 할당 불균형이 발생할 수 있다.


Sticky Assignor

  • Round Robin 방식보다 균형적이면서, Range 방식보다 Reblancing 오버헤드를 줄인 방식이다.
  • 가능한 한 균형적으로 할당을 보장한다. -> Consumer A가 Consumer B에 비해 2개 이상 더 적은 Topic Partition이 할당된 경우, Consumer A에 할당된 Topic의 나머지 Partition들은 Consumer B에게 할당되지 않는다.
  • 재할당이 발생했을 경우, 기존 할당을 최대한 많이 보존한다. -> Topic Partition의 Consumer 간 이동 오버헤드를 줄인다.

* 할당 방식

  • Round Robin과 할당 방식은 비슷하다.

* 재할당 방식
상황: Consumer 1 제거

  • Round Robin Assignor의 경우 할당 방식과 마찬가지로 순서대로 다시 할당된다. -> 전체를 다시 할당
  • Sticky Assignor의 경우 제거 전 상태에서 할당이 끊긴 Partition들을 최대한 분산되게 할당한다. -> 기존 할당은 유지하면서, 나머지 부분을 할당

* 할당 불균형의 발생 가능성이 줄어든다.

Consumer 0는 Topic 0만, Consumer 1는 Topic 0, Topic 1, Consumer 2는 Topic 0, Topic 1, Topic2를 Subscribe 할 수 있다고 가정

  • Topic 1 - Partition 1을 Consumer 2에 할당하려고 할 때, Consumer 2는 할당받을 Partition 개수가 많아 Consumer 2에 할당하는 것이 아닌 Consumer 1에 할당한다.

** Round Robin과 비교
상황: Consumer 0 제거

  • Round Robin 방식은 Consumer 0에 장애가 발생하면 전체 재할당이 진행된다.
  • Sticky Assignor 방식은 Consumer 2에 너무 많은 Partition이 할당되지 않도록 기존 할당은 유지하면서, Topic 0 - Partition 0을 Consumer 1에 할당한다.

Cooperative Sticky Assignor

Eager Rebalancing 프로토콜은 하나의 Consumer가 Consumer Group에 새로 추가되거나 삭제되면, Group 내 모든 Consumer가 작업을 멈추고 다시 JoinRequest부터 시작하여 Partition을 할당받는다.

  • 안전하지만, Reassign 동안 작업을 수행할 수 없다.
  • 변하지 않는 Partition 역시 Reassign이 발생한다.

Incremental Cooperative Rebalancing 프로토콜Eager Rebalancing 프로토콜의 단점을 보완하기 위해 만들어졌다.

  • Consumer A가 Partition 1, Partition 2를 작업하고 있는 도중, Consumer B가 Consumer Group에 들어온다면 Consumer B에게 할당시킬 Parititon 2만 작업을 중지하고 Partition 1은 Reassign 과정에도 Consume이 진행된다.
  • 문제점: Consumer는 자신의 Partition 중 어느 것을 다른 곳으로 재할당 시켜야 하는지 모른다.

Cooperative Sticky Assignor 프로토콜은 Incremental Cooperative Rebalancing 프로토콜의 문제점을 해결하기 위해서 만들어졌다.

  • Rebalancing을 두 번 수행한다.
  • Apache kafka 2.5에서 추가되었다.
  • 하나의 Consumer가 Consumer Group에 새로 추가되거나 삭제될 때, 각 Consumer들은 보유하고 있는 Partition 들을 그대로 보유하고 그 정보를 Group Coordinator에게 보낸다.
  • Sync Group Response를 받을 때, Group Coordinator로부터 어떤 Partition을 Reassign 할 것인지 정보를 받는다.
  • 이후 소유권을 이전시킬 Partition만 Revoke를 시키고 나머지 Partition은 정상 동작하면서 Rebalancing 작업을 한 번 더 수행한다.
  • 빈번히 Rebalancing 작업이 이루어지는 상황이거나 Scale In/Out으로 인한 다운 타임이 우려될 때 사용하면 좋다.

'Kafka' 카테고리의 다른 글

[Kafka] Exactly Once Semantics(EOS)  (0) 2022.10.17
[Kafka] Kafka Log File  (0) 2022.10.15
[Kafka] Replication (2)  (1) 2022.10.13
[Kafka] Replication (1)  (0) 2022.10.12
[Kafka] Consumer (2)  (0) 2022.10.11