개발이 취미인 사람

[Kafka] - Consumer 파티션 전략 본문

백앤드(Back-End)/Kafka

[Kafka] - Consumer 파티션 전략

RyanSin 2024. 11. 17. 20:31
반응형

개요

안녕하세요. 이번 시간에는 컨슈머 파티션 전략에 대해 알아보겠습니다.

 

지난 시간 내용을 놓치고 오신 분들은 학습하고 오시는 걸 추천드리겠습니다.

 

[Kafka] - Consumer 스태틱 멤버십

개요안녕하세요. 이번 시간에는 스태닉 멤버십이라는 개념에 대해 알아보겠습니다. 지난 시간 내용을 놓치고 오신 분들은 학습하고 오시는 걸 추천드리겠습니다.[Kafka] - Consumer 그룹 코디네이

any-ting.tistory.com

 

파티션 전략

이전 프로듀서 학습을 하면서 파티셔너라는 개념에 대해 알아봤습니다. 간단하게 파티셔너는 메시지를 특정 토픽의 어느 파티션으로 전송할지를 결정하는 역할을 했습니다.

 

이와 비슷하게 컨슈머의 동작에서도 특정 토픽의 어느 파티션으로부터 메시지를 읽어 올지를 결정합니다. 컨슈머 그룹의 리더 컨슈머가 정해진 파티션 전략에 따라 각 컨슈머와 대상 토픽의 파티션을 매칭시킵니다. 

컨슈머 파티션 전략은 컨슈머 옵션 partition.assignment.strategy로 표시하며, 레인지 전략(RangeAssignor), 라운드 로빈 전략(RoundRobinAssignor), 스티키 전략(StickyAssignor), 협력적 스티키 전략(CooperativeStickyAssignor)이 있습니다.

 

레인지 파티션 할당 전략(RangeAssignor)

레인지 파티션 할당 전략은 기본 값으로서 토픽별로 할당 전략을 사용하는 전략을 말합니다.

 

레인지 파티션 할당 전략은 먼저 구독하는 토픽에 대한 파티션을 순서대로 나열한 후 컨슈머를 순서대로 정렬합니다. 그런 다음 각 컨슈머가 몇 개의 파티션을 할당해야 하는지 전체 파티션 수를 컨슈머 수로 나눠서 할당합니다.

 

컨슈머 수와 파티션 수가 일치하면 균등하게 할당될 수 있지만 균등하게 나눠지지 않는 경우에는 앞쪽의 컨슈머들은 추가 파티션을 할당받게 됩니다.

레인지 파티션 할당 전략

 

위 그림을 보면 먼저 각 토픽의 파티션을 0, 1, 2 순서대로 정렬하고 컨슈머 그룹에 컨슈머를 1번 2번 순으로 정렬합니다.

그런 다음 전체 파티션 수 / 전체 컨슈머 수로 나눕니다.

 

3에서 2를 나눈 결과로 컨슈머당 하나의 파티션을 할당 받지만 균등하게 나눠지지 않았기 때문에 먼저 정렬된 컨슈머가 나머지 파티션을 추가로 할당받습니다.

 

레인지 파티션 할당 전략은 파티션을 균등하게 할당받지 않기 때문에 이 부분을 고려해야 합니다.

 

라운드 로빈 파티션 할당 전략(RoundRobinAssignor)

라운드 로빈 파티션 할당 전략은 파티션 할당 전략 중 가장 간단한 할당 방식입니다.

말 그대로 전체 파티션과 전체 컨슈머를 나열한 후 라운드 로빈으로 하나씩 하나씩 파티션과 컨슈머를 할당하는 전략입니다.

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

 

스티키 파티션 할당 전략(StickyAssignor)

컨슈머 그룹의 리밸런싱 동작으로 인해 파티션이 재할당된다면 어떤 상황이 벌어질까요? 이전에 알아봤던 레이진 파티션 할당 전략과 라운드 로빈 파티션 할당 전략 모두 파티션 재할당 작업이 발생하면 기존에 매핑됐던 파티션과 동일한 컨슈머가 다시 매핑된다고 보장할 수 없습니다.

 

스티키 파티션 할당 전략은 두 가지 목적으로 컨슈머에 파티션을 할당합니다.

첫 번째 목적은 가능한 한 균형 잡힌 파티션 할당이고 두 번째 목적은 재할당이 발생할 때 되도록 기존의 할당된 파티션 정보를 보장하는 것입니다.

 

두 가지 목적 중에 첫 번째 목적의 우선순위가 더 높습니다. 따라서 스티키 파티션 할당 전략이라고 해서 무조건 기존의 파티션과 컨슈머를 유지하지 않습니다.

 

최대한 컨슈머를 균등하게 분배하는 것을 우선하므로 일부 파티션은 기존의 컨슈머와 매핑을 유지하지 못하고 새로운 컨슈머와 연결될 수도 있습니다.

 

스티키 파티션 할당 전략

 

스티키 파티션 할당 전략은 최초 파티션 할당은 라운드 로빈 파티션 할당 전략과 매우 흡사합니다. 하지만 리밸런싱이 발생하면 두 전략은 달라집니다. 두 차이에 대해 알아보겠습니다.

리밸런싱 - 라운드 로빈 파티션 할당 전략

 

라운드 로빈 파티션 할당 전략을 사용하는 상황에서 리밸런싱이 발생하면 다음과 같은 동작 합니다.

 

  1. 컨슈머 2가 컨슈머 그룹에서 제외됨
  2. 리밸런싱 동작이 발생
  3. 모든 파티션을 순서대로 정렬
  4. 모든 컨슈머를 순서대로 정렬
  5. 라운드 로빈 파티션 할당 전략에 맞춰서 하나씩 하나씩 순차적으로 할당

 

기존에 연결된 파티션을 다시 끊고 재할당이 발생하는 걸 알 수 있습니다.

 

리밸런싱 - 스티키 파티션 할당 전략

 

그럼 스티키 파티션 할당 전략은 라운드 로빈 파티션 할당 전략가 무엇이 다를까요? 리밸런싱이 발생하면 다음과 같이 동작합니다.

 

  1. 컨슈머 2가 컨슈머 그룹에서 제외됨
  2. 리밸런싱 동작이 발생
  3. 기존 컨슈머 1과 3에 할당된 파티션들은 모두 유지
  4. 컨슈머 2에 할당된 파티션들만 컨슈머 1과 3에 각각 할당

스티키 파티션 할당 전략은 최대한 컨슈머들의 균형을 맞추고 기존 컨슈머에 할당된 파티션을 최대한 유지함으로써 컨슈머에 새로 할당하는 파티션 수를 최소화합니다.

 

협력적 스티키 파티션 할당 전략(CooperativeStickyAssignor)

협력적 스티키 파티션 할당 전략은 위에 설명한 스티키 파티션 할당 전략과 동일한 방식입니다. 즉, 리밸런싱이 발생해도 기존의 컨슈머와 파티션 매핑은 유지하고 최소한의 파티션만 컨슈머와 매핑합니다. 

 

하지만 기존에 컨슈머 리밸런싱 동작에서는 내부적으로 EAGER 라는 리밸런스 프로토콜을 사용해 컨슈머 리밸런싱 동작 시 컨슈머에 할당된 모든 파티션을 항상 취소했습니다.

 

모든 파티션을 항상 동시에 취소를 한 이유는 두 가지가 있습니다.

  1. 컨슈머들의 파티션 소유권을 변경해야 한다.
  2. 컨슈머 그룹 내에서 소유권 변경 작업이 동시에 이뤄져야 한다.

이런식으로 리밸런싱 동작에서 컨슈머에 할당된 모든 파티션을 취소했으므로 컨슈머 그룹 전체에서 컨슈머와 파티션 재할당 가능했고 한 번의 리밸런싱 동작으로 모든 컨슈머와 파티션 매핑을 할 수 있었습니다.

 

일반적인 리밸런싱 동작 과정

 

하지만 위 그림처럼 리밸런싱에서 모든 파티션 할당을 취소하는 동작은 리소스를 많이 사용하는 컨슈머 그룹에서는 큰 문제가 발생합니다.

바로 컨슈머들의 다운타임이 발생하기 때문입니다.

 

다운타임이 발생하는 문제 때문에 결국에는 LAG이 급격하게 증가하게 됩니다.

LAG은 컨슈머 지연을 의미하며, 프로듀서가 생성한 메시지와 컨슈머가 처리한 메시징의 차이를 말합니다.

 

위와 같은 이슈를 해결하기 위해서 아파치 카프카 현재 버전(3.7)에서는 협력적 스티키 파티션 할당 전략을 취득하고 있습니다.

 

협력적 스티키 파티션 할당 전략은 기존과 다르게 COOPERATIVE(협력적) 프로토콜을 적용했으며 해당 프로토콜은 리밸런싱이 동작하기  전 컨슈머 상태를 유지할 수 있게 했습니다.

 

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

 

 

컨슈머 상태를 유지하기 위해 현재 동작중인 컨슈머들에게 영향을 주지 않는 상태에서 여러 차례에 걸쳐 리밸런싱을 진행합니다.

안전하게 파티션의 소유권을 이동하기 위해 리밸런싱 작업이 수차례에 걸쳐 진행하는 것도 나쁘지 않다는 아이디어에서 출발했습니다.

 

그 덕분에 다운타임이 발생하지 않았고 기존 컨슈머는 메시지 소비를 문제없이 진행할 수 있게 되었습니다.

 

위 프로세스는 다음과 같은 순서로 진행됩니다.

  1. 컨슈머 그룹에 컨슈머3이 합류를 하면서 리밸런싱이 트리거 됩니다. (1. 감지 단계)
  2. 컨슈머 그룹 내 컨슈머들은 그룹 합류 요청과 자신들이 컨슘하는 토픽의 파티션 정보(소유권)를 그룹 코디네이터로 전송합니다.
    (1. 감지 단계)
  3. 그룹 코디네이터는 해당 정보를 조합해 컨슈머 그룹의 리더에게 전송합니다. (1. 감지 단계)
  4.  컨슈머 그룹의 리더는 현재 컨슈머들이 소유한 파티션 정보를 활용해 제외해야 할 파티션 정보를 담은 새로운 파티션 할당 정보를 컨슈머 그룹 맴버에게 전달합니다.(2. 첫 번째 리밸런싱 단계)
  5. 새로운 파티션 할당 정보를 받은 컨슈머 그룹 맴버들은 현재의 파티션 할당 전략과 차이를 비교해보고 필요 없는 파티션을 골라 제외합니다. 이전의 파티션 할당 정보와 새로운 파티션 할당 정보가 동일한 파티션들에 대해서는 어떤 작업도 수행할 필요가 없습니다.
    (2. 첫 번째 리밸런싱 단계)
  6. 제외된 파티션 할당을 위해 컨슈머들은 다시 합류 요청을 합니다. 여기서 두 번째 리 밸런싱이 트리거됩니다. (3. 두 번째 리밸런싱 단계)
  7. 컨슈머 그룹의 리더는 제외된 파티션을 적절한 컨슈머에게 할당합니다. (3. 두 번째 리밸런싱 단계)

위와 같은 프로세스를 통해 리밸런싱 동작이 늘어났지만 기존 컨슈머에는 영향을 주지 않습니다.

 

이번 시간에는 컨슈머 파티션 할당 전략에 대해 알아봤습니다. 궁금하신 부분은 댓글을 남겨주시면 감사하겠습니다.