본문 바로가기
Book/카프카 핵심 가이드

Kafka 처음 배우기: 카프카란 무엇인가?

by burning-man 2025. 4. 2.

개요

이번 스터디 주제로 카프카(Kafka)가 정해졌다. 개발을 하면서 카프카라는 키워드를 자주 접했지만, 정확히 어떤 개념인지, 어디에 활용되는지, 어떻게 학습해야 할지 몰랐다. 이번 기회를 통해 카프카의 기본 개념부터 핵심 요소, 그리고 실제 활용 사례까지 정리하고자 한다. 카프카를 이해하고 효과적으로 활용할 수 있도록 학습 내용을 기록하였다.

 

책: Orelly 카프카 핵심 가이드.

 

1. 카프카란 무엇인가? 

카프카는 대량의 데이터를 빠르고 안정적으로 처리하기 위한 '분산 메시징 시스템'이다. 메시징 시스템은 애플리케이션 간 데이터를 교환하는 방법으로, 쉽게 말해 두 개 이상의 프로그램이 서로 메시지를 주고 받을 수 있도록 도와주는 역할을 한다. 

특징

  1. 고성능 :
    - 초당 수백만 개의 메시지 처리 가능
    - 대용량 데이터를 빠르게 저장하고 전달
  2. 확장성:
    - 파티션 개념을 이용해 여러 서버에 데이터를 분산 저장
    - 서버를 추가하면 자동으로 데이터가 분배되므로 수평 확장이 가능
  3. 내결합성:
    - 데이터를 여러개릐 브로커에 복제하여 장애 발생시에 데이터 손실을 방지
  4. 실시간 스트리밍 가능:
    - 데이터가 생성되는 즉시 소비자가 가져갈 수 있음.
    - 실시간 데이터 분석, 로그 처리, 이벤트 기반 아키텍처에 유용

이러한 특징으로 카프카는 서버 로그를 실시간으로 수집하여 분석하는 로그 수집 및 분석, 사용자의 이벤트를 실시간으로 추적하는 이벤트 스트리밍, 센서 데이터를 실시간으로 처리하는 IoT 데이터 처리, 마이크로서비스 간 통신할 때 메시징 시스템 에 사용된다.

 

메시징 시스템으로는 RabbitMQ, Redis 등도 있는데 카프카와 어떤 차이점이 있는걸까?

 


2. 전통적인 메시지 큐와 카프카의 차이점

항목 메시지 큐 (RabbitMQ, Redis ..) 카프카
메시지 전달 방식 메시지를 소비하면 삭제됨. 메시지를 저장하여 여러 소비자가 읽을 수 있음
메시지 보관 기간 메시지를 즉시 처리 해야함 설정한 기간 동안 메시지 보관 가능
확장성 제한적 (일반적으로 1:1 소비) 여러 소비자가 같은 메시지를 읽을 수 있음.
처리 방식 실시간 처리 대량의 데이터 스트리밍 처리 가능

 

기존 메시지 큐는 한번 읽고 나면 메시지가 사라지지만, 카프카는 설정한 기간 동안 메시지를 저장하여 여러 소비자가 읽을 수 있다. 

또한, 전통적인 메시징 큐 시스템과 비교하면 처리량, 처리속도, 가용성과 확장성이 월등히 높다. 

 


 

3. 카프카의 핵심 개념

1. 메시지와 배치

카프카에서 데이터의 기본 단위는 '메시지(message)'이다.  메세지는 단순한 바이트 배열로 특정한 형식이나 의미를 가지지 않는다.

메시지는 Key 라고 불리는 메타데이터를 포함 할 수도 있는데, 이 키를 기반으로 메시지를 저장할 '파티션(partition)'을 결정한다.

카프카는 메시지를 개별적으로 처리하지 않고, 효율성을 위해 배치(batch) 단위로 저장한다. 배치는 동일한 토픽(topic)의 파티션에 기록될 메시지들의 묶음이다. 네트워크 상에서 신호가 오고 가는 것은 오버헤드가 크기 때문에, 배치 단위로 모아서 처리하면 성능이 향상된다. 

배치 크기에 따라 지연(latency)과 처리량(throughput) 사이에 트레드오프가 발생하는데, 배치가 커질 수록 시간당 처리되는 메시지 수는 늘어나지만 각각의 메시지가 전달되는데 걸리는 시간은 늘어난다. 

 

즉, 배치 크기를 적절하게 조정하면 처리량과 지연 시간 사이에서 최적의 성능을 얻을 수 있다. 

2. 스키마

카프카의 입장에서 메시지는 단순한 바이트 배열일 뿐이지만, 서로 다른 애플리케이션이 데이터를 해석하는데 문제가 생길 수 있으므로 일관성이 있도록 데이터의 형식을 부여하는 것이 권장된다. '스키마(schema)'는 데이터를 저장할 때 형식을 정의하는 것으로, JSON, XML, Avro 등의 포맷이 사용 가능하다. 

스키마를 통해 일관된 데이터 구조를 유지할 수 있고, 메시지의 쓰기(producer)와 읽기(consumer)를 분리할 수 있다. 예를 들어 Producer가 Avro 형식으로 메시지를 보냈다면, Consumer는 Avro를 지원하는 한 같은 형식으로 데이터를 읽을 수 있다. 데이터의 형식이 정해져 있어서 "이 메시지를 어떻게 해석해야 하지?" 와 같은 문제가 사라진다.

Schema Registry를 사용하면, 데이터를 저장할 때 기존 스키마와 호환되는지 자동으로 검증이 가능하다. 새로운 필드가 추가되더라도, 기존 데이터와 충돌 없이 사용이 가능하다.

 

즉, 스키마를 사용하면 카프카에서 데이터를 안정적으로 교환할 수 있고, 애플리케이션 간의 데이터 형식 불일치를 방지할 수 있다.

3. 토픽과 파티션

카프카에 저장되는 메시지는 '토픽(topic)' 단위로 분류된다. 토픽은 데이터베이스의 테이블이나 파일시스템의 폴더와 유사한 개념으로 같은 유형의 데이터를 그룹화하는 역할을 한다. 토픽은 다시 여러개의 '파티션(partition)'으로 나뉘어진다. 

파티션에 메시지가 쓰여질 때는 추가만 가능한 형태(append-only)로 쓰여지며, 읽을 때는 맨 앞부터 제일 끝까지의 순서로 읽힌다. 대게 토픽에 여러개의 파티션이 있는 만큼 토픽 안의 메시지 전체에 대해서는 순서가 보장되지 않는다. 단일 파티션 안에서만 순서가 보장된다. 여러개의 서버에 분산 저장할 수 있어 확장성이 뛰어나다.

파티션은 복제(replication) 될 수 있다. -> 서로 다른 서버들이 동일한 파티션의 복제본을 저장하고 있기 때문에 서버 중 하나에 장애가 발생해도 데이터를 읽고 쓸 수 있다.

카프카에서는 스트림(stream)이라는 용어가 자주 사용된다. 일반적으로 스트림은 특정 토픽의 데이터를 의미하며, 프로듀서에서 컨슈머로 전달되는 데이터 흐름을 나타낸다. 스트림은 개별 파티션의 개수와 관계 없이 토픽 전체의 데이터 흐름을 다룰 때 사용되는 개념이다.

 

즉, 카프카는 토픽을 파티션 단위로 나누어 저장함으로써, 높은 처리량과 확장성을 제공하며 복제를 통해 고가용성도 갖추고 있다.

 


4. 카프카의 구성 요소 

1. 프로듀서 

프로듀서(Producer)는 데이터를 생성하고, 특정 토픽에 메시지를 전송하는 역할을 한다.

메시지를 보낼 때 어느 파티션에 저장할지 결정할지 결정하는 방식은 다음과 같다. 

  1. Key가 있는 경우엔 특정 파티션에 할당된다.
  2. Key가 없는 경우엔 라운드 로빈 방식으로 랜덤하게 배치된다.

 

2. 브로커

브로커(Broker)는 카프카 클러스터 내에서 메시지를 저장하고 관리하는 서버이다.

  1. 프로듀서로부터 메시지를 전달받아 오프셋(offset)을 할당한 뒤 디스크 저장소에 쓴다. 
  2. 컨슈머의 파티션 읽기(fetch) 요청 역시 처리하고 발행된 메시지를 보내준다.

카프카 클러스터 내에서 여러개의 브로커가 동작하는데, 이 중 하나의 브로커가 클러스터 컨트롤러의 역할을 수행한다. (자동으로 선정됨. 컨트롤러는 파티션을 브로커에 할당하고, 장애 발생 여부를 모니터링 한다. 

 

하나의 파티션은 클러스터 내 특정 브로커가 담당하며, 이 브로커를 파티션 리더(partition leader)라고 부른다. 

복제된 파티션은 다른 브로커에 저장되며, 이를 팔로워(follower)라고 부른다.

리더 브로커에 장애가 발생하면, 팔로워 중 하나가 자동으로 리더 역할을 승계한다.

모든 프로듀서는 항상 리더 브로커에게 메시지를 발행해야하지만, 컨슈머는 리더나 팔로워 중 하나로부터 데이터를 읽어올 수 있다.

 

3. 컨슈머 

컨슈머(Consumer)는 브로커에서 데이터를 가져와 처리하는 역할을 한다. 컨슈머는 1개 이상의 토픽을 구독(subscribe)해서 각 파티션에 저장된 메시지들을 순서대로 읽어 온다. 컨슈머는 메시지의 오프셋을 기록함으로써 어느 메시지까지 읽었는지를 추적한다.

 

오프셋(offset)이란? 

오프셋은 카프카가 메시지를 저장할 때 각 메시지에 부여하는 고유한 정수 값이다. 주어진 파티션의 각 메시지는 고유한 오프셋을 가지며, 뒤에 오는 메시지가 앞의 메시지보다 더 큰 오프셋을 가진다.  오프셋 덕분에 컨슈머는 처리 도중 중단되더라도 마지막으로 읽은 메시지 다음부터 다시 읽을 수 있다.

 

컨슈머는 컨슈머 그룹의 일부로 동작한다. 컨슈머 그룹은 여러개의 컨슈머가 협업하여 토픽의 메시지를 읽어올 수 있도록 도와준다.

컨슈머 그룹에는 여러개의 컨슈머가 있지만, 각 파티션은 같은 컨슈머 그룹 내에서 오직 하나의 컨슈머에게만 할당되며, 이를 파티션 소유권(Ownership)이라고 한다. 컨슈머 그룹을 사용하면 여러 컨슈머가 하나의 토픽을 병렬로 처리하여 성능을 향상시킬 수 있다.

 


5. 카프카 클러스터와 다중 클러스터 

1. 카프카 클러스터

카프카는 하나 이상의 브로커가 모여 클러스터(cluster)를 구성한다. 클러스터 안에서 브로커들은 토픽과 파티션을 저장하고 관리하는 역할을 한다. 브로커가 여러개 있으면 데이터를 분산 저장할 수 있어 처리량이 증가하고, 브로커 중 하나가 죽어도 다른 브로커가 복제본을 유지하기 떄문에 고가용성을 보장한다. 

ex) 만약 브로커가 3개 있는 클러스터라면, 토픽의 각 파티션을 여러 브로커에 나눠서 저장할 수 있다.

 

클러스터 내부에서는 역할이 나뉜다.

  • 컨트롤러: 클러스터를 관리하는 브로커 (자동으로 하나 선정됨)
  • 리더: 파티션을 관리하는 주 브로커 (모든 쓰기/읽기 담당)
  • 팔로워: 리더를 복제하는 브로커 (리더 장애 시 승계 가능)

 

2. 다중 클러스터

기업 환경에서는 보통 하나의 카프카 클러스터만 사용하지 않고 여러개의 클러스터를 운영한다. 왜 다중 클러스터가 필요할까?

  • 데이터 격리: 개발 환경과 운영 환경을 분리할 수 있음.
  • 지역 분산: 여러 데이터 센터에서 운영 가능
  • 부하 분산: 특정 서비스의 트래픽이 많아지면 별도의 클러스터에서 처리 가능.

 

결론

카프카는 대량의 데이터를 빠르고 안정적으로 처리할 수 있는 분산 메시징 시스템으로 확장성, 내결합성, 실시간 스트리밍 처리 등의 기능을 제공한다. 기존 메시지 큐와 비교 했을 떄 메시지를 저장하고 여러 소비자가 읽을 수 있다는 점이 가장 큰 차이점이며, 이를 활용하면 로그 수집, 이벤트 스트리밍, IoT 데이터 처리, 마이크로 서비스 간 통신 등의 다양한 애플리케이션 구축에 사용할 수 있다.

이번 학습을 통해 카프카의 핵심 개념을 정리했으며, 앞으로 프로듀서와 컨슈머를 직접 구현하고, 토픽과 파티션을 효율적으로 관리하는 방법 등을 실습하면서 카프카에 대한 이해도를 더욱 높여나갈 계획이다. 화이팅!! 👏