| Kafka의 메시지 처리 흐름
- 프로듀서 → Kafka 브로커:
- 프로듀서가 데이터를 생성하여 Kafka의 특정 토픽으로 발행
- 토픽의 파티션에 따라 데이터가 분산 저장
- Kafka 브로커 → 컨슈머:
- 컨슈머가 토픽을 구독하면, Kafka는 해당 데이터를 컨슈머로 전달
- 컨슈머는 각 파티션에서 데이터를 순차적으로 읽음
- 모니터링 및 분석:
- Prometheus는 Kafka 브로커의 상태를 지속적으로 수집
- Grafana를 통해 실시간 대시보드로 브로커, 파티션, 컨슈머 그룹 상태를 확인
| Kafka의 핵심 구성 요소와 역할
- Kafka 브로커:
데이터를 저장하고 프로듀서/컨슈머 간 메시지를 전달하는 중앙 허브.- 하나의 Kafka 클러스터는 여러 브로커로 구성됨.
- 각 브로커는 토픽과 파티션을 분산 저장함.
[Kafka 컨테이너와 브로커의 관계]
컨테이너 1개 = 브로커 1개
Kafka에서는 각 컨테이너가 하나의 브로커를 의미합니다.
예를 들어, docker-compose.yml에서 Kafka 컨테이너를 3개 정의하면, Kafka 클러스터는 3개의 브로커로 구성됩니다.
각각의 Kafka 브로커는 독립적인 인스턴스이며, 데이터와 메타데이터를 분산 처리합니다.
Kafka 브로커의 역할
데이터 저장: Kafka 브로커는 토픽 데이터를 파티션 단위로 로컬 디스크에 저장함.
데이터 전달: 프로듀서로부터 데이터를 받아 저장하고, 컨슈머에게 데이터를 전달함.
데이터 복제 :파티션 데이터를 복제하여 고가용성을 보장함.
- ZooKeeper (또는 Kraft):
클러스터 상태와 메타데이터(토픽 정보, 파티션 위치 등)를 관리.- 브로커 간의 협력을 조율하고 리더 선출 등을 담당.
[Kafka 클러스터가 되는 조건]
브로커 2개 이상:Kafka 클러스터는 기본적으로 2개 이상의 브로커로 구성됩니다.
ZooKeeper 또는 Kafka Kraft 사용:
Kafka 클러스터는 브로커 간 협업과 메타데이터 관리를 위해 ZooKeeper 또는 Kraft를 사용합니다.
ZooKeeper는 클러스터의 상태를 관리하고,
브로커와 파티션의 메타데이터를 저장합니다.
공유 메타데이터:
모든 브로커는 공유 메타데이터를 기반으로 협력합니다.
예: 특정 토픽과 파티션이 어느 브로커에 저장되었는지, 어떤 브로커가 리더인지 등의 정보.
[메타데이터 : 카프카 클러스터와 관련된 정보와 상태를 나타내는 데이터]
<요소>
- 토픽과 파티션 정보
토픽 이름
각 토픽에 속한 파티션의 개수
각 파티션의 리더 브로커
파티션의 복제본(replica) 리스트
ISR (In-Sync Replica) 리스트: 최신 상태를 유지하고 있는 복제본 목록
- 브로커 정보
클러스터에 있는 브로커들의 ID와 호스트 정보(IP 주소, 포트 등)
브로커의 가용성 상태 (활성/비활성)
- 컨트롤러 정보
클러스터 내에서 컨트롤러 역할을 담당하는 브로커의 ID
컨트롤러는 파티션 리더 선출, 토픽 생성/삭제 등 클러스터 관리를 담당함.
- 프로듀서/컨슈머 그룹 상태
각 프로듀서와 컨슈머가 어느 토픽과 파티션을 사용하는지
컨슈머 그룹의 오프셋(offset) 정보
컨슈머가 읽고 있는 메시지의 최신 상태
<용도>
- 클라이언트 연결
프로듀서와 컨슈머는 브로커와 통신하기 전에 클러스터의 메타데이터를 요청하여 필요한 브로커 및 파티션 정보를 가져옴.
이를 통해 적절한 브로커에 메시지를 전송하거나 메시지를 읽음.
- 리더 선출
파티션의 리더 브로커가 다운되면, 컨트롤러는 메타데이터를 기반으로 새로운 리더를 선출함.
- 장애 복구
메타데이터를 사용하여 브로커 간의 복제 및 ISR 리스트를 관리해 장애 발생 시 데이터 손실을 최소화함.
- 운영 및 관리
관리자와 모니터링 도구가 메타데이터를 사용하여 클러스터 상태를 확인하고 성능을 튜닝하거나 문제를 해결함.
- Schema Registry:
메시지 데이터의 형식을 정의하고 관리.- 데이터 스키마를 Avro, JSON 등으로 정의하여 호환성을 보장.
[없으면 ?]
데이터 호환성과 안정성을 보장할 수 없음
Kafka는 메시지 내용에 대해 알지 못한다
Kafka는 데이터를 단순히 바이트 배열(byte array)로 저장하고,데이터의 내용(스키마)에 대해서는 관여하지 않음.
프로듀서와 컨슈머가 데이터를 이해하고 처리하려면 데이터의 형식(스키마)이 명확해야 함.
분산 시스템에서 형식 불일치 문제
Kafka의 프로듀서(발행자)와 컨슈머(구독자)가 서로 다른 형식의 데이터를 사용하면 심각한 오류가 발생함.
예: 프로듀서는 JSON 형식으로 데이터를 발행했는데, 컨슈머는 Avro 형식으로 데이터를 기대하는 경우.
데이터 구조가 변경되면 이를 모든 클라이언트(프로듀서, 컨슈머)에 알려야 하는데, 관리가 어려움
데이터 변경 관리의 복잡성
현실에서는 데이터 형식(스키마)이 시간이 지남에 따라 변경됨.
예: "사용자 데이터"에 새 필드(address)를 추가하거나 기존 필드(age)를 삭제하는 경우..
데이터 변경 시 기존 데이터를 사용하는 컨슈머가 정상적으로 동작하려면 하위 호환성(Backward Compatibility)이 보장되어야 함
- ksqlDB:
Kafka 데이터를 SQL처럼 쿼리하여 실시간으로 처리.- 스트림 데이터의 집계, 필터링, 전환 등을 수행.
[스트림(Stream)이란?]
Kafka 토픽에 저장된 데이터를 실시간으로 처리하고 분석하기 위한 데이터의 연속적인 흐름임.
Kafka에서 데이터를 읽어 들이는 동안, 데이터는 스트림 형태로 다뤄짐
토픽은 원본 데이터 저장소
스트림은 그 데이터를 가공하고 분기시키는 작업 단위
ksqlDB는 스트림을 쉽게 정의하기 위한 도구
- Prometheus + Grafana:
Kafka 클러스터의 상태와 성능을 실시간으로 모니터링 및 시각화.- Kafka 브로커의 메시지 처리량, 파티션 상태, 컨슈머 그룹의 동작 등을 추적.
kafka 운영 환경에서 중요한 지표를 실시간 추적, 분석, 시각화 할 수 있게 도와주는 도구.
[Prometheus + Grafana의 주요 역할]
Kafka 클러스터 상태 모니터링
- 브로커 상태: 각 Kafka 브로커의 상태 확인 (작동 여부, 리소스 사용량).
- 파티션 상태: 토픽의 파티션 리더/팔로워 상태, 불균형 여부.
- 메타데이터 정보: Kafka 클러스터의 리더 선출 상황, 복제본 상태.
Kafka 성능 추적
- 메시지 처리량: 초당 발행/소비된 메시지 수 (프로듀서와 컨슈머의 처리량).
- 파티션 레이턴시: 데이터가 브로커에 도달하고 컨슈머에게 전달되는 시간 (지연 시간).
- 컨슈머 그룹 상태: 컨슈머 그룹이 메시지를 정상적으로 소비하고 있는지, 지연(Offset Lag)이 발생했는지 확인.
로그 분석
- Kafka의 로그 데이터를 통해 시스템 오류, 경고 등을 추적.
- 클러스터 동작 중 발생한 장애를 신속히 파악하고 대응.
시각화
- Prometheus가 수집한 메트릭 데이터를 Grafana 대시보드에서 시각적으로 확인.
- 실시간 지표, 과거 데이터 비교, 경고 알림 등을 통해 Kafka 클러스터의 상태를 한눈에 파악.
Prometheus + Grafana 통합 구조
Prometheus
- 데이터 수집 및 저장: Prometheus는 Kafka Exporter 등과 통합하여 Kafka 브로커 및 클러스터 상태 데이터를 수집함.
데이터를 시계열(Time-Series) 데이터베이스에 저장.
- Kafka Exporter
Prometheus가 Kafka의 메트릭 데이터를 수집할 수 있도록 하는 도구.
주요 메트릭: 브로커별 메시지 처리량. 컨슈머 그룹 지연 (Offset Lag). 파티션 상태.
Grafana
- 시각화 및 대시보드 제공: Prometheus가 수집한 데이터를 시각적으로 표현.
Kafka 클러스터 상태를 실시간으로 보여주는 대시보드를 구성할 수 있음.
- 경고(Alert): 특정 조건(예: 메시지 지연 증가, 브로커 다운 등)이 발생하면 알림을 설정 가능.
Kafka는 실시간 데이터 스트림 처리를 위한 메시징 플랫폼으로, 토픽(데이터의 논리적 구분)과 파티션(병렬 처리와 확장성을 위한 물리적 구분)이 핵심.
Prometheus + Grafana는 Kafka의 상태를 모니터링하고 문제를 사전에 탐지하여, 클러스터의 안정성을 높이는 데 사용.
'Kafka' 카테고리의 다른 글
[카프카 입문] 사용 전후 example (0) | 2025.01.07 |
---|---|
[Kafka 입문] 다중 브로커, 레플리카 (1) | 2025.01.03 |
[Kafka 입문] 토픽, 파티션, 스트림 (1) | 2025.01.02 |