개발 인프라

Apache Kafka 기본 개념

silbaram 2025. 4. 15. 21:46
728x90

아래는 개발자가 Apache Kafka를 사용하기 전에 반드시 숙지해야 할 기본 개념들을 정리한 블로그 형식의 글입니다. 이 글에서는 Kafka의 정의부터 아키텍처, 주요 구성 요소, 데이터 전달 방식, 복제 및 고가용성 보장 메커니즘 등 Kafka를 깊이 있게 이해하는 데 필요한 내용을 자세히 다룹니다.


개발자를 위한 Apache Kafka 기본 개념 가이드

최근 마이크로서비스, 빅데이터 및 실시간 데이터 스트리밍이 중요해지면서 Apache Kafka는 업계에서 필수 도구로 자리 잡았습니다. Kafka는 대용량의 실시간 데이터 스트림을 처리하고, 여러 애플리케이션 간에 데이터를 안정적으로 전달할 수 있도록 지원하는 분산 이벤트 스트리밍 플랫폼(distributed event streaming platform)입니다.
이 글에서는 Kafka를 처음 접하는 개발자들이 꼭 알아야 할 핵심 개념과 구조를 자세히 설명합니다.


1. Apache Kafka란?

Kafka는 원래 LinkedIn에서 대량의 데이터를 실시간으로 처리하기 위해 개발되었으며, 현재는 Apache Software Foundation에서 관리하는 오픈소스 프로젝트입니다.
Kafka의 주요 특징은 다음과 같습니다.

  • 높은 처리량과 낮은 지연시간: 수백만 건의 메시지를 빠르고 안정적으로 처리할 수 있습니다.
  • 분산형 아키텍처: 여러 서버(브로커)를 클러스터로 구성하여 장애 발생 시에도 데이터 유실 없이 운영할 수 있습니다.
  • 내구성과 확장성: 데이터를 디스크에 기록하고 파티션, 복제 등의 구조로 저장하여 데이터 안정성을 확보합니다.

2. Kafka의 아키텍처 개요

Kafka는 크게 클러스터(cluster), 브로커(broker), 주키퍼(Zookeeper)(혹은 최신 버전에서는 KRaft)로 구성되어 있습니다.

클러스터와 브로커

  • 클러스터: 여러 대의 Kafka 브로커가 네트워크 상에서 하나의 클러스터를 이뤄 분산 처리를 수행합니다.
  • 브로커: Kafka가 설치된 각 서버 또는 노드를 의미하며, 클러스터 내에서 메시지 저장과 전송, 복제 등의 작업을 담당합니다.
    • 클러스터 내의 브로커들 중 한 대는 컨트롤러(controller) 역할을 수행하여 브로커들의 상태를 모니터링하고 장애가 발생할 경우 리더 할당 및 파티션 재분배를 관리합니다.

3. Kafka의 주요 구성 요소

Kafka를 이해하기 위해서는 메시지를 주고받는 기본 단위와 그 전달 메커니즘을 이해하는 것이 중요합니다.

3-1. Topic, Partition, Offset

  • Topic: 메시지를 저장하고 구분하는 논리적 단위입니다.
    • 예를 들어, “로그”, “이벤트”, “트랜잭션” 등 서로 다른 데이터를 위한 Topic을 구성할 수 있습니다.
  • Partition: 하나의 Topic을 여러 개의 하위 단위로 나누어 병렬 처리를 가능하게 하는 단위입니다.
    • 각 Partition은 메시지를 순서대로 저장하는 FIFO(선입선출) 큐 역할을 합니다.
    • Partition의 개수는 클러스터의 처리량, 소비자 수, 확장성을 고려하여 초기 생성 후 필요에 따라 늘릴 수 있지만, 한 번 늘린 후에는 줄일 수 없으므로 신중하게 결정해야 합니다.
  • Offset: Partition 내 각 메시지가 저장된 고유 위치를 나타내는 값입니다.
    • 오프셋은 순차적으로 증가하며, Consumer는 마지막으로 읽은 오프셋을 기준으로 이후 메시지를 가져옵니다.

3-2. Producer, Consumer, Consumer Group

  • Producer(프로듀서): 데이터를 생성하여 특정 Topic으로 메시지를 전송하는 역할을 합니다.
    • 프로듀서는 메시지를 전송할 때 직렬화, 파티셔닝, 배치 전송, 압축 전송 등의 기능을 통해 효율적인 데이터 전달을 지원합니다.
  • Consumer(컨슈머): Topic에 저장된 메시지를 읽어들여 처리하는 애플리케이션입니다.
  • Consumer Group(컨슈머 그룹): 동일한 작업을 수행하는 여러 컨슈머들이 그룹으로 묶여, 각 그룹 내에서는 하나의 Partition 당 한 명의 컨슈머만 메시지를 읽어갑니다.
    • 이 구조를 통해 같은 Topic의 메시지를 여러 애플리케이션이 독립적으로 처리할 수 있으며, 장애 발생 시 자동으로 리밸런싱(rebalancing)을 수행해 작업을 분담합니다.

4. 데이터 복제(Replication)와 고가용성

Kafka는 데이터 유실을 방지하고 시스템 장애 시에도 안정적인 서비스를 보장하기 위해 복제(replication) 메커니즘을 사용합니다.

  • Replication Factor: Topic 생성 시 각 Partition에 대해 몇 개의 복제본을 둘지 설정하는 값입니다.
    • 예를 들어, 복제 팩터를 3으로 설정하면 각 Partition은 한 개의 리더(Leader)와 두 개의 팔로워(Follower)로 구성되어, 리더가 모든 읽기/쓰기를 처리하고, 팔로워는 리더의 데이터를 복제합니다.
  • ISR (In-Sync Replica): 리더와 동기화된 팔로워들의 집합으로, 이들만이 리더 장애 시 새로운 리더로 승격될 수 있습니다.
  • 복제 덕분에 클러스터 내 일부 브로커에 장애가 발생하더라도 메시지 유실 없이 다른 브로커가 그 역할을 대신하여 고가용성을 유지할 수 있습니다.

5. Zookeeper와 KRaft

과거 Kafka는 클러스터 메타데이터 관리와 브로커 상태 체크를 위해 Zookeeper를 사용했습니다.

  • Zookeeper: 분산 시스템에서 노드의 상태, 메타데이터, 컨트롤러 선출 등 다양한 기능을 수행하는 코디네이션 시스템입니다.
    • Zookeeper는 여러 대의 서버(주키퍼 앙상블)로 구성되며, 홀수 개의 노드를 유지해 과반수 이상의 노드가 가동 중일 때 서비스를 유지합니다.
  • 최근 Kafka는 KRaft(Kafka Raft Metadata mode)라는 자체 메타데이터 관리 기능을 도입하면서 Zookeeper 의존성을 점차 줄여가고 있습니다.
    • KRaft는 Kafka 클러스터의 메타데이터와 브로커 상태 관리를 Raft 알고리즘 기반으로 처리하여 운영 복잡성을 낮추고 있습니다.

6. 메시지 전달 옵션과 성능 최적화

Kafka는 프로듀서가 데이터를 전송할 때 높은 처리량과 낮은 지연을 위해 여러 옵션을 제공합니다.

주요 옵션

  • acks:
    • 0: Producer가 메시지를 전송 후 브로커의 응답을 기다리지 않으므로 전송 속도가 빠르지만, 데이터 유실 위험이 있습니다.
    • 1: 리더 브로커가 데이터를 저장한 후 응답을 보내면 전송을 성공으로 판단합니다.
    • all (또는 -1): 리더와 모든 동기화된 팔로워가 데이터를 저장한 후 응답을 보냅니다. 이 경우 데이터 유실 없이 전송하지만 지연시간이 늘어날 수 있습니다.
  • 배치 전송(Batching): Producer는 여러 메시지를 하나의 배치로 묶어 전송하여 네트워크 오버헤드를 줄이고 처리량을 높입니다.
  • 압축 전송(Compression): 메시지를 전송 전에 gzip, snappy, lz4, zstd 등의 알고리즘을 사용해 압축하면 네트워크 비용을 절감할 수 있습니다.
    • 각각의 압축 방식은 압축률과 처리 속도에 차이가 있으므로, 사용 환경에 맞게 적절한 방식을 선택해야 합니다.

7. 정리 및 결론

Apache Kafka는 단순한 메시지 큐 이상의 역할을 하는 분산 스트리밍 플랫폼입니다.

  • Topic과 Partition을 통해 데이터의 병렬 처리와 순서를 보장하고,
  • Producer와 Consumer, 그리고 Consumer Group 개념을 활용하여 실시간 데이터 스트리밍과 동시에 확장 가능한 애플리케이션 설계를 지원합니다.
  • 또한 Replication 메커니즘으로 시스템의 고가용성을 보장하고, Zookeeper(혹은 최신 KRaft)를 활용하여 클러스터 상태를 효과적으로 관리합니다.

개발자가 Kafka를 처음 접할 때는 위에서 설명한 기본 개념을 충분히 숙지한 후, 실제 애플리케이션에 적용하여 데이터를 전송하고 처리하는 경험을 쌓는 것이 중요합니다.

Kafka의 세부 옵션과 동작 방식을 직접 실습해 보면서 본인의 아키텍처에 맞는 최적의 설정을 찾아가는 것을 추천합니다.


참고 자료

Happy Streaming!

728x90