kafka

카프카 / 컨슈머의 내부동작 원리

25G 2023. 10. 19. 17:55

컨슈머 오프셋 관리

컨슈머의 동작 중 가장 핵심은 오프셋 관리입니다. 컨슈머는 카프카에 저장된 메시지를 꺼내오는 역할을 하기 때문에 컨슈머가 메시지를 어디까지 가져왔는지를 표시하는것은 매우 중요합니다. 컨슈머가 어떠한 문제로 동작을 멈추고 재시작하는 경우나 컨슈머가 구동중인 서버에 문제가 발생해서 다른 컨슈머가 역할을 대신하는등 새로운 컨슈머가 메시지를 가져올 수 있어야만 장애로 부터 빠르게 복구 될 수 있습니다.

오프셋?

  • 카프카에서 메시지의 위치를 나타내는 위치를 오프셋이라고 부르고 오프셋은 숫자 형태로 나타냅니다. 컨슈머 그룹은 자신의 오프셋 정보를 카프카에서 가장 안전한 저장소인 토픽에 저장합니다.

그룹 코디네이터

컨슈머들은 하나의 컨슈머 그룹의 구성원이 되고 컨슈머 그룹 내의 각 컨슈머들은 서로 자신의 정보를 공유하면서 하나의 공동체로 동작합니다. 이때 컨슈머개인? 의 변화가생겨 나가거나 들어왔을때 컨슈머 그룹에서 각 컨슈머들에게 작업을 균등하게 분해하는 동작을 컨슈머리벨런싱 이라고 합니다.
그리고 컨슈머 그룹역시 그룹 코디네이터라는 안정적인 컨슈머 그룹관리를 위해 별도의 코디네이터가 존재합니다.

그룹코디네이터의 목적은 컨슈머 그룹이 구독한 토픽의 파티션들과 그룹의 맴버들을 트래킹 하는것입니다. 그로인해 파티션 또는 그룹의 멤버에 변화가 생기면 작업을 균등하게 재분배 하기 위해 컨슈머 리벨런싱 동작이 발생합니다.
그룹 코디네이터는 각 컨슈머 그룹별로 존재합니다.

컨슈머 그룹 동작순서

  1. 컨슈머는 컨슈머 설정값 중에서 bootstrap .brokers 리스트에 있는 브로커에게 컨슈머 클라이언트와 초기 커넥션을 연결하기 위한 요청을 보냅니다.
  2. 해당 요청을 받은 브로커는 그룹 코디네이터를 생성하고 컨슈머에게 응답을 보냅니다. 컨슈머 그룹의 첫 번째 컨슈머가 등록될 때까지 아무작업도 일어나지 않습니다.
  3. 그룹 코디네이터는 group.initial.rebalance.delay.ms의 시간 동안 컨슈머의 요청을 기다립니다.
  4. 컨슈머는 컨슈머 등록 요청을 그룹 코디네이터에게 보냅니다. 이때 가장 먼저 요청을 보내는 컨슈머가 컨슈머 그룹의 리더가 됩니다.
  5. 컨슈머 등록 요청을 받은 그룹 코디네이터는 해당 컨슈머 그룹이 구독하는 토픽 파 티션 리스트 등 리더 컨슈머의 요청에 응답을 보냅니다.
  6. 리더 컨슈머는 정해진 컨슈머 파티션 할당 전략에 따라 그룹 내 컨슈머들에게 파티션을 할당한 뒤 그룹 코디네이터에게 전달합니다.
  7. 그룹 코디네이터는 해당 정보를 캐시하고 각 그룹 내 컨슈머들에게 성공을 알립니다.
  8. 각 컨슈머들은 각자 지정된 토픽 파티션으로부터 메시지들을 가져옵니다

스태틱 멤버쉽

대용량 메시지들을 처리하는 컨슈머 그룹이라면 리벨런싱 동작으로 인해 원래 상태를 복구하는데 상당한 시간이 소요 될 수 있습니다. 이런 불필요한 리벨런싱을 방어하기 위해 카프카 2.3버전 부터 스태틱 멤버십이라는 개념이 도입됐습니다.

스태틱 멤버쉽이란?

컨슈머 그룹내에서 컨슈머가 재시작 등으로 그룹에서 나갔다가 다시 합류하더라도 리벨런싱이 일어나지 않게 합니다. 즉 컨슈머마다 인식할 수 있는 ID를 적용함으로써 다시 합류하더라도 그룹 코디네이터가 기존 구성원임을 인식할 수 있게 하는 것입니다.
스태틱 멤버십 기능이 적용된 컨슈머는 그룹에서 떠날 때 그룹 코디네이터에게 알리지 않으므로 불필요한 리밸런싱도 발생하지 않습니다.

컨슈머 파티션 할당 전략

프로듀서의 파티셔너라는 기능은 레코드를토픽의 어느 파티션으로 전송ㅇ할지를결정하는 역할을 했습니다. 컨슈머의 동작에서도 이와 유사하게 대상 토픽의 어느 파티션으로 부터 레코드를 읽어 올지를 결정합니다.
컨슈머 그룹의 리더 컨슈머가 정해진 파티션 할당 전략에 따라 각 컨슈머와 대상 토픽의 파티션을 매칭시킵니다.
파티션 할당 전략은 컨슈머 옴션의 partition, assignment.strategy로 표시하며, RangeAssigno(레인지 전략), RoundRobinAsstgnor(라운드 로빈 전략), StixkyAsstgnor(스티키 전략),CooperativeStixkyAssignor(협력적 스티키 전략)라 는 총 네 가지를 제공합니다.

  • 레인지 파티션 할당 전략 - 파티션 할당전략의 기본값, 토픽별로 할당 전략을 사용함, 동일한 키를 이용하는 2개 이상의 토픽을 컨슘할 때 유용
  • 라운드 로빈 파티션 할당 전략 - 사용가능한 파티션과 컨슈머들을 라운드 로빈으로 할당 균등한 분배가능
  • 스티키 파티션 할당 전략 - 컨슈머가 컨슘하고 있는 파티션을 계속 유지할 수 있음
  • 협력적 스티키 파티션 할당 전략 - 스티키 방식과 유사하지만, 전체 일시 정지가 아닌 연속적인 재조정 방식

레인지 파티션 할당 전략

레인지 파티션 할당 전략인 RangeAssignor는 파티션 할당 전략중 기본값으로서, 각 토픽별로 할당 전략을 사용하게 됩니다. 먼저 구독하는 토픽에 대한 파티션을 순서대로 나열한 후 컨슈머를 순서대로 정렬합니다. 그 후 각 컨슈머가 몇개의 파티션을 할당해야 하는지 전체 파티션 수를 컨슈머 수로 나눕니다.
불균형한 레인지 파티션 할당 전략을 사용하는 이유는 동일한 레코드 키를 사용하고 하나의 컨슈머 그룹이 동일한 파티션 수를 가진 2개 이상의 토픽을 컨슘할때 유용할 수 있습니다. 이와같은 특수한 경우에 좋지만 컨슈머에 균등하게 파티션이 분배돼야 하는 작업에서는 비효율 적입니다.

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

컨슘해야 하는 모든 파티션과 컨슈머 그룹 내 모든 컨슈머를 나열한 후 라운드 로빈으로 하나씩 파티션과 컨슈머를 할당하는 전략입니다.

스티키 파티션 할당 전략

컨슈머 그룹의 리밸런싱 동작으로 인해 파티션이 재할당 된다면 기존에 매핑됐던 파티션과 동일한 컨슈마가 다시 매핑되리라고는 보장할 수 없습니다. 이러한 재 할당 작업이 발생하더라도 기존에 매핑됐던 파티션과 컨슈머를 최대한 유지하려고 하는 전략이 스티키 파티션 할당전략입니다.
해당전략을 사용하는목적은 두가지 목적으로 첫번째는 가능한 균형잡힌 파티션 할당이고, 두번째 목적은 재할당이 발생할때 되도록 기존의 할당된 파티션 정보를 보장하는 것입니다. 둘중에 첫번째 목적의 우선순의가 더 높습니다.
재할당 동작 원리

  • 컨슈머들의최대 할당된 파티션의 수의 차이는 1
  • 기존에 존재하는 파티션 할당은최대한 유지함
  • 재할당 동작 시 유효하지 않은 모든 파티션 할당은 제거함
  • 할당되지 않은 파티션들은 균형을 맞추는 방법으로 컨슈머들에 할당

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

스티키 파티션 할당전략과 결과적으론 동일한 방식입니다. 한가지 차이점이 있다면 컨슈머 그룹 내부의 리벨런싱 동작이 한층 더 고도화 됐다는 점입니다.
해당전략은 안전하게 파티션의 소유권을 이동하기 위해 리밸런싱 작업이 수차례 걸쳐 진행하는 것도 나쁘지 않다는 아이디어에서 출발했습니다.

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

'kafka' 카테고리의 다른 글

카프카 버전업그레이드  (0) 2023.10.19
카프카 운영,모니터링  (1) 2023.10.19
프로듀서 내부동작원리  (1) 2023.10.19
카프카의 내부 동작 원리  (1) 2023.10.19
카프카 도입 컷트라인  (0) 2023.10.19