[Apache Kafka] Kafka의 주요 개념과 구성 요소

2024. 1. 5. 09:29
반응형

 

 

Apache Kafka는 데이터의 실시간 스트리밍 및 이벤트 처리에 유용한 도구로서 활용된다.

Kafka는 대규모 분산 시스템에서 안정적이고 확장 가능한 메시지 큐와 이벤트 스트리밍 플랫폼으로 사용되어, 데이터의 실시간 처리 및 분석에 사용된다.

여러 대의 Application의 로그 및 데이터를 수집하여 집계하거나, 서버들 간의 데이터 동기화를 위한 메세지 교환을 위해서 Kafka는 매우 유용한 수단이 될 수 있다.

 

 


 

Kafka의 주요 특징

 

  1. Event-Oriented : Kafka는 이벤트 스트리밍 플랫폼으로서, 발생하는 이벤트가 중심이 되어 시스템이 구성된다. 이벤트를 실시간으로 수집하고 처리한다. 
  2. Publish-Subscribe 모델
    1. Consumer(메시지를 받는 주체)가 어느 Topic(카테고리라고 생각하면 된다)에 대해서 메시지를 구독할 수 있다.
    2. Producer(메시지를 보내는 주체)가 메시지를 Topic에 발행한다
    3. Consumer은 구독한 Topic에 대해서 메시지를 실시간으로 스트리밍을 통하여 받을 수 있다.
  3. 분산 아키텍처: Kafka는 여러 브로커 노드로 이루어진 분산 시스템으로 구성되어 있다. 
  4. 확장성(Scale out): Kafka 클러스터는 여러 대의 서버로 확장 가능하며, 수천 대의 브로커와 수십만 개의 Partition으로 이루어진 대규모 클러스터를 구성할 수 있다.

 

 


 

구성 요소

 

 

https://upload.wikimedia.org/wikipedia/commons/archive/6/64/20220928031805%21Overview_of_Apache_Kafka.svg

 

 

Cluster: 여러 대의 컴퓨터가 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합. 카프카는 데이터를 신속하게 분산 처리하고 병렬로 처리할 수 있도록 여러 Broker(최소 3개)로 이루어진 분산 시스템이다.

 

Event: 카프카에서 데이터를 읽거나 쓸 때에는 이벤트 기반이며, Message라고도 불린다. 

  • 이벤트는 Key, Value, Timestamp로 구성된다.
  • 메시지는 파일시스템 단위로 실제로 저장되며, 일정 기간에 따라 삭제 또는 압축된다.

Producer: 데이터를 생성하고 Kafka 클러스터로 전달하는 주체. 데이터를 카프카 토픽에 발행(Publish)하여 브로커에 전송한다.

 

Consumer: Kafka 클러스터에서 데이터를 소비하는 주체. 특정 토픽에서 메시지를 소비하여 처리하거나 저장할 수 있다.

  • Consumer Group : 목적에 따라 모인 다수의 Consumer들의 그룹

Broker: 카프카 클러스터를 구성하는 서버 노드를 의미한다. 데이터를 Producer로부터 받아 토픽에 저장하고, Consumer에게 필요한 데이터를 전달하는 중개자(Broker) 역할

 

Topic: 메시지를 구분하기 위한 카테고리화된 주제. Producer가 메시지를 발행하는 곳이며, Consumer는 특정 토픽에서 메시지를 소비한다. Topic은 1개 이상의 Partition으로 분할된다.

 

Partition: 토픽을 Storage에 물리적으로 나누어 데이터를 저장하는 단위. 특정 토픽의 데이터를 여러 파티션에 분산하여 저장하여 Scale-out이 가능하며, 각 파티션은 별도의 브로커에 저장될 수 있다. 데이터를 효율적으로 분산하고 병렬 처리할 수 있도록 한다.

  • 한 Consumer Group의 Consumer 개수가 여러개이면 각각의 파티션을 담당하여 병렬처리에 유용해지며, 최대 Partition의 개수만큼 그룹을 구성해야 한다.
  • 목적에 따라서 Consumer 그룹을 여러 개 나누어 사용하기도 한다.

다음 그림을 보면, 하나의 토픽은 파티션으로 분할된다.

클라이언트 응용 프로그램이 동시에 많은 브로커에서 데이터를 읽고 쓸 수 있도록 할 수 있다.

각각의 파티션의 레코드들에는 일련번호 Offset이 지정되게 된다.

 

 

Replication

각각의 브로커들은 Topic의 Partition들을 분할하여 나누어 가져 담당하게 된다. 이 때 Fault Tolerance를 위하여 파티션들을 복제하며, 브로커들은 리더 파티션과 팔로워 파티션을 나누어 가지게 된다.

  • 리더 파티션 : 브로커에 할당된 주담당 파티션, Kafka 클라이언트와 데이터를 주고받는 역할
  • 팔로워 파티션 : 리더 파티션으로부터 레코드를 Replication(복제)하여, 리더 파티션의 Fault를 대비할 수 있다.
  • ISR : 리더 파티션 + 팔로워 파티션의 동기화된 묶음

 

 

 

Controller와 Zookeeper

https://www.elastic.co/kr/blog/how-to-monitor-containerized-kafka-with-elastic-observability (Elastic 공식 사이트)

 

3대 이상의 브로커로 클러스터가 구성되며, Coordinator로서 Zookeeper를 사용하게 된다. 

 

Controller: 브로커들 중 1대는 Controller로서, 각각의 파티션에게 담당 파티션을 할당하고, 모니터링을 하는 역할을 수행하게 된다.

 

Zookeeper: Broker들의 Coordinator로서의 역할을 하며, Broker ID와 그 중 Controller의 ID가 무엇인지 등 메타데이터를 저장한다.

 

서버 (Broker): Kafka의 서버는 데이터의 중앙 집중적인 처리와 저장을 담당하는 브로커들이다. Kafka 클러스터는 여러 개의 브로커로 구성될 수 있고, 클러스터 내에서 Topic에 속한 데이터를 저장하고, Producer와 Consumer 사이에서 데이터를 전달하며 중개 역할을 한다.

 

클라이언트 (Producer 및 Consumer) : 클라이언트는 데이터를 생성하고 소비하는 프로듀서와 컨슈머가 해당한다. 데이터를 생성하고 Kafka 토픽으로 보내며 이를 소비한다.

 

 


Kafka의 주요 클라이언트 및 관련 도구

 

 

Kafka Client

 

 

Kafka와 데이터를 주고받기 위해 사용되는 Java 기반 라이브러리

다양한 써드파티 라이브러리 존재 : C, Node.js, Python 등..

Kafka Broker 버전과 클라이언트 버전의 호환성 확인이 필요하다.

 

주요 사용처

  • 데이터를 프로듀스(생산)하고 컨슈머(소비자)로 데이터를 읽어오는 등의 작업을 수행
  • 애플리케이션이 이벤트를 생성하여 Kafka 토픽으로 전송하고, Kafka 토픽에서 데이터를 읽어와 필요한 작업을 수행하거나 저장소에 저장

Kafka Connect

 

 

Connect를 사용하면 Source System(특정 데이터 소스, 스토리지)에서 Target System(다른 데이터 소스, 스토리지)으로 별도의 소스코드 없이 데이터 이동을 자동화시킬 수 있다. 

 

Kafka Connect Source

  • 외부 소스(예: 데이터베이스, 파일, 메시지 큐)로부터 데이터를 가져와 Kafka 토픽으로 데이터를 전송하는 커넥터.
  • Producer의 역할을 수행한다.
  • Source 커넥터는 데이터를 추출하여 Kafka 토픽에 쓰기 작업을 수행한다.
  • Source 커넥터에서 처리되기 전에 데이터 변환 작업을 수행할 수 있다.

Kafka Connect Sink

  • Kafka 토픽으로부터 데이터를 읽어와 외부 저장소(예: 데이터베이스, 파일 시스템)에 데이터를 쓰는 커넥터.
  • Consumer의 역할을 수행한다.
  • Sink 커넥터는 Kafka 토픽에서 데이터를 소비하여 외부 저장소로 데이터를 전송.
  • Sink 커넥터에서 처리되기 전에 데이터 변환 작업을 수행할 수 있다.

 

 

예시

1. Source System(MySQL)에서 변경된 데이터를 Source Connector가 읽어오고, 이때 Source Connector에서 데이터를 적절한 형식으로 변환한다.

2. Source Connector에서는 변환된 데이터를 Kafka 토픽으로 전송하기 전에 직렬화한다. 이 직렬화된 데이터가 Kafka Producer API를 통해 Kafka 클러스터에 전송된다. 직렬화 방식을 임의로 지정할 수 있으나, 역직렬화 할 때와 동일해야 한다.

3. Kafka Cluster은 해당 Topic의 파티션에 바이트 형식으로 데이터를 저장한다.

4. Sink Connector가 Topic에서 데이터를 소비할 때 Producer가 사용한 직렬화 형식과 일치하는 역직렬화 방식을 사용하여 데이터를 변환한다.

5. Kafka 토픽에서 데이터를 소비하고 Target System인 MongoDB에 저장한다.

 

 

주요 사용처

  • 데이터를 Kafka로 가져오거나 Kafka에서 다른 시스템으로 데이터를 전송하는 ETL (Extract, Transform, Load) 작업을 수행
  • 데이터 소스 연결: RDBMS, 로그 파일, 메시지 큐 등의 다양한 데이터 소스에서 데이터를 Kafka로 가져올 때 사용
  • 데이터 타겟 연결: Kafka에서 데이터를 가져와 다른 저장소 또는 시스템으로 전송할 때 사용

 

 


Kafka Streams

데이터를 변환하기 위한 목적으로 사용하는 API

장애가 발생하더라도 여러 번 실행, Exectly-Once 처리를 통해 Fault Tolerence를 유지

 

주요 사용처

  • Kafka 토픽으로부터 스트림 데이터를 읽어와 실시간으로 변환, 집계, 필터링 등의 작업을 수행 가능하다.
  • Stream을 사용하여 이벤트 기반의 마이크로서비스 아키텍처를 구축

 


Kafka Mirror Maker

특정 카프카 클러스터(소스 클러스터)에서 다른 카프카 클러스터(타겟 클러스터) 간의 토픽을 전송하여 복제(Replication)하기 위한 도구

데이터 센터 간이나 클라우드 간에 데이터를 안전하게 복제하고, 고가용성 및 장애 복구 용도로 활용 가능하다.

 

주요 사용처

  • 다중 데이터 센터 복제: 한 데이터 센터에서 생성된 데이터를 다른 데이터 센터로 복제

 

 

 

 

 

 

 

 

반응형

BELATED ARTICLES

more