Kafka

[Kafka 입문] 토픽, 파티션, 스트림

99duuk 2025. 1. 2. 20:42

토픽: 카프카에서 데이터를 구분하고 저장하는 논리적 단위

스트림: 토픽의 데이터의 흐름. ksql로 정의할 수 있고, 데이터를 처리하거나 변환하여 전달하거나 새로운 토픽으로 전달할 수도 있음

파티션: 토픽을 물리적으로 분할한 단위, 병렬 처리를 위해 분산 저장하는 것 (브로커 간 분배)


Kafka의 기본 개념

Kafka는 분산 메시징 플랫폼으로,

데이터를 실시간으로 처리하고 전달하는 데 최적화되어 있음.

데이터를 "어디에서 생성되고", "어디로 전달되는지"를 관리하는 구조를 제공함

  1. 프로듀서 (Producer): 데이터를 생성하고 Kafka에 발행하는 역할.
  2. 컨슈머 (Consumer): Kafka에서 데이터를 구독하고 사용하는 역할.
  3. 토픽 (Topic): 데이터를 저장하는 논리적 공간.
  4. 파티션 (Partition): 토픽의 데이터를 물리적으로 나누는 단위.

1. 토픽(Topic)

  • 비유: Kafka의 토픽은 도서관의 책장과 비슷함
    • 도서관에서 책을 주제별로 분류하듯이, Kafka에서는 데이터를 특정 주제(Topic)로 나눠서 저장함
    • 예를 들어:
      • orders: 주문 데이터
      • payments: 결제 데이터
      • logs: 서버 로그 데이터
  • 정의:
    • Kafka에서 데이터를 저장하는 논리적 단위임
    • 프로듀서는 데이터를 특정 토픽으로 발행(Publish)하고, 컨슈머는 해당 토픽을 구독(Subscribe)하여 데이터를 가져감
    • 하나의 토픽은 여러 데이터 유형을 처리하지 않도록 설계하는 것이 일반적임
  • 데이터 저장 방식:
    • 토픽에 저장된 데이터는 로그(Log) 형태로 유지됨
    • 데이터는 추가(Append)만 가능하며, 읽기(Read)는 순차적으로 이루어짐
    • 저장된 데이터는 브로커가 유지하는 설정된 보존 기간(Retention Period) 동안 저장됨
      예: 7일 설정 시, 데이터는 7일간 유지된 후 삭제
  • 토픽의 역할:
    • ELK Stack에서 Elasticsearch의 인덱스(Index)와 유사하다고 볼 수 있음.
      • 인덱스는 데이터를 주제별로 구분하여 저장하는 역할을 함
      • Kafka의 토픽도 데이터를 주제별로 논리적으로 구분하여 저장함

2. 파티션(Partition)

  • 비유:
    • 파티션은 도서관의 책장을 물리적으로 나눈 서가라고 생각하면 됨
    • 하나의 책장(토픽)에 너무 많은 책이 있다면, 여러 서가(파티션)로 나누어 저장하여 접근 속도를 높이고 병렬 처리가 가능하도록 만듬.
  • 정의:
    • 파티션은 토픽을 물리적으로 나눈 단위임.
    • 하나의 토픽은 여러 파티션으로 나뉘며, 각 파티션은 별도의 파일 시스템에 저장됨.
    • 파티션은 토픽의 성능(처리량)과 확장성을 높이기 위해 도입된 개념임.
  • 특징:
    • 파티션마다 데이터는 순서를 보장함.
      예: Partition-0에 들어간 데이터는 순서대로 읽을 수 있음.
    • 그러나 여러 파티션 간에는 순서가 보장되지 않음!
      예: Partition-0의 데이터와 Partition-1의 데이터는 순서가 뒤섞일 수 있음.
  • 파티션의 장점:
    1. 병렬 처리:
      • 여러 파티션이 병렬로 데이터를 처리하므로, 하나의 토픽이 더 많은 데이터를 빠르게 처리할 수 있음.
      • 예: Partition-0은 서버 A가 처리, Partition-1은 서버 B가 처리.
    2. 확장성:
      • 파티션을 추가하여 더 많은 데이터를 저장하고 처리할 수 있음.
      • 토픽 자체를 확장하지 않아도 됨.
    3. 장애 복구:
      • 파티션 데이터를 여러 브로커에 분산 저장하므로, 한 브로커가 장애가 발생해도 데이터 손실을 방지할 수 있음.
  • 파티션의 구조:
    • 각 파티션은 오프셋(Offset)이라는 고유한 번호로 데이터를 구분함.
    • 예:
      Partition-0: [0, 1, 2, 3, 4]
      Partition-1: [0, 1, 2]
      
  • 파티션과 토픽의 관계:
    • 하나의 토픽은 여러 파티션을 가질 수 있음
      예: orders 토픽은 Partition-0, Partition-1, Partition-2로 나눠질 수 있음
    • 각 파티션은 브로커 간에 분산되어 저장됨.

 

[브로커 1개 + 파티션 구성]
브로커가 하나일 경우에도 Kafka의 토픽과 파티션 개념은 유지됩니다.
그러나 브로커 하나로는 확장성, 장애 복구, 병렬 처리와 같은 Kafka의 장점이 제한됩니다.

프로덕션 환경에서는 브로커를 2개 이상으로 늘려 데이터 복제와 분산을 통해 Kafka의 강점을 활용하는 것이 중요합니다.

 

 

 


 


스트림 & 토픽

 

스트림(Stream)이란?

Kafka의 스트림은 토픽에서 발생하는 데이터의 흐름을 실시간으로 처리하는 논리적인 개념임

정의

  • 스트림(Stream)은 Kafka 토픽에 저장된 데이터를 실시간으로 처리하고 분석하기 위한 데이터의 연속적인 흐름
  • Kafka에서 데이터를 읽어 들이는 동안, 데이터는 스트림 형태로 다뤄짐

비유

  • Kafka의 토픽은 데이터가 저장된 곳(파일 같은 저장소)이고,
  • 스트림은 그 데이터가 흘러가는 과정에서 처리되는 흐름입니다.

즉, 토픽은 정적인 데이터의 집합이고, 스트림은 그 데이터가 실시간으로 처리되는 동적인 흐름임.


스트림(Stream) vs 토픽(Topic)

특징 토픽(Topic) 스트림(Stream)

역할 데이터를 저장하는 논리적 단위 데이터를 실시간으로 처리하기 위한 논리적 단위
정적/동적 정적 (데이터가 쌓여 있음) 동적 (데이터가 흐름처럼 처리됨)
데이터 사용 방식 데이터를 읽고 저장하는 곳 데이터를 읽고 필터링, 변환, 집계 등 실시간 처리하는 곳
예시 orders 토픽에 주문 데이터가 저장됨 orders_stream에서 주문 데이터를 실시간 분석

ksqlDB에서의 스트림 활용

  1. 토픽 → 스트림
    • Kafka의 데이터를 스트림으로 변환하여 실시간으로 처리
    • 예:
      CREATE STREAM orders_stream (
        order_id VARCHAR,
        item VARCHAR,
        price DOUBLE
      ) WITH (
        KAFKA_TOPIC='orders',
        VALUE_FORMAT='JSON'
      );
      
      • orders라는 Kafka 토픽 데이터를 스트림으로 정의.
      • 데이터는 JSON 형식으로 처리됩니다.
  2. 실시간 처리:
    • 스트림은 계속 흘러오는 데이터를 실시간으로 처리
    • 예:
      SELECT * FROM orders_stream EMIT CHANGES;
      
      • orders_stream에서 들어오는 데이터를 실시간으로 모니터링.
  3. 결과 저장:
    • 스트림에서 처리된 데이터는 새로운 Kafka 토픽으로 출력하거나, DB에 저장

스트림의 활용 예시

1. 데이터 필터링

  • 특정 조건에 맞는 데이터만 새로운 스트림으로 분기:
    CREATE STREAM expensive_orders AS
    SELECT *
    FROM orders_stream
    WHERE price > 1000;
    
    • price > 1000 조건을 만족하는 주문만 expensive_orders 스트림으로 분기.

2. 데이터 집계

  • 사용자별 총 구매 금액을 계산하고 테이블에 저장:
    CREATE TABLE user_spending AS
    SELECT user_id, SUM(price) AS total_spending
    FROM orders_stream
    GROUP BY user_id;
    
    • 스트림 데이터를 집계하여 사용자별 총 구매 금액을 계산.

3. 스트림 간 조인

  • 주문 데이터와 사용자 데이터를 결합:
    CREATE STREAM enriched_orders AS
    SELECT
      o.order_id,
      o.item,
      o.price,
      u.name AS user_name
    FROM orders_stream o
    JOIN user_stream u
      ON o.user_id = u.user_id;
    
    • 주문 데이터와 사용자 데이터를 조인하여 결합된 스트림 생성.

스트림은 왜 필요한가?

  1. 실시간 데이터 처리
    • Kafka의 데이터는 끊임없이 들어오며, 스트림은 이러한 데이터를 실시간으로 처리함.
    • 예: 결제 승인 후 즉시 알림을 보냄.
  2. 데이터 분기
    • 필요 없는 데이터를 걸러내고, 필요한 데이터만 새로운 Kafka 토픽으로 분기하거나 저장.
    • 예: 가격이 높은 주문만 필터링하여 VIP_ORDERS 토픽으로 보냄.
  3. 데이터 변환
    • 데이터를 새로운 구조로 변환하거나, 추가 정보를 결합하여 다른 시스템으로 전달.
    • 예: 주문 데이터에 사용자의 이름을 추가하여 분석 시스템으로 전달.
  4. 데이터 집계 및 요약
    • 사용자별 총 구매 금액 계산, 특정 시간대의 총 판매량 계산 등 요약 정보를 생성.

스트림과 테이블의 차이

ksqlDB에서 스트림(Stream)과 테이블(Table)은 서로 다른 용도로 사용됨.

특징 스트림(Stream) 테이블(Table)

데이터 특성 실시간으로 들어오는 데이터의 연속적인 흐름 현재 상태(Snapshot)를 표현하는 데이터 구조
저장 방식 지속적으로 추가되는 데이터 마지막 값을 유지 (Key-Value Store처럼 동작)
사용 목적 이벤트 처리 (데이터의 흐름 분석) 상태 저장 (최신 상태 확인, 집계 결과 저장)
예시 orders_stream: 주문 이벤트 user_spending: 사용자별 총 구매 금액 테이블

결론

  • 스트림은 Kafka 토픽에서 발생하는 데이터 흐름을 실시간으로 처리하는 단위임.
  • 스트림을 활용해 데이터를 필터링하거나 변환하고, 필요한 데이터를 DB나 새로운 Kafka 토픽으로 분기할 수 있음.
  • ksqlDB의 스트림은 실시간 데이터 파이프라인 구축에서 핵심적인 역할을 하며, 이를 통해 이벤트 기반 시스템을 효과적으로 운영할 수 있음.

ksqlDB는 Kafka 데이터를 실시간으로 다룰 수 있게 해주는 도구로, 스트림은 이를 가능하게 하는 기본 단위라고 이해하믄 댐.


 

| 그렇다면 토픽과 스트림은 별개인가?

Kafka에서 "토픽으로 발행"과 "스트림으로 발행"의 차이는 본질적으로 없음.

 

Kafka의 데이터 흐름은 항상 토픽을 중심으로 이루어지며, 스트림(Stream)은 이 토픽 데이터를 실시간으로 처리하고 변환하는 논리적 단위임.

 

따라서 Kafka의 데이터를 발행(Publish)한다고 하면, 이는 항상 토픽으로 이루어짐.

하지만 ksqlDB나 다른 처리를 거치면 새로운 토픽으로 데이터가 전환될 수 있음.


1. Kafka의 토픽으로 직접 발행

Kafka를 사용하는 기본적인 방식은 토픽으로 데이터를 발행(Publish)하는 것임.

  • 주체: 프로듀서(Producer)
  • 방법: Kafka API나 클라이언트를 사용하여 데이터를 Kafka 토픽으로 발행.
  • 결과: 데이터는 특정 토픽에 저장되고, 필요하면 컨슈머(Consumer)가 해당 데이터를 구독해서 처리.

예제 (토픽으로 데이터 발행)

  1. Kafka 토픽 생성
    • Kafka CLI를 사용해 orders라는 토픽을 생성: 
    • kafka-topics --create --topic orders --bootstrap-server localhost:9092
  2. 데이터 발행
    • 프로듀서 CLI를 사용해 데이터를 발행:
      kafka-console-producer --topic orders --bootstrap-server localhost:9092
      
      • 입력:
        {"user_id": "123", "item": "laptop", "price": 1200}
        {"user_id": "456", "item": "phone", "price": 800}
        
  3. 결과
    • orders 토픽에 데이터가 저장되고, 컨슈머가 이를 구독할 수 있음.

2. ksqlDB의 스트림으로 데이터 발행

Kafka의 스트림은 토픽 데이터의 실시간 흐름을 처리하기 위해 사용됨.
스트림에서 처리된 데이터는 새로운 Kafka 토픽으로 발행됨.

스트림으로 데이터 발행의 의미

  • 데이터를 직접 "스트림으로 발행"하는 것은 불가능하며, Kafka 토픽 데이터를 읽어서 스트림에서 처리 후 새로운 Kafka 토픽으로 발행하는 방식임.
  • 스트림은 중간에서 데이터를 변환하거나 필터링하는 논리적 처리 단계임

 

[sqlDB 없이 스트림(Stream)을 만들 수 있는가?]
Kafka의 스트림(Stream) 개념은 본질적으로 ksqlDB 없이도 사용할 수 있습니다.
다만, ksqlDB는 Kafka 스트림을 더 쉽게 정의하고 처리하기 위한 고수준 도구입니다. 


ksqlDB는 Kafka 스트림을 SQL 기반 문법으로 정의하고 처리하는 고수준 추상화 도구입니다.
쉽게 말해, Kafka Streams API를 SQL처럼 사용할 수 있도록 도와주는 툴입니다.

ksqlDB 없이 Kafka 스트림을 정의하려면 Kafka Streams API를 사용합니다.
Kafka Streams API는 Java 라이브러리로 제공되며, Kafka 데이터를 실시간으로 처리하는 데 사용됩니다.

 

예제 (스트림으로 데이터 발행)

  1. Kafka 토픽 생성
    • 원본 데이터를 저장할 orders 토픽과 결과 데이터를 저장할 expensive_orders 토픽 생성: 
    • kafka-topics --create --topic orders --bootstrap-server localhost:9092 kafka-topics --create --topic expensive_orders --bootstrap-server localhost:9092
  2. ksqlDB에서 스트림 생성
    • Kafka 토픽 orders를 스트림으로 정의:
      CREATE STREAM orders_stream (
        user_id VARCHAR,
        item VARCHAR,
        price DOUBLE
      ) WITH (
        KAFKA_TOPIC='orders',
        VALUE_FORMAT='JSON'
      );
      
  3. 필터링된 데이터 스트림 생성
    • price가 1000 이상인 데이터를 필터링하여 새로운 스트림 생성:
      CREATE STREAM expensive_orders_stream AS
      SELECT *
      FROM orders_stream
      WHERE price >= 1000;
      
  4. 결과
    • expensive_orders_stream의 데이터는 expensive_orders 토픽에 저장.

토픽으로 발행 vs 스트림으로 발행의 차이

특징 토픽으로 발행 스트림으로 발행

데이터 처리 주체 프로듀서 (Producer) ksqlDB 또는 다른 데이터 처리 도구
발행 대상 Kafka 토픽 Kafka 토픽 (스트림 처리 후 결과를 새로운 토픽으로 발행)
데이터 처리 데이터 처리 없이 원본 그대로 발행 필터링, 집계, 변환 등 실시간 처리 후 발행
사용 목적 원본 데이터를 Kafka에 저장 데이터를 가공하거나 특정 조건에 맞는 데이터를 분기
예시 orders 토픽에 주문 데이터 발행 orders_stream에서 처리 후 expensive_orders로 발행

실제 활용 예시

  1. 단순 데이터 발행 (토픽으로 발행):
    • IoT 센서 데이터를 실시간으로 Kafka 토픽에 발행:
      {"sensor_id": "A1", "temperature": 22.5, "timestamp": "2025-01-01T12:00:00"}
      
    • 컨슈머가 데이터를 읽어 DB에 저장하거나 분석.
  2. 스트림 처리 후 발행 (스트림으로 발행):
    • IoT 데이터 중에서 온도가 30도 이상인 데이터만 필터링하여 high_temp_alerts 토픽으로 발행:
      CREATE STREAM high_temp_alerts AS
      SELECT *
      FROM sensor_data_stream
      WHERE temperature > 30;
      
    • 필터링된 데이터를 알림 시스템으로 전달.

결론

  • 토픽으로 발행: 프로듀서가 원본 데이터를 Kafka 토픽에 발행하는 기본 작업.
  • 스트림으로 발행: 스트림(ksqlDB 등)을 사용해 데이터를 실시간으로 처리한 후, 결과를 새로운 Kafka 토픽으로 발행.

핵심 차이점원본 데이터를 그대로 발행하느냐, 데이터를 실시간으로 가공하여 새로운 결과를 발행하느냐임.
Kafka에서 스트림은 토픽 데이터를 처리하는 중간 단계로 사용되며, 데이터를 가공하고 분기하는 데 사용됨.

 

 

 

 


 

'Kafka' 카테고리의 다른 글

[카프카 입문] 사용 전후 example  (0) 2025.01.07
[Kafka 입문] 다중 브로커, 레플리카  (1) 2025.01.03
[Kafka 입문] 구성 요소와 역할  (0) 2025.01.02