본문 바로가기
빅데이터(Big Data)

실시간 이벤트 스트리밍의 심장, Apache Kafka에 대해 알아보겠습니다.

by forward error correction Circle 2026. 5. 2.
반응형

Ⅰ. Apache Kafka 란?

 대용량 메시지를 실시간으로 안전하게 전달하고 장기간 보관할 수 있도록 설계된 오픈소스 분산 이벤트 스트리밍 플랫폼입니다. 2011년 LinkedIn에서 공개된 이후 현재는 이벤트 기반 아키텍처(EDA), 마이크로서비스, 데이터 파이프라인, IoT, 실시간 분석의 "중추 신경망" 역할을 담당하는 사실상의 표준입니다.
2025년 Kafka 4.0 정식 출시를 기점으로 ZooKeeper 의존성이 완전히 제거된 KRaft(Kafka Raft) 전용 체제로 전환되었으며, 2026년에는 4.x 버전이 운영 환경의 기본이 되었습니다. 이로써 구성이 단순해지고 대규모 클러스터의 확장성이 크게 향상되었습니다.

 

 Kafka 발전 과정

 사내 로그 수집 도구에서 범용 실시간 데이터 백본으로 진화

구분 주요 특징 핵심 키워드
2011 LinkedIn 오픈소스 공개, 로그 수집 목적 Pub-Sub 메시징
Kafka 2.x Streams API, Connect API 탑재 스트림 처리 플랫폼
Kafka 3.x KRaft 모드 도입, ZooKeeper 선택적 자체 메타데이터 관리
Kafka 4.x (2026) KRaft 전용, Tiered Storage GA, Queue 지원 ZooKeeper-less, 계층 저장

Ⅱ. Apache Kafka 주요 특징

 ⅰ. 초고처리량(High Throughput)

   : 파티션 기반 분산 처리와 순차 디스크 쓰기로 초당 수백만 건 이상의 메시지를 안정적으로 처리합니다.

 ⅱ. 수평 확장(Horizontal Scalability)

   : 브로커(Broker)를 추가하고 파티션을 재분배하는 것만으로 클러스터 용량과 성능을 선형적으로 확장할 수 있습니다.

 ⅲ. 영속성 및 재처리(Durable & Replayable)

   : 모든 메시지를 디스크에 로그(Log) 형태로 저장하고 설정된 기간만큼 보존하여, 컨슈머가 오프셋(Offset)을 되돌려 과거 데이터를 재처리할 수 있습니다.

 ⅳ. 정확히 한 번 처리(Exactly-Once Semantics)

   : 트랜잭션 API와 멱등성(Idempotent) 프로듀서를 통해 중복/유실 없는 메시지 전달을 보장합니다.

 ⅴ. KRaft 합의 프로토콜

   : ZooKeeper 없이 내장 Raft 알고리즘으로 메타데이터를 관리하여 운영 난이도와 장애 전파 위험이 크게 감소했습니다.

 ⅵ. 계층형 저장(Tiered Storage)

   : 오래된 로그 세그먼트를 S3 등 객체 스토리지로 자동 이전하여 브로커 디스크 비용을 최소화합니다.

Ⅲ. Apache Kafka 동작 방식

 Producer가 발행한 메시지는 지정된 Topic의 Partition에 순서대로 저장되고, 같은 Consumer Group에 속한 Consumer들이 파티션을 분담하여 병렬로 소비합니다. 브로커는 메시지를 받지 않고 "당겨가는(Pull)" 방식이라 백프레셔(backpressure) 제어가 자연스럽습니다.

단계 구분 주요 역할 및 상세 동작
1 Producer 발행 Producer가 메시지에 키(Key)를 지정하면 해시 기반으로 특정 파티션이 결정됩니다. 배치와 압축(LZ4, Zstd)을 통해 네트워크 효율을 극대화합니다.
2 Broker 저장 & 복제 Leader 파티션이 메시지를 디스크 로그에 append한 뒤 Follower 파티션으로 복제합니다. acks=all 설정 시 모든 ISR 복제본 반영 후 ACK를 반환합니다.
3 Consumer Group 소비 Consumer는 __consumer_offsets 토픽에 오프셋을 커밋하며 진행 상태를 관리합니다. 그룹 내 컨슈머 수만큼 파티션이 균등 분배됩니다.
4 KRaft 메타데이터 합의 Controller 쿼럼이 Raft 합의로 토픽/파티션/ACL 메타데이터를 복제 저장합니다. 리더 선출 지연이 ZooKeeper 시대보다 수십 배 빨라졌습니다.

메시지는 순서 보장(Partition 내)과 무제한 보존 옵션, Exactly-Once 트랜잭션 등을 조합해 데이터 파이프라인 전반의 신뢰성을 제공합니다.

Apache Kafka 아키텍처 구성 및 흐름도

 ⅰ.  Kafka 4.x 아키텍처(KRaft 모드)

 ⅱ. 구성요소

구성 요소 역할 예시
Producer 이벤트 생성 측 애플리케이션, 토픽에 메시지 발행 결제 서비스, 로그 수집기
Broker (Cluster) 메시지 저장·복제·전달을 담당하는 서버 노드 Leader / Follower Partition
Topic & Partition 메시지 스트림의 논리적 단위와 물리적 분할 단위 orders(3 partitions, RF=3)
Controller Quorum KRaft 기반 메타데이터 관리·리더 선출 담당 3~5대 Controller 노드
Consumer Group 파티션을 분담 소비하는 협력 컨슈머 집합 analytics-group

Ⅴ. Apache Kafka 설치 방법

 공식 배포판(tar.gz) 또는 컨테이너 이미지를 사용할 수 있으며, 4.x부터는 ZooKeeper 없이 KRaft 단일 프로세스로 바로 기동할 수 있어 설치가 간단합니다.

전제 조건: Java 17 이상, Linux/macOS/WSL 환경 권장, 운영 환경은 Broker당 최소 4vCPU / 16GB RAM 이상을 권장합니다.

ⅰ. 바이너리 설치 (Single Node KRaft)

# 다운로드 & 해제
curl -LO https://downloads.apache.org/kafka/4.0.0/kafka_2.13-4.0.0.tgz
tar -xzf kafka_2.13-4.0.0.tgz && cd kafka_2.13-4.0.0

# KRaft 클러스터 ID 생성 & 저장소 포맷
KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/kraft/server.properties

# 브로커+컨트롤러 통합 기동
bin/kafka-server-start.sh config/kraft/server.properties

ⅱ. Docker Compose로 기동

# docker-compose.yml (요약)
services:
  kafka:
    image: apache/kafka:4.0.0
    ports: ["9092:9092"]
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093

# 실행
docker compose up -d

ⅲ. 정상 동작 확인

# 첫 토픽 생성
bin/kafka-topics.sh --bootstrap-server localhost:9092 \
    --create --topic hello --partitions 3 --replication-factor 1

※ 상용 환경에서는 최소 3대 Broker + 3대 Controller(겸임 가능) 구성으로 고가용성을 확보합니다.

Ⅵ. Apache Kafka 사용 방법

토픽 생성 → Producer 발행 → Consumer 구독의 기본 흐름을 익히면, 이후 Schema Registry, Kafka Connect, Streams로 자연스럽게 확장할 수 있습니다.

 

ⅰ. CLI로 발행/구독 테스트

# 터미널 1 - Producer
bin/kafka-console-producer.sh --bootstrap-server localhost:9092 \
    --topic orders
> {"id":1,"amount":15000}
> {"id":2,"amount":9800}

# 터미널 2 - Consumer
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 \
    --topic orders --from-beginning --group analytics-group

 

ⅱ. Python 애플리케이션 예제 (kafka-python)

from kafka import KafkaProducer, KafkaConsumer
import json

# Producer - 멱등성 + acks=all
producer = KafkaProducer(
    bootstrap_servers="localhost:9092",
    acks="all", enable_idempotence=True,
    value_serializer=lambda v: json.dumps(v).encode()
)
producer.send("orders", {"id": 3, "amount": 22000})
producer.flush()

# Consumer - Consumer Group 기반
consumer = KafkaConsumer(
    "orders", group_id="analytics-group",
    bootstrap_servers="localhost:9092",
    value_deserializer=lambda v: json.loads(v.decode())
)
for msg in consumer:
    print(msg.topic, msg.partition, msg.offset, msg.value)

Ⅶ. Apache Kafka 자주 쓰는 명령어

명령어 설명
kafka-topics.sh --create 토픽을 생성합니다. --partitions, --replication-factor, --config retention.ms 등으로 보존 정책까지 지정할 수 있습니다.
kafka-topics.sh --describe 토픽의 파티션 수, Leader, ISR(In-Sync Replicas) 상태를 확인합니다. 복제 문제 진단의 첫 단계로 활용합니다.
kafka-console-producer.sh 터미널에서 직접 메시지를 발행하는 도구입니다. 기능 검증과 빠른 디버깅에 유용합니다.
kafka-console-consumer.sh 토픽 메시지를 실시간 또는 --from-beginning 옵션으로 처음부터 구독합니다. --group을 지정해 그룹 소비 테스트가 가능합니다.
kafka-consumer-groups.sh Consumer Group의 Lag(지연량)과 오프셋을 조회·재설정합니다. 장애 복구 시 --reset-offsets로 특정 시점으로 되돌릴 수 있습니다.
kafka-configs.sh --alter 토픽, 브로커, 사용자 단위 설정을 동적으로 변경합니다. 보존 기간, 최대 메시지 크기, 쿼터 등을 재시작 없이 조정할 수 있습니다.
kafka-reassign-partitions.sh 파티션을 다른 브로커로 이동시켜 부하를 재분산합니다. 브로커 추가/제거 시 반드시 사용하는 운영 필수 명령어입니다.
kafka-storage.sh format KRaft 모드에서 메타데이터 저장소를 초기화합니다. Cluster ID와 함께 사용하여 새 클러스터를 세팅할 때 반드시 실행합니다.

Ⅷ. Apache Kafka 활용 방안

활용 분야 구분 상세 내용 및 효과 주요 타겟
MSA 통신 이벤트 기반 아키텍처 마이크로서비스 간 비동기 이벤트 버스로 활용합니다. 서비스 간 결합도를 낮추고 장애 격리와 독립 배포를 가능하게 합니다. 백엔드 개발팀, 아키텍트
로그 파이프라인 중앙집중 로그 수집 Filebeat/Fluent Bit → Kafka → Elasticsearch/OpenSearch 형태의 버퍼 계층으로 사용합니다. 급증 트래픽에서도 수집기의 과부하를 막아줍니다. SRE, 보안 운영(SOC) 팀
CDC & ETL 변경 데이터 캡처 Debezium으로 DB의 변경 내역(Change Data Capture)을 Kafka로 스트리밍합니다. 데이터 웨어하우스, 레이크하우스로 실시간 복제가 가능해집니다. 데이터 엔지니어, 분석 플랫폼
실시간 분석 스트림 처리 Kafka Streams, Apache Flink와 결합해 초 단위 지표 산출, 이상 거래 탐지, 실시간 추천 등을 구현합니다. 배치 대비 의사결정 속도를 크게 단축합니다. 데이터 과학팀, 리스크 관리팀

 

반응형