카테고리 없음

[Kafka] 카프카(Kafka) 란?

늘이 2023. 12. 4. 14:52

 

 

 

1. 카프카(kafka)?

  • 실시간 데이터 스트리밍을 처리할 수 있는 오픈소스 메시지 브로커 시스템
  • 분산 이벤트 스트리밍 플랫폼으로 대용량 실시간 데이터 스트림을 처리하고 저장하는데 사용
  • 카프카는 원래 링크드인(LinkedIn)에서 개발되었으며 현재는 아파치 소프트웨어 재단의 오픈소스 프로젝트로 관리되고 있음
  • 주로 데이터 파이프라인, 로그 수집, 실시간 분석 같은 분야에서 많이 사용

 


2. 주요 구성요소

  • 카프카를 이해할 때 카프카 클러스터와 카프카 전체 주요 구성요소를 구분해서 볼 수 있다.
  • 카프카 클러스터 구성요소: 브로커(Broker), 토픽(Topic), 파티션(Partition), 리플리카(Replica),  컨트롤러(controller), 주키퍼(Zookeeper)
  • 카프카 전체 주요 구성요소: 프로듀서(Producer), 컨슈머(consumer), 컨슈머 그룹(Consumer Gruop)

 

1. 카프카 클러스터

  • 여러 대의 서버로 구성된 분산 시스템으로, 대량의 데이터를 안정적으로 처리하고 저장하기 위해 사용됨
  • 클러스터링을 통해 고가용성, 확장성 및 내결함성을 달성할 수 있음
  • 카프카 클러스터는 주로 여러 개의 브로커로 이루어져 있음 

 

1) 브로커(Broker)

  • 카프카 클러스터를 구성하는 각 서버를 브로커라고 함
  • 카프카에게 메시지를 수신하거나 전송하는 역할을 함
  • 클러스터 내에서 여러 브로커가 협력하여 데이터를 분산하고 관리함

 

2) 토픽(Topic)

  • 데이터(주로 이벤트나 메시지)가 발생하는 주제를 나타내는 개념으로 데이터의 유형이나 카테고리라고 볼 수 있음
  • 프로듀서는 특정 토픽으로 메시지를 보내고, 컨슈머는 토픽을 구독해서 메시지를 읽음
  • 카프카 안에서 메시지가 저장되는 장소 논리적 표현
  • 각 토픽은 한 개 이상의 파티션으로 구성됨

 

3) 파티션(Partition)

  • 토픽은 이벤트를 분류하는 논리적인 카테고리이며, 파티션은 특정 토픽 내에서 메시지를 물리적으로 분할하여 저장하는 방법
  • 파티션은 데이터를 분산하여 여러 브로커에 저장하고 처리할 수 있도록 함
  • 각 토픽은 하나 이상의 파티션으로 나눠질 수 있으므로 여러 브로커에 분산하여 저장하고 처리할 수 있게 해주며 병렬로 데이터를 처리하는데 도움을 줌
  • 파티션은 추가만 가능한(append-only)파일
  • 각 메시지 저장 위치를 오프셋(offset)이라고 함
  • 프로듀서가 넣은 메시지는 파티션의 맨 뒤에 추가되며 컨슈머는 오프셋 기준으로 메시지를 순서대로 읽음(들어오는 순서대로 읽힘)
  • 한 파티션 내에서만 메시지 순서를 보장함
  • 메시지는 삭제되지 않음(파일이기 때문에 남아 있음, 컨슈머가 읽었는지 안읽었는 여부는 상관없이 삭제X, 설정에 따라 일정 시간이 지난 뒤 삭제될 수는 있음)
  • 각 파티션은 여러 개의 리플리카로 구성되어 있음

 

4) 리플리카(Replica)

  • 카프카는 데이터의 안정성과 내결함성을 보장하기 위해 리플리카 구조를 사용함
  • 각 파티션(Partition)은 설정된 복제 수만큼 복제본(Replica)이 생성되어, 여러 브로커(Broker)에 분산 저장됨
  • 각 브로커에 생긴 리플리카 중 하나는 리더(leader)가 되고 나머지는 팔로워(follower)가 됨
  • 프로듀서와 컨슈머는 항상 리더를 통해서만 메시징 처리
  • 리더가 속한 브로커에 장애가 발생한 경우 자동으로 다른 팔로워가 리더로 승격되므로 무중단 서비스 가능
  • 내구성, 고가용성, 장애복구를 위해 사용

 

6) 주키퍼(Zookeeper)

  • 카프카 클러스터의 구성 정보, 리더와 팔로워 상태 등을 관리해주는 시스템
  • 주키퍼는 분산 시스템에서 코디네이션 역할을 하는데, 카프카에서는 브로커의 메타데이터와 클러스터 상태를 저장
  • Zookeeper는 Kafka 2.x까지 필수였으나, Kafka 3.x부터는 자체 내장 메타데이터 관리 시스템(KRaft)을 통해 Zookeeper 없이도 운영 가능함(다만 아직은 일부 기능에서 KRaft의 안정성이나 호환성 검토 필요)

 

2. 카프카 전체 주요 구성요소

1) 프로듀서(Producer)

  • 데이터(주로 이벤트나 메시지)를 카프카 토픽(Topic)으로 보내는 주체(예: 로그 수집기, 센서, 웹 서버)
  • 실시간으로 발생하는 데이터나 이벤트를 생성하고, 카프카의 특정 토픽으로 푸시(또는 publish)

 

2) 컨슈머(Consumer)

  • 카프카 토픽에서 데이터(이벤트 또는 메시지)를 읽어오는 주체(예: 데이터 처리 서버, 분석 시스템)
  • 특정 토픽에 대해 구독(subscribe)을 하여 새로운 이벤트가 발생할 때마다 해당 이벤트를 처리함
  • 컨슈머는 컨슈머 그룹에 속함

 

3) 컨슈머 그룹(Consumer Group)

  • 한 개 파티션은 컨슈머 그룹의 한 개 컨슈머만 연결 가능(같은 컨슈머 그룹에 속한 컨슈머들은 같은 파티션 공유 불가)
  • 한 컨슈머 그룹 기준으로 파티션의 메시지는 순서대로 처리
  • 주요 역할은 구독과 토픽 파티션, 메시지 처리, 오프셋 관리, 컨슈머 그룹, 확장성, 오토커밋/수동커밋이 있음 

 


3. 동작 흐름

 

Producer ───> Broker ───> Consumer
             (메시지 저장)

 

  • Producer가 Topic에 메시지 전송
  • Kafka Broker가 메시지를 해당 Topic의 Partition에 저장
  • Consumer가 해당 Topic을 구독해서 메시지를 읽음

 

 

 


 

 4. 카프카의 성능

1. 파티션 파일은 OS가 제공하는 페이지 캐시 사용

  • 파티션에 대한 파일 IO를 메모리에서 처리
  • 서버에서 페이지캐시를 카프카만 사용해야 성능에 유리함

 

2. Zero Copy

  • OS가 데이터를 사용자 공간(User Space)을 거치지 않고 디스크에서 네트워크로 직접 복사해주는 기법
  • 디스크 버퍼에서 네트워크 버퍼로 직접 데이터 복사

 

3. 컨슈머 추적을 위해 브로커가 하는 일이 비교적 단순

  • 메시지 필터, 메시지 재전송과 같은 일은 브로커가 하지 않음(프로듀서, 컨슈머가 직접 해야 함)
  • 브로커는 컨슈머와 파티션 간 매핑 관리

 

4. 묶어서 보내기, 묶어서 받기(batch)

  • Throughput을 높이기 위한 대표적인 방식으로 메시지를 하나씩 처리하는 것보다 CPU, I/O 효율이 높아짐
  • 프로듀서는 일정 크기만큼 메시지를 모아서 전송하고, 컨슈머는 최소 크기만큼 메시지를 모아서 조회
  • 낱개 처리보다 처리량 증가

 

5. 처리량 증대(확장)가 쉬움

  • 1개 장비의 용량 한계는 브로커, 파티션 추가로 극복 가능
  • 컨슈머가 느리면 컨슈머, 파티션 추가로 극복 가능