Data Engineering/Kafka

Kafka의 구조와 원리

신수동탈곡기 2021. 7. 4. 18:18

Kafka


비동기 처리를 위한 메시지 큐의 한 종류

메일서비스 와의 비교

메일이 대표적인 비동기 메시징 시스템이다. 메일과 비교하면 kafka를 이해하기 용이하다.

메일의 경우 보내는 사람은 받는 사람의 상태와 상관업이 메일 서버로 메시지를 보낼 수 있다. 보낸 메시지는 메일 서버에 저장되며 받는 사람은 원하는 시간에 메일을 볼 수 있다.

카프카도 유사하다. 프로듀서는 카프카로 메시지를 보내고 해당 메시지는 카프카 서버(브로커)에 저장되어 보관한다. 그리고 컨슈머는 필요할 때 카프카 서버에 저장되어 있는 메시지를 가져갈 수 있다.

여러 대의 분산 서버에서 대량의 데이터를 처리하는 분산 메시징 시스템. 원천 시스템으로부터 대규모 트랜잭션 데이터가 발생했을 때 중간에 데이터를 버퍼링하면서 타깃 시스템에 안정적으로 전송해 주는 시스템이 필요한데, 카프카가 그와 관련된 기능과 아키텍쳐를 제공한다.

kafka 아키텍쳐


Kafka Cluster

카프카 서버로 이루어진 클러스터

broker

카프카 서버

zookeeper

분산 코디네이션 시스템. 각각의 broker를 하나의 클러스터로 코디네이팅, 리더 채택 등의 역할을 한다.

topic

메시지가 생산되고 소비되는 주제. 주제에 따라 여러 topic을 생성할 수 있다. (ex. topic_service_A, topid_service_B) producer는 특정 topic의 메시지를 생성하고 해당 메시지를 broker에 전달한다. broker가 전달받은 메시지를 topic별로 분류하여 쌓아놓으면 해당 topic을 구독하는 consumer들은 메시지를 알아서 가져가고 처리한다.

partition

각 topic에서 얼마나 데이터를 분산하여 처리하는가의 단위. 한 topic에 3개의 partition이 있다면 3개의 partition에 메시지가 분산되어 저장된다. queue 방식으로 저장되므로 메시지는 partition의 마지막에 저장되어 partition 내에서는 메시지의 순서가 보장되지만 partition 끼리의 순서는 보장해주지 않는다.

leader, follwer

Kafka에서는 각 파티션 당 복제된 파티션 중에서 하나의 리더가 선출된다. 리더에만 메시지에 대한 읽기, 쓰기 연산이 수행되며 팔로워(리더를 제외한 파티션들)는 리더의 데이터를 복사만 하는 역할을 한다. 리더가 죽었을 경우 팔로워 중 하나가 리더가 되어야 하기 때문에 팔로워는 리더와 싱크를 맞추고 있는 것이다. (In-Sync Replica, ISR) 시스템 장애에 대한 가용성을 갖출 수 있다.

offset

partition의 각 메시지를 식별할 수 있는 유니크한 값. 메시지를 소비하는 consumer가 읽을 차례를 의미하며 partition마다 별도로 관리된다.

Producer

producer는 정해진 topic에 메시지를 기록한다. partition이 여러개일 경우 기록될 partition은 round-robin 방식을 따른다.

Consumer group

Consumer의 집합을 구성하는 단위. Kafka에서는 consumer group으로 데이터를 처리하며, consumer group 안의 consumer 수만큼 파티션의 데이터를 분산처리한다.

consumer group은 하나의 topic을 담당한다. 즉 하나의 topic에 여러개의 consumer group이 접근할 수 있지만, 하나의 consumer group이 여러개의 topic의 메시지를 받아올 수는 없다.

consumer group이 존재하는 이유

  • partition에 접근하는 consumer instance 관리
    • consumer group 내에서 consumer instance들은 topic의 partition에서 다음에 소비할 offset이 어디인지 공유하면서 메시지를 소비한다.
      • consumer group이 없고 하나의 partition에 두 개의 consumer가 동시에 접근하는 경우, consumer가 몇 번의 offset을 소비해야 하는지 알 수 없다.
      • 즉, consumer group을 통해 하나의 partition에는 하나의 consumer instant만 접근할 수 있도록 관리한다.
  • offset을 공유하여 고가용성 확보
    • 하나의 partition에는 하나의 consumer instant만 접근할 수 있기 때문에, 특정 consumer instance에 장애가 발생했을 시, 다른 consumer instance는 장애가 발생한 consumer instance가 소비하던 partition을 소비해야 한다.
    • 이러한 장애에 대비하여 같은 group 내의 consumer instance들은 offset을 공유하며 고가용성을 확보한다.

기존 메시징 시스템과의 차이 (ex. RabbitMQ)


  • 분산 시스템을 기본으로 설계되었기 때문에 기존 메시징 시스템에 비해 분산 및 복제 구성이 용이하다.
  • 기존 메시징 시스템은 broker가 consumer에게 메시지를 push하는 방식이라면, kafka는 consumer가 broker로부터 직접 메시지를 가지고 가는 pull 방식으로 동작한다. consumer는 자신의 처리능력 만큼의 메시지만 broker로부터 가져오기 때문에 최적의 성능을 낼 수 있다.

보충할 점


  • RabbitMQ vs Kafka
  • consumer group 별 offset을 가짐으로서 얻는 이점

Reference