본문 바로가기
BackEnd/Project

[BigData] Ch10. Kafka의 기본 개념

by 개발 Blog 2024. 9. 16.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

 

현대의 데이터 처리에서 실시간성과 확장성은 필수적이다. Kafka는 이러한 요구를 충족시키기 위해 개발된 고성능의 분산 메시징 시스템이다. 이 장에서는 Kafka의 기본적인 개념과 구조, 그리고 사용 방법에 대해 알아본다.

 

Kafka란?

Kafka는 Apache Software Foundation에서 개발한 오픈 소스 메시지 브로커 프로젝트로, 대용량의 실시간 로그 처리를 가능하게 하는 분산 스트리밍 플랫폼이다. Kafka는 이벤트 또는 메시지 전송을 목적으로 사용되며, 대규모 데이터 파이프라인을 구성하는 데에 주로 쓰인다.

목적 및 사용 방법

  • 목적: Kafka는 데이터의 실시간 처리와 분산 데이터 스트리밍을 목적으로 한다.
  • 사용 방법: Kafka는 메시지를 빠르고 안정적으로 전송하는 pub/sub 시스템을 기반으로 한다. 생산자(Producer)는 메시지를 생성하여 Kafka에 전달하고, 소비자(Consumer)는 필요한 메시지를 구독하여 사용한다.

주요 특징 및 장점

  • 고가용성 및 빠른 처리: Kafka는 분산 시스템으로 설계되어 있어 고가용성과 빠른 데이터 처리를 지원한다.
  • 확장성: Kafka는 수평적으로 확장이 가능하며, 클러스터 내에서 여러 서버(broker)에 걸쳐 데이터를 분산 저장할 수 있다.

주요 구성 요소

  • Broker: Kafka 시스템의 기본 구성 요소로, 클러스터의 각 서버를 의미한다.
  • Zookeeper: Kafka의 브로커들 사이에서 조정자 역할을 하며, 메타데이터, 컨트롤러, 토픽, 파티션 정보를 관리한다.
  • Producer/Consumer: Kafka에서 데이터의 생산자와 소비자를 의미한다. Producer는 데이터를 Kafka로 보내고, Consumer는 데이터를 Kafka로부터 받는다.

고려 사항 및 한계

  • 순서 보장의 어려움: Kafka는 높은 처리량을 위해 최적화되어 있으나, 엄격한 순서 보장이 필요한 경우 관리가 복잡해질 수 있다.
  • 소규모 사용의 한계: 매우 작은 데이터나 단일 서버 운영에는 오버헤드가 클 수 있다.

Kafka의 발전

  • KSQL, Kafka Connect, Kafka Streams: 이들은 Kafka를 더욱 다양하고 유연하게 사용할 수 있게 하는 추가 모듈들이다.
  • KRaft: 최근 Kafka는 Zookeeper 의존성을 제거하기 위해 KRaft를 도입하고 있으나, 아직 안정적인 단계에 이르지는 않았다.

Kafka는 실시간 데이터 스트리밍과 빅데이터 처리를 위한 강력한 툴이며, 여러 산업에서 로그 처리, 실시간 분석, 이벤트 소싱 등 다양한 용도로 활용되고 있다.

 

Zookeeper와 Kafa의 역할

Zookeeper의 역할

Zookeeper는 Kafka 클러스터의 조정자 역할을 하며, 클러스터 전체의 상태를 안정적으로 유지하는 데 중요한 역할을 한다. 주요 기능은 다음과 같다.

  1. 메타데이터 관리: Zookeeper는 Kafka 클러스터의 브로커, 토픽, 파티션 등에 대한 메타데이터를 저장하고 관리한다.
  2. 컨트롤러 관리: 클러스터 내의 브로커 중 하나를 컨트롤러로 선출하며, 이 컨트롤러는 토픽과 파티션의 생성, 복제 관리 등의 중요한 역할을 담당한다.
  3. 상태 유지 및 복구: 클러스터의 정상적인 운영을 보장하기 위해 브로커의 상태를 모니터링하고, 장애 발생 시 복구 작업을 조정한다.

Kafka의 역할

Kafka는 메시지 브로커로서, 대규모 메시지의 저장 및 전송을 담당한다. Kafka의 주요 역할은 다음과 같다.

  1. 데이터 저장 및 전송: Kafka는 높은 처리량을 지원하며, 대용량의 데이터를 빠르게 저장하고, 다수의 소비자에게 효율적으로 데이터를 전달한다.
  2. 확장성 및 내구성: Kafka는 분산 시스템 설계를 기반으로 하여 확장성이 뛰어나며, 데이터를 여러 브로커에 복제함으로써 높은 내구성을 제공한다.
  3. 실시간 처리 지원: Kafka는 실시간 데이터 스트리밍을 지원하여, 실시간 분석 및 처리가 필요한 응용 프로그램에 적합하다.

CMAK (Kafka Manager)를 통한 관리

CMAK는 Kafka 클러스터를 관리하기 위한 GUI 도구로서, 클러스터의 운영을 간편하게 만들어 준다. 주요 기능은 다음과 같다.

  • 클러스터 모니터링: 클러스터의 상태, 성능 지표를 실시간으로 모니터링한다.
  • 토픽 관리: 토픽의 생성, 조회, 삭제 및 설정 변경을 관리한다.
  • 파티션 관리: 파티션의 추가, 재분배 및 리더 변경을 통해 클러스터의 성능 및 균형을 조정한다.
  • 소비자 관리: 소비자 그룹의 상태를 확인하고, 메시지 처리 지연(lag)을 모니터링한다.

Kafka Objects

  • Topic
    폴더와 같은 개념이며, 특정 목적으로 생성된 데이터 집합을 의미한다. 여러 개의 주제를 구분하기 위해 사용된다.
  • Partition
    하위 폴더처럼 Topic의 하위 개념으로, 데이터를 분산하여 처리하기 위해 나누는 단위이다. 각 Partition에는 leader와 follower가 존재하며, 실제 데이터의 읽기/쓰기는 리더에서 발생한다. Follower는 Leader를 복사하는 역할을 한다.
  • Replica
    Leader의 장애에 대비해 만들어지는 복사본으로, Follower라고도 불린다. Follower는 Pull 방식으로 Leader에서 데이터를 복제해 온다.
    • ISR(In Sync Replica)
      Replica 그룹을 의미하며, Leader로 전환될 수 있는 Replica Partition의 그룹이다. Leader는 commit 상태와 lag를 확인하여 그룹에서 Replica를 제외하기도 한다.
  • Producer
    데이터를 발행하는 주체로, 클라이언트 역할을 한다.
  • Consumer
    데이터를 구독하는 주체로, 역시 클라이언트 역할을 한다.
  • Offset
    책갈피와 같은 개념으로, Consumer가 어디까지 데이터를 가져갔는지 저장하는 값이다. Consumer Group마다 서로 다른 값을 가질 수 있다.
 

Kafka Cluster 구조

아래 이미지는 Kafka 클러스터의 핵심 구성 요소와 그 상호 작용을 보여준다. Kafka 클러스터는 여러 Kafka Broker 인스턴스로 구성되며, 각 인스턴스는 하나 이상의 Topic을 관리한다. Broker는 Kafka의 기본 저장 단위인 Topic에 데이터를 저장한다. 각 Topic은 여러 Partition으로 나뉘어 있으며, 이들은 데이터의 병렬 처리와 고가용성을 지원하기 위해 분산 저장된다.

주요 구성 요소

  • Kafka Broker: 데이터 메시지를 저장하고 처리하는 서버. 각 브로커는 하나 이상의 토픽을 관리하며, 클러스터의 일부이다.
  • Partition: 데이터가 실제로 저장되는 물리적인 위치. 각 Partition은 Leader와 여러 Follower로 구성되어 있어, 데이터의 안정성과 가용성을 보장한다.
  • Zookeeper: Kafka 클러스터의 메타데이터를 관리하고, 클러스터의 상태를 모니터링하는 역할을 한다. Zookeeper는 Kafka 클러스터의 구성, 상태 정보 등을 관리하며 클러스터의 정상적인 운영을 보장하는 중요한 구성 요소이다.
  • Kafka Manager: Kafka 인스턴스를 효율적으로 관리하고 모니터링할 수 있는 도구. 여기서는 클러스터의 상태를 파악하고, 성능 문제를 진단하는 데 사용된다.

데이터 흐름

  • 데이터는 Producer에 의해 Topic에 발행되며, 각 Topic의 Partition에 저장된다. Partition의 데이터는 Offset으로 관리되며, Consumer는 이 Offset을 통해 필요한 데이터를 읽어간다.

Kafka 외 상용 툴

1. Kafka VS RabbitMQ

Kafka

  • 메시지 전달 방식: Producer → Broker → Partition → Consumer 구조로, Consumer가 BatchSize 등 조건에 맞춰 메시지를 가져가는 Pull 방식을 사용한다.
  • 성능 및 용도: 초당 최대 1백만 개의 메시지 처리 가능, 대용량 처리 및 높은 가용성에 적합.
  • 특징: 확장성이 뛰어나고, 대규모 스트리밍 데이터 처리 및 신뢰성 있는 메시지 전달에 강점을 가진다.

RabbitMQ

  • 언어 및 프로토콜: Erlang으로 개발되었으며, AMQP(Advanced Message Queuing Protocol)를 구현한 메시지 브로커 시스템이다.
  • 메시지 전달 방식: Producer → Exchange → Binding Rules → Queue → Consumer 구조로, Producer가 메시지 전달 시기를 통제하며 나머지는 메시지를 신속하게 전달하는 데 초점을 맞추어 Push 방식으로 작동한다.
  • 성능 및 용도: 초당 최대 10,000개의 메시지 처리 가능, 트랜잭셔널 처리에 적합하며 추가 로직 처리 가능.
  • 특징: 유연성이 뛰어나고 사용하기 쉬우며, 작은 규모의 메시지 처리에 적합하다.

2. 기타 메시징 툴

Solace

  • 용도: 증권가에서 많이 사용되며, 과거에는 하드웨어와 소프트웨어를 패키지로 판매하던 제품이었다.
  • 특징: 현재는 클라우드 솔루션에 강점을 가지고 있으며, 대규모 메시지 처리와 빠른 데이터 전송을 요구하는 금융 시장에 최적화되어 있다.

Redis Pub/Sub

  • 구조: Kafka와 비슷한 Pub/Sub 구조를 가지고 있으나, Consumer가 없을 경우 채널에서 이벤트를 따로 보관하지 않는다.
  • 특징: 낮은 지연 시간과 즉각적인 메시지 전달에 강점이 있어, 실시간 메시지 처리에 매우 효과적이다.