2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

Kafka란 뭘까?

2024. 9. 29. 00:04ㆍ정보
Kafka는 고성능 분산 이벤트 스트리밍 플랫폼?

 

 

1. Kafka

  • Kafka란 무엇일가
    • Kafka란 Apache Software Foundation에서 개발된 분산 이벤트 스트리밍 플랫폼이다. 분산 환경에서 데이터 스트리밍, 로그 수집 및 실시간 데이터 파이프라인 구축에 사용됩니다. 본래 LinkedIn에서 내부 로그 수집 시스템으로 시작됐지만 현재는 대규모 데이터 스트리밍, 실시간 분석, 이벤트 처리 등에 광범위하게 활용되고 있다.

  • 그럼 어쩌다가 Kafka가 사용 되었을까?
    • Kafka의 탄생 배경은 LinkedIn 에서 발생한 문제점과 요구사항에서 출발하였고, LinkedIn은 사용자 수가 빠르게 증가하면서도 하루에도 수백만 건 이상의 로그와 이벤트를 처리해야 했고, 이 데이터를 기반으로 여러 애플리케이션과 시스템이 협력해야 했었다. 그 중에서도 로그 데이터 수집의 복잡성으로 인해 데이터 파이프라인이 복잡해졌고, 데이터 유실이나 지연이 자주 발생하고 특히 당시 사용하던 메시징 시스탬은 특정 상황에서 성능이나 안정성 측면에서 한계를 보였다. 마지막으로 데이터 양이 폭발적으로 증가할 때는 서버 확장이나 데이터 관리가 어려워 이러한 문제들을 해결하기 위해 LinkedIn은 자체적으로 Kafka를 개발하게 되었고 2011년에 오픈소스로 공개하였다. Kafka는 데이터의 실시간 처리, 높은 처리량, 내구성, 확장성 측면에서 기존 메시지 브로커 시스템의 문제를 해결했고, 점점 더 많은 기업들이 Kafka를 사용하기 시작했다.

  • KafKa의 주요 특징으로는 무엇이 있을까?
    • 분산 시스템 : Kafka는 여러 서버(브로커)에 데이터를 분산 저장하고 처리할 수 있다. 따라서 시스템이 커져도 손쉽게 확장할 수있고, 고가용성을 유지할 수 있다.
    • 내구성 (Durability) : Kafka는 메시지를 로그 형태로 저장해두기 때문에 특정 기간 동안 데이터를 보존할 수 있다. 이 기간 동안 소비자는 언제든지 데이터를 읽어갈 수 있다.
    • 고성능, 높은 처리량 : 대량의 데이터를 매우 빠르게 처리할 수 있다. 초당 수백만 건의 메시지를 처리 가능.
    • 내결함성(Fault Tolerance) 클러스터 내의 브로커가 장애가 발생해도 데이터 손실 없이 서비스가 정상적으로 유지될 수 있다.
    • 유연한 소비 모델 : Kafka의 Topic은 여러 파티션으로 나뉘어져서 병렬 처리가 가능하고, 같은 데이터를 여러 소비자 그룹이 독립적으로 구독할 수 있다.
    • 한 번 작성, 여러 번 소비 : 메시지는 한 번 작성되면 여러 소비자 그룹이 각기 독립적으로 해당 메시지를 소비할 수 있다. 이로 인해 다양한 애플리케이션에서 같은 데이터를 사용할 수 있다.

  • Kafka의 용도는 어디에 쓰일까?
    • 실시간 로그 수집 및 분석 : 여러 서버에서 발생하는 로그를 Kafka를 통해 중앙 집중식으로 수집하고, 실시간으로 분석 시스템에 전달하여 모니터링을 수행할 수 있다.
    • 이벤트 스트리밍 : 사용자 행동 로그  IoT 장비 데이터, 금융 거래 내역 등을 실시간으로 수집하고 처리.
    • 데이터 파이프라인 : 서로 다른 데이터 소스에서를 수집하고, 이를 다른 시스템으로 전달하는 데이터 파이프라인을 구축할 때 사용
    • 실시간 데이터 처리 및 분석 : Kafka Streams나 Apache Spark 같은 스트리밍 프레임워크와 연동하여 실시간 데이터 분석을 수행할 수 있다.
    • 메시지 브로커 : 다른 시스템들 간의 비동기 메시지 전달을 관리. 데이터 흐름를 제어할 때 사용.

  • Kafka의 기본적인 구성 요소
    • Product : 데이터를 Kafka에 전송하는 역할 을 한다. Product의 특정 Topic에 데이터를 전송하고, 이 데이터는 파티션에 따라 분산 저장된다.
    • Customer : Kafka의 Topic에서 데이터를 읽어오는 역할을 한다. Customer들은 Topic을 구독하고, 메시지를 가져와서 원하는 처리를 수행할 수 있다.
    • Broker : Kafka 서버 자체를 의미. 데이터를 저장하고, 생산자와 소비자 간의 통신을 관리하는 중간 관리자 역할을 한다. Kafka 클러스터 내에 여러 브로커가 있을 수 있다.
    • Topic : 데이터가 저장되는 논리적 단위. ex) 로그 데이터는 logs라는 Topic에 저장되고, 사용자 이벤트 데이터는 user_events라는 Topic에 저장
    • Partition : 각 Topic은 여러 파티션으로 나누어져 있다. 파티션은 데이터를 분산 저장하고, 병렬 처리를 가능하게 한다.
    • Consumer Group :  여러 소비자가 하나의 그룹으로 묶여서 데이터를 처리할 수 있다. Consumer Group을 사용하면 메시지를 중복 소비하지 않고, 각 소비자가 분할된 파티션 데이터를 처리할 수 있다

  • Kafka 관련 용어 정리
    • Topic : Kafka에서 데이터를 분류하는 논리적인 단위. 데이터는 특정 Topic에 기록되며, Consumer는 해당 Topic을 구독하여 데이터를 가져간다
    • Partition : 각 Topic은 여러 파티션으로 나뉘어져 있다. 파티션은 데이터를 물리적으로 분산 저장하고, 병렬 처리를 가능하게 한다.
    • Producer : Kafka로 데이터를 전송하는 애플리케이션을 의미한다. Producer는 데이터를 특정 Topic으로 전송
    • Consumer : Kafka의 Topic 데이터를 읽어오는 애플리케이션을 의미. Consumer는 Topic을 구독하고, 데이터를 소비
    • Broker : Kafka 서버 자체를 의미. 브로커는 데이터를 저장하고, Producer와 Consumer 간의 통신을 관리한다.
    • Zookeeper : Kafka 클러스터의 메타데이터를 관리하고, 브로커 간의 조정, 리더 선출, 오프셋 관리 등을 수행하는 도구
    • Consumer Group : 동일한 Topic의 메시지를 병렬로 소비하기 위해 여러 Consumer를 묶은 그룹. 각 파티션은 하나의 Consumer에만 할당
    • Offset : 각 파티션 내에서 메시지가 저장된 위치를 나타내는 값. 오프셋을 통해 Consumer가 어디까지 데이터를 읽었는지 알 수 있다.
    • Replication Factor : 각 파티션을 몇 개의 브로커에 복제할 것인지 설정하는 값. 높은 복제 계수는 데이터의 내구성을 높이지만,디스크 사용량도 증가시킴
    • ISR (In - Sync - Replica) : 현재 리더 파티션과 동기화가 완료된 복제본들을 의미. ISR에 포함된 복제본들은 데이터의 최신 상태를 유지.

  • Kafka 명령어 옵션 정리
    •  --bootstrap-server : Kafka 브로커 주소를 지정
    •  --topic : 메시지를 전송할 또는 구독할 특정 토픽을 지정
    •  --partition : 특정 파티션을 지정하여 메시지를 전송하거나 소비
    •  --replication-factor : 토픽의 복제 계수를 설정 (데이터 안정성을 위해)
    •  --from-beginning : 메시지를 처음부터 소비 (과거 데이터를 모두 가져오고 싶을 때 사용)
    •  --max-messages : 최대 메시지 수를 지정하여 소비
    •  --property : 특정 키-값 형식의 속성 설정
    •  --group : 특정 컨슈머 그룹을 지정하여 메시지 소비
    •  --describe : 토픽이나 컨슈머 그룹의 상세 정보를 출력
    •  --delete : 특정 토픽 또는 컨슈머 그룹을 삭제
    •  --list : 현재 존재한느 토픽 또는 컨슈머 그룹을 조회
    •  --alter : 토픽의 속성 또는 파티션 수를 변경 (파티션 수는 실행 중에 감소할 수 없음)
    •  --add-config : 특정 토픽에 새로운 설정을 추가

Kafka CLI 명령어

 

  • Topic 
<토픽 생성>
kafka-topics.sh --create --bootstrap-server <서버 주소> --partition 4 --replication-factor 1 --topic 토픽이름
<파티션 수 변경>
kafka-topics.sh --bootstrap-server <서버 주소> --topic 토픽이름 --alter --partitions 5
<토픽 옵션 추가>
kafka-topics.sh --bootstrap-server <서버 주소> --topic 토픽이름 --alter --add-config 설정=설정값
<토픽 리스트 조회>
kafka-topics.sh --bootstrap-server <서버 주소> --describe --topic 토픽이름
<토픽 상세 조회>
kafka-topics.sh --bootstrap-server <서버 주소> --describe --topic 토픽이름
<토픽 삭제>
kafka-topics.sh --bootstrap-server <서버 주소> --topic 토픽이름 --delete

 

  • Producer
<토픽에 메시지 전송>
kafka-console-producer.sh --bootstrap-server <서버 주소> --topic 토픽이름
<키 값을 포함한 메시지 전송>
bin/kafka-console-producer.sh --bootstrap-server <서버 주소> --topic 토픽이름 --property "parse.key=true" --property "key.separator=:"

 

  • Consumer
<메시지 소비>
kafka-console-consumer.sh --bootstrap-server <서버 주소> --topic 토픽이름 --from-beginning
<메시지를 키와 함께 소비>
kafka-console-consumer.sh --bootstrap-server <서버 주소> --topic 토픽이름 --property print.key=true --property key.separator=":" --from-beginning
<특정 컨슈머 그룹으로 메시지 소비>
kafka-console-consumer.sh --bootstrap-server <서버 주소> --topic 토픽이름 --group 그룹네임 --from-beginning
<소비할 메시지 수를 지정>
kafka-console-consumer.sh --bootstrap-server <서버 주소> --topic 토픽이름 --max-messages 100 --from-beginning
<특정 파티션만 소비>
kafka-console-consumer.sh --bootstrap-server <서버 주소> --topic 토픽이름 --partition 1 --from-beginning
<옵션을 추가하여 메시지 소비>
kafka-console-consumer.sh --bootstrap-server <서버 주소> --topic 토픽이름 --property 옵션 --from-beginning

 

  • Consumer Group
<컨슈머 그룹 리스트 조회>
kafka-consumer-groups.sh --bootstrap-server <서버 주소> --list
<컨슈머 그룹 상세 조회>
kafka-consumer-groups.sh --bootstrap-server <서버 주소> --group 그룹이름 --describe
<컨슈머 그룹 삭제>
kafka-consumer-groups.sh --bootstrap-server <서버 주소> --group 그룹이름 --delete

'정보' 카테고리의 다른 글

AOP + Proxy  (0) 2024.10.13
SQL 기초부터 가보자  (1) 2024.10.04
MySQL? PostgerSQL 뭐가 다른거지?  (2) 2024.09.27
내가 보고싶어 만드는 Java/Spring Exception 모음!  (1) 2024.09.25
VO, BO, DAO, DTO  (0) 2024.09.12