Kafka
- Apache Kafka 공식 페이지에서 "높은 성능의 데이터 파이프라인, 분석 스트리밍, 테이터 통합을 위해 사용하는 분산 이벤트 스트리밍 플랫폼이"라고 소개한다.
분산 이벤트 스트리밍 플랫폼
- 분산(Distributed)
- 여러 서버에 걸쳐 분산된 아키텍처로 구성된 시스템을 의미한다.
- 이벤트(Event)
- 애플리케이션에서 발생하는 어떤 사건이나 상태 변화를 의미한다. 게시물 조회, 등록, 수정 같은 것들이 될 수 있다.
- 스트리밍(Streaming)
- 데이터가 지속적으로 생성되고, 이를 실시간으로 처리하고 소비할 수 있도록 설계된 방식이다.
- 이벤트 스트리밍
- 이벤트 스트리밍은 이벤트(또는 데이터)를 지속적으로 처리, 저장, 전달하는 기술이다.
- 분산(Distributed)
Kafka를 구성하는 요소(들)
Kafka Cluster
- 카프카 클러스터는 주키퍼, 브로커, 토픽, 파티션, 리플리케이션으로 구성된 논리적 개념이다.
. +----------------+ | Kafka Cluster | . +----------------+ . / | \ / | \ / | \ +-----------+ +-----------+ +-----------+ | Broker 1 | | Broker 2 | | Broker 3 | +-----------+ +-----------+ +-----------+
Zookeeper
- 메타데이터 관리
- 카프카 클러스터의 메타데이터(브로커, 토픽, 파티션 정보)를 관리한다.
- 리더 선출
- 각 파티션의 리더(leader) 브로커를 선출한다. 리더 브로커는 파티션의 모든 읽기/쓰기 요청을 처리한다.
- 브로커 상태 관리
- 브로커 상태를 모니터링 하고 브로커가 추가되거나 제거될 때 다른 브로커들에게 전파한다. 이것을 통해 클러스터의 동기화를 유지한다.
- 카프카 최신 버전에서 주키퍼 의존성을 제거했음
- 주키퍼를 유지 보수하는 것은 추가 비용이 든다. (서버, 운영) 카프카가 자체적으로 메타데이터를 관리할 수 있는 기능을 추가해서 이 비용을 없애려는 목적.
- 카프카가 자체적으로 메타데이터를 관리하면 더 빨리 메타데이터를 조회하고 업데이트 할 수 있으므로 성능을 높일 수 있다.
- 주키퍼는 클러스터 내 단일 장애 지점(Single Point of Failure)이다. 주키퍼 의존성을 제거해서 SPOF를 없앨 수 있다.
- KRaft(Kafka Raft)
- 카프카는 주키퍼를 대체하기 위해 KRaft를 도입.
- KRaft는 카프카 브로커들이 직접 메타데이터를 관리하고 Raft consensus 알고리즘을 사용하여 메타데이터의 일관성을 유지.
- 메타데이터 관리
Broker
- 브로커는 메시지를 저장하고 관리하며 프로듀서와 컨슈머의 요청을 처리한다.
- 여러 브로커가 모여 카프카 클러스터를 구성한다.
- 데이터를 분산 저장하고 복제하여 높은 가용성과 내구성 보장한다.
- 높은 가용성(HA, High availability)
- 시스템이 최대한 오랫동안 중단없이 지속적으로 운영될 수 있는 능력
- 내구성(Durability)
- 데이터가 시스템에 한번 기록되면 시스템 장애나 오류가 발생해도 데이터가 손실되지 않고 안전하게 보관된다는 것을 보장하는 것을 의미.
- 높은 가용성(HA, High availability)
- 토픽과 파티션으로 나누어 데이터를 저장한다. 각 토픽은 여러 파티션으로 나뉘며, 파티션은 브로커에 분산 저장됨.
- 파티션 내 데이터는 세그먼트라는 더 작은 단위로 나뉘어 저장됨
- 브로커는 클러스터의 메타데이터를 관리하는 일도 함. 토픽, 파티션, 리더/팔로워 정보를 관리한다.
- 주키퍼와 상호 작용. KRaft 방식을 사용한다면 브로커가 직접 메타데이터를 관리.
- 클라이언트(컨슈머, 프로듀서) 요청 처리
- Replication 및 leader - follower 기능
- 데이터 압축 및 삭제(로그 세그먼트 압축, 삭제)
Producer
- 데이터를 Kafka 클러스터의 특정 토픽으로 전송하는 클라이언트 애플리케이션. 데이터가 안정적으로 전송되었다는 것을 보장하기 위해 ACK를 설정할 수 있다.
Consumer
- 컨슈머는 카프카 클러스터 특정 토픽에서 데이터를 읽어오는 클라이언트 애플리케이션이다.
- 컨슈머는 구독하는 토픽을 폴링하여 데이터를 읽어온다.
- 컨슈머는 하나의 컨슈머 그룹에 속한다.
- 컨슈머는 데이터를 읽어온 위치를 오프셋으로 기록한다. 오프셋으로 데이터 중복 처리나 누락을 방지할 수 있다.
- 오프셋은
__consumer_offsets
라는 내부 토픽에 컨슈머 그룹 단위로 기록됨. - 컨슈머는 메시지를 읽고 나서 어디까지 읽었는지 오프셋을 커밋한다.
- 브로커는 내부 토픽에 오프셋을 기록한다.
- 오프셋은
Consumer Group
- 컨슈머 그룹은 컨슈머 인스턴스가 협력하여 하나의 토픽을 병렬로 소비할 수 있도록 하는 개념이다. 동일한 그룹 ID를 공유하는 컨슈머들로 구성된다.
- 컨슈머 그룹 내 컨슈머는 할당된 파티션에서 데이터를 소비한다. 파티션 할당은 브로커가 한다.
- 파티션 수보다 컨슈머 수가 많은 것은 의미없음.
+-------------------+ | Consumer Group | | (my-group) | +-------------------+ / | \ / | \ / | \ +------------+ +------------+ +------------+ | Consumer 1 | | Consumer 2 | | Consumer 3 | +------------+ +------------+ +------------+ | | | +---------+ +---------+ +---------+ +---------+ +---------+ | Part 0 | | Part 1 | | Part 2 | | Part 3 | | Part 4 | +---------+ +---------+ +---------+ +---------+ +---------+ | | | | | Kafka Cluster with Topic (my-topic) and 6 Partitions
Topic
- 토픽은 메시지를 구분하는 논리적 단위다. 토픽은 카프카 클러스터에서 데이터가 저장되고 프로듀서, 컨슈머가 데이터를 주고받는 기본 단위다. 토픽은 여러 파티션으로 나뉘어져 있고, 각 파티션은 여러 브로커에 분산 저장된다.
Partition
- 토픽은 여러 파티션으로 나뉘어진다. 파티션은 메시지를 순차 저장하고, 저장된 메시지는 고유한 오프셋을 가진다.
- 파티션 내에서는 메시지의 순서를 보장하지만 여러 파티션에 걸쳐 메시지가 분산 저장되기 때문에 전체 메시지 순서는 보장할 수 없다.
Replication
- 파티션 데이터의 내구성(durability)을 보장하기 위해 파티션은 여러 브로커에 복제된다. 각 파티션은 하나의 리더와 여러 팔로워 복제본을 가진다.
Topic: my-topic +----------------+----------------+----------------+ | Partition 0 | Partition 1 | Partition 2 | | | | | | Msg 0, Msg 1, | Msg 0, Msg 1, | Msg 0, Msg 1, | | Msg 2, Msg 3 | Msg 2, Msg 3 | Msg 2, Msg 3 | +----------------+----------------+----------------+
'Study > kafka' 카테고리의 다른 글
카프카 프로듀서, 컨슈머 기본 동작 (0) | 2023.02.20 |
---|---|
카프카 용어 (0) | 2023.02.19 |
카프카 기본 (0) | 2023.02.19 |