티스토리 뷰

아파치 카프카의 핵심 기술 '이벤트 스트리밍'

이벤트 스트리밍은 소프트웨어가 상시 작동 할 수 있도록 하는 기술적 기반이다.

데이터베이스, 센서, 모바일 장치, 클라우드 서비스등 이벤트 소스로부터 실시간으로 데이터를 캡처하는

작업을 한다.

또한, 이 데이터를 다른 대상에게 라우팅(최적의 경로 전송)을 해준다.

 

사용할 수 있는 예시로는 다음과 같다.

  • 증권, 은행, 보험등 실시간으로 지급 및 금융 거래 처리
  • 물류, 자동차 , 화물 등 실시간 추적 모니터링
  • IoT나 기타장비에서 센서데이터 지속적으로 캡처하고 분석
  • 소매업, 호텔, 여행 과 같은 고객 주문 수집, 대응
  • 병원과 같은 곳에서 응급 상황이 발생할 때 적시에 치료를 하기위해 모니터링
  • 회사 여러부서에서 생성한 데이터들을 연결, 저장, 소비 가능하게 함
  • 데이터플랫폼, 이벤트기반 아키텍처, 마이크로 서비스 기반 역할

카프카는 다음과 같은 세가지 주요기능을 결합하여 하나의 솔루션으로 이벤트 스트리밍 사용을 엔드 투 엔드로

구현 할 수 있다.

  1. 다른시스템에서 끊임없이 데이터를 가져오기/내보내기를 포함한 이벤트스트림을 게시(쓰기), 구독(읽기)
  2. 원하는 동안 데이터를 안정적이고 지속적으로 저장
  3. 이벤트가 발생하거나 소급할때 이벤트 스트림을 처리

 

카프카의 작동 원리

카프카는 고성능 TCP 네트워크 프로토콜을 통해 통신하는 서버와 클라이언트로 구성된 분산시스템이다.

 

서버: 카프카는 하나 이상의 서버 클러스터가 실행되는데, 이중 일부는 브로커라고 하는 스토리지 계층을 형성한다.

다른 서버는 Kafka connect를 실행하여 이벤트 스트림을 지속적으로 가져오거나 내보내어서

존재하는 관계형 DB같은 다른 Kafka클러스터와 통합을 해준다.

 

클러스터란? 여기서 말하는 클러스터는 서버 클러스터를 말하며, 각기 다른 서버들을 하나로 묶어서 하나의 시스템으로

동작하게함 (고가용성 서비스 제공), 클러스터로 묶인 한 시스템 장애 발생 시 정보 제공 포인트는 클로스터로 묶인 다른

정상적인 서버로 이동된다.

 

클라이언트: 자바, 스칼라, Go, 파이썬, Rest API 등등을 사용하여 이벤트 스트림을 병렬, 스케일 및 처리하는 

분산 애플리케이션, 마이크로서비스등을 말함. (네트워크 문제나 시스템 장애가 발생한 경우에도 가능)

 


주요 개념 및 용어

Event(이벤트) - 어떤 일이 일어 났다.  의미로 카프카에서 이벤트는 키, 값, 타임스탬프 , 메타데이터 헤더 등이 존재한다.

Producer(생산자) - 카프카에 이벤트를 게시하는 클라이언트 애플리케이션
Consumer(소비자) - 이러한 이벤트를 구독(읽기 및 처리) 하는 클라이언트 애플리케이션

* 생산자는 소비자를 기다릴 필요 없이 이벤트를 등록하기만 하면된다.

Topic (주제) - 이벤트들이 지속적으로 저장되고 구성되는 곳 (파일시스템의 폴더와 비슷하다.)  이벤트는 사용 후 삭제되지 않는데, 설정을 통해 정해진 기간이 지나면 삭제할 수 있도록 할 수 있다. 카프카의 성능은 데이터 크기(저장)와 상관없이 일정하므로, 장기간 저장해도 문제는 없다.

또한, Topic은 아래 그림과 같이 분할될 수 있다.

카프카의 원리

그림을 보면 P1 ~ P4가 파티션인데, 같은 생산자내에서도 키값이 다른경우 파티션이 다를 수 있고,

다른 생산자 끼리 같은 키값을 사용한 경우 동일한 파티션을 사용하게 된다..

어찌 보면 공유폴더와 비슷하지만 카프카는 정확히 작성된 순서를 보장한다는게 중요하다.

 

카프카는 문제가 발생할 경우를 대비하여 데이터 복사본을 보유한 브로커가 여러개 존재할 수 있다.

일반적인 설정은 복사본이 3개인데, 주제-파티션 수준에서 수행된다.

 


 

카프카가 제공하는 주요 API

 

  • Admin API - Topics, Brokers, Kafka Object들을 관리 및 검사
  • Producer API - 이벤트스트림을 하나이상 카프카 주제에 Publish(쓰기)
  • Consumer API - 하나이상의 주제를 Subscribe(읽기), 생산된 이벤트 스트림을 처리하기 위한 API
  • Kafka Streams API - 스트림 처리 응용프로그램 및 마이크로 서비스 구현. 변환, 집계, 조인과 같은
    상태 저장 작업, 윈도우 설정, 이벤트 시간 기반 처리등 이벤트 스트림을 처리하는 고급 기능
  • Kafka Connect API - 외부 시스템 및 응용 프로그램과의 이벤트 스트림을 소비, 생성하여 
    kafka와 통합 할 수 있도록 재사용 가능한 데이터 가져오기/내보내기 커넥터를 구축하고 실행
    예를들어, Mysql같은 관계형 데이터베이스에 대한 커넥터는 테이블의 모든 변화에 대해 캡쳐 할 수 있다.

 

직접 사용해보질 않아서 솔직히 Streams와 Connect가 이해되지 않는다. 
Quick Start를 통해 작동시켜보자

 


Quick Start

1. 다운로드

우선 다운로드를 먼저 받자. Apache Downloads

(자바 8 버전 이상이 설치되어있어야 실행이 가능하다.)

해당폴더에서 bin폴더에 들어가게되면 많은 쉘파일들이 존재한다.

 

2.실행하기

Kafka는 ZooKeeper 혹은 KRaft를 사용하여 시작할 수 있다.

 

ZooKeeper - 분산 코디네이션 서비스를 제공하는 오픈소스 프로젝트

분산 코디네이션이란 ? 분산 시스템에서 시스템간의 정보 공유, 상태 체크, 서버들 간의 동기화를 위한 락등을 처리해주는                                       서비스

 

작성자는 Window 환경이기 때문에 조금 다를 수 있다.

# window 전용
cd /bin/windows
# ZooKeeper 서버 실행
.\kafka_2.13-3.3.1\bin\windows\zookeeper-server-start.bat .\kafka_2.13-3.3.1\config\zookeeper.properties 
# kafka 서버 실행
.\kafka_2.13-3.3.1\bin\windows\kafka-sever-start.bat .\kafka_2.13-3.3.1\config\server.properties

 

아무리 해도 실행이 되지 않아서 무슨 문제가 있나 했더니

CMD에서 출력가능한 문자수를 초과하는 문제가 있다 한다..

java - The input line is too long when starting kafka - Stack Overflow

이에 따라서 폴더를 C\ 바로 아래두도록 하자...

 

실행 후 상태 확인하기

현재 설정을 아무것도 건드리지 않았기 때문에
zookeeper-server는 Port가 2181

kafka는 9092 로 설정되어있다. (설정에 자세히 보면 zookeeper 연결 포트번호가 2181로 되어있다.)

파워쉘에 netstat -a 치면 확인할 수 있다.

 

3. Topic 만들고 이벤트를 저장해보기

  1. Topic 만들기 (필수)
 .\kafka-topics.bat --create --topic 주제명 --bootstrap-server 서버주소:포트

   2. 만들어진 Topic 확인

# Topic List보기
.\kafka-topics.bat --list --bootstrap-server localhost:9092

# 해당 Topic 상세보기
.\kafka-topics.bat --describe --topic Topic명 --bootstrap-server localhost:9092

 

4. Topic 에 이벤트 쓰기

# 이벤트 생성 
.\kafka-console-producer.bat --topic Topic명 --bootstrap-server localhost:9092
# 이후 화살표가 나오면 하고싶은 말 쓰기

 

5. Topic 이벤트 읽어오기

# 해당 Topic 메시지 처음부터 읽어오기
.\kafka-console-consumer.bat --topic Topic명 --from-beginning --bootstrap-server localhost:9092

 

메시지들이 어느 위치에서 저장되는지 확인해보니

config에서 server.properties를 확인해보면

log.dirs=/tmp/kafka-logs 이경로에 로그를 저장하는 것을 확인할 수 있다.

해당 디렉토리에 가보면 내가 생성한 Topic들이 폴더화 되어있고, 안에 로그들이 있다는 것을 확인할 수 있다.

'SPRING 공부 > 기타' 카테고리의 다른 글

성능 시뮬레이션 - ① DB 커넥션  (2) 2024.10.28
MyBatis 의도치 않은 캐싱  (0) 2023.09.05
아파치 카프카 문서보고 공부하기 #2  (0) 2023.01.04
RFC 문서  (0) 2022.12.03
템플릿 엔진  (0) 2022.02.01
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함