* 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 |