본문 바로가기

서버개발스터디/2주차 (Kafka)

#01 Kafka / Zookeeper 알아보기

Kafka 란 ? 

하루에 1조4천억 건의 메시지를 처리하기 위해 LinkedIn이 개발한 내부 시스템으로 시작했으나, 현재 이는 다양한 기업의 요구사항을 지원하는 애플리케이션을 갖춘 오픈소스 데이터 스트리밍 솔루션이 되었다.  Kafka는 실시간으로 기록 스트림을 게시, 구독, 저장 및 처리할 수 있는 분산 데이터 스트리밍 플랫폼이다. 이는 여러 소스에서 데이터 스트림을 처리하고 여러 사용자에게 전달하도록 설계되었고 간단히 말해, A지점에서 B지점까지 이동하는 것뿐만 아니라 A지점에서 Z지점을 비롯해 필요한 모든 곳에서 대규모 데이터를 동시에 이동할 수 있다고 한다.

탄생배경

실시간 트랜잭션(OLTP) 처리와 비동기 처리가 동시에 이루어지는 시스템에서 통합된 전송영역 부재로 인한 시스템 복잡도 증대. 시스템 복잡도 증대로 인한 운영 업무(장애 대처, 업그레이드, 하드웨어 증설) 작업 시 많은 작업 시간이 소요 되고 OLTP 데이터베이스, 아파치 하둡, 모니터링 시스템, key-value 저장소 등 다양한 데이터 시스템들이 통합되지 않은 서로 다른 파이프라인을 가지고 있어서 데이터 통합 분석을 위한 데이터 파이프라인 연결 시 데이터 포맷 및 처리방식등이 달라 파이프라인 확장 및 조정이 어렵고, 시스템 간 데이터가 불일치 문제가 발생하는 문제를 해결하기 위해서 탄생했다.

Kafka설계 목표

  • 높은 처리량으로 실시간 처리
  • 임의의 타이밍에 데이터를 읽음
  • 다양한 프로덕트와 쉽게 연동
  • 메시지를 잃지 않음

Publish/Subscribe (펍/섭) 시스템

카프카는 기본적으로 Publish-Subscribe 모델을 구현한 분산 메시징 시스템이다. Publish-Subscribe 모델은 데이터를 만들어내는 프로듀서(Producer, 생산자), 소비하는 컨슈머(Consumer, 소비자) 그리고 이 둘 사이에서 중재자 역할을 하는 브로커(Broker)로 구성된 느슨한 결합(Loosely Coupled)의 시스템이다. 

Kafka 용어정리 

Broker : Kafka 애플리케이션이 설치되어 있는 서버(노드)

Topic : 프로듀서와 컨슈머들이 카프카로 보낸 자신들의 메시지를 구분하기 위한 네임으로 사용

Partition : 병렬처리가 가능하도록 토픽을 나눌 수 있고, 많은 양의 메시지 처리를 위해 파티션 수 조절할 수 있음.

Producer : 메시지를 생산하여 토픽이름으로 보내는 서버 또는 애플리케이션

Consumer : 저장된 메시지를 가져가는 서버 또는 애플리케이션

 

 

이미지 출처 : https://twofootdog.tistory.com/86

Zookeeper 란?

  • 분산 코디네이션 서비스 제공
  • 코디네이션 서비스는 분산 시스템 내에서 중요한 상태정보를 유지하기 때문에 고가용성을 제공해야함
  • 서버와 클라이언트로 구성
  • 서버앙상블 : n개 서버로 단일 주키퍼 클러스터 구성
  • 클라이언트 : 앙상블에 속한 서버에 연결하여 서비스 사용

Zookeeper 아키텍처

이미지 출처 : https://tjsdud4634.tistory.com/1

Node 종류

  • Persistent Node : 노드에 데이터를 저장하면 일부러 삭제하지 않는 이상 삭제되지 않고 영구히 저장
  • Ephemeral Node : 노드를 생성한 클라이언트의 세션이 연결되어 있을 경우만 유효, 즉 클라이언트 연결이 끊어지는 순간 삭제 -> 이를 통해 클라이언트가 연결되어있는지 아닌지 판단
  • Sequence Node : 노드를 생성할 때 자동으로 Sequent 번호가 붙는 노드

znode

주키퍼의 와쳐 (Watcher)

클라이언트가 znode에 watch를 걸어 놓으면 해당 znode가 변경이 되었을 때 클라이언트로 callback호출을 날려서 클라이언트에 해당 znode가 변경되었음을 알려주고 해당 watcher는 삭제됨

 

클라이언트들은 주키퍼서버들로 이루어진 앙상블에 접근하여 znode의 데이터를 읽거나 씀

 

쓰기 과정

1. 클라이언트가 특정 서버로 접속하여 데이터 업데이트

2. 업데이트 된 서버는 leader 서버에 그 데이터를 알리고 업데이트

3. leader 서버는 그정보를 나머지 follower 서버들에게 broadcast

4. 그 정보를 받은 follower 서버들도 데이터 업데이트