Apache Kafka는 대용량의 데이터를 빠르게 처리하고 실시간 스트리밍을 지원하는 pub/sub 모델의 분산 메시지 브로커로 주로 로그 처리, 이벤트 기반 아키텍처, 데이터 스트리밍 등에 활용된다.
Kafka는 분산 환경에서 안정적으로 운영되기 위해 Zookeeper를 사용하여 클러스터를 관리한다.
Zookeeper는 Kafka의 메타데이터 저장, 브로커의 상태 감시, 리더 선출과 같은 중요한 역할을 수행한다.
Kafka의 주요 구성 요소
- Broker: Kafka 서버로, Producer로부터 메시지를 받아 저장하고, Consumer에게 전달하는 역할을 한다.
- Topic & Partition:
- Topic: 메시지를 논리적으로 분류하는 단위.
- Partition: 토픽을 분할하여 저장하는 단위로 토픽은 하나 이상의 파티션으로 나누어지며, 각 파티션은 메시지의 순서를 보장하며, 데이터를 분산시켜 여러 서버(Broker)에 저장할 수 있다.
- Producer: 데이터를 Kafka의 특정 Topic으로 전송하는 역할을 한다.
- Consumer & Consumer Group:
- Consumer: Kafka에서 데이터를 읽어 가는 주체.
- Consumer Group: 여러 Consumer가 하나의 그룹으로 묶여 병렬로 메시지를 처리할 수 있도록 지원한다. 이 때 하나의 파티션은 동일한 Consumer Group 내에서 하나의 Consumer만 처리할 수 있다.
- Zookeeper: 분산 시스템을 위한 서비스 다음과 같은 역할을 수행한다.
- 브로커 등록 및 모니터링: 새로운 브로커가 추가되거나 제거될 때 이를 관리.
- 리더 선출: 특정 브로커가 다운되더라도 Consumer가 데이터를 읽을 수 있도록 리더 브로커를 선출.
- 메타데이터 및 설정 관리: Topic, Partition, Broker ID, Controller 등의 정보를 저장하고 관리.
- KRaft 모드에서는 Zookeeper 없이 자체적으로 운영이 가능하다.
- Record: 데이터의 기본 단위로 key-value로 구성
- Offset: 특정 파티션 내의 레코드 위치를 식별하기 위한 값
이를 좀 더 쉽게 이해할 수 있도록 예시를 들어보겠다.
예를 들어 해당 뉴스의 어떤 분야를 구독하면 구독자들이 기사가 올라왔을 때 볼 수 있는 서비스가 있다고 하자.
그럼 구성 요소는 다음과 같다.
- Producer : 새로운 뉴스 기사를 작성하고 이를 Kafka에 전달하는 뉴스 기자
- Topic: 뉴스 기사 주제 (예: "경제", "스포츠")
- Partition: Topic을 분할하여 저장하는 단위 (스포츠의 파티션은 축구, 농구, 야구, e스포츠 등으로 나눌 수 있다.)
- Consumer: 카프카에서 데이터를 읽어오는 주체.
- Consumer Group: 동일한 토픽의 메시지를 협력하여 처리하는 다수의 Consumer를 묶은 그룹
- Broker: Kafka 서버
- Zookeeper: 브로커의 상태 관리 및 모니터링
- 뉴스 기자가 스포츠 뉴스 토픽의 축구 뉴스 파티션에 기사를 발행
- 뉴스 기자가 축구 관련 뉴스 기사를 발행.
- 브로커는 스포츠 토픽의 Partition 0, 오프셋 0에 저장
- 축구 파티션을 처리하는 Consumer A가 해당 기사 읽고 처리, 오프셋 1로 업데이트
- 다음 축구 기사가 들어오면 Partition 0, 오프셋 1에 저장.
- Consumer A가 다음 기사 읽고 처리, 오프셋 2로 업데이트
여기서 알 수 있는 사실은 하나의 파티션은 컨슈머 그룹 내 한 개의 컨슈머에 의해서만 읽힐 수 있다는 것이다.
즉 컨슈머 수는 파티션 수를 초과할 수 없다. 왜냐하면 컨슈머의 개수가 파티션 개수보다 많아지는 경우는 일부 컨슈머는 아무 작업도 수행하지 않기 때문이다.
Replication
Kafka의 Replication(복제)은 데이터의 내구성과 가용성을 보장하는 핵심 기능으로, Replication을 통해 특정 Broker가 장애가 발생하더라도 데이터를 안전하게 보호, 지속적인 서비스 운영이 가능하다.
(1) 리더(Leader)와 팔로워(Follower)
- Leader: 각 Partition은 하나의 리더(Leader)가 존재하며, 모든 읽기/쓰기 작업이 리더에서 처리된다.
- Follower: Leader의 데이터를 복제하는 역할을 하며, Leader가 다운될 경우 새로운 Leader로 승격될 수 있다.
예를 들어 Broker가 3대 존재하고 TopicA의 Partition0이 Broker1에 Leader로 존재하면, Broker2와 Broker3에 Follower로 복제가 된다. Producer는 Broker-1(Leader)에게 데이터를 보내게 되고, 해당 리더 데이터는 Broker2와 Broker3(Follower)이 복제를 한다.
만약 Broker-1이 다운되면, Broker2가 새로운 Leader로 승격되고 읽기/쓰기를 처리한다.
(2) Replication Factor
- 특정 파티션의 데이터가 몇 개의 Broker에 복제될지를 결정하는 값
예를 들어 Replication Factor = 3이라면 한 개의 Leader + 두 개의 Follower → 총 3개의 복제본이 존재한다는 의미이다.
이 때 Replication Factor 값은 Broker 개수보다 작거나 같아야 하며, 너무 높은 값 설정 시 저장 공간 낭비된다.
(3) ISR (In-Sync Replicas)
- ISR(In-Sync Replicas)은 Leader와 동기화된 상태의 Follower 목록으로 Leader는 ISR에 속한 Follower에게만 데이터를 복제한다.
정리
이렇게 Apache Kafka의 기본 개념에 대해서 간단히 알아보았다. Kafka는 기본적으로 여러 개의 브로커로 구성되어 장애가 발생해도 시스템을 유지할 수 있으며, 데이터를 디스크에 저장, 복제하여 데이터 손실을 방지한다. 또한 프로듀서와 컨슈머가 비동기적으로 작동하여 대용량의 메시지를 처리할 수 있으며 Pull 방식 메시지 처리하므로 Consumer가 원하는 속도로 데이터를 가져올 수 있다는 장점이 있다.
Apache Kafka
Apache Kafka: A Distributed Streaming Platform.
kafka.apache.org
'DevOps' 카테고리의 다른 글
[Kafka] Docker Compose를 이용하여 Kafka 환경 구성하기 (0) | 2025.03.08 |
---|---|
Docker MySQL + Spring boot 연동 (0) | 2024.12.30 |
[Docker] Docker, Docker-Compose 개념 (0) | 2024.12.23 |