본문 바로가기

카테고리 없음

2일차 Kafka

Event Streaming

  • 위키백과에서의 Event Stream Processing실시간 스트리밍을 의미한다.
  • 이벤트 스트리밍이 중요한 이유는 데이터 가용성(Availability) 때문이다.
  • 스트리밍은 데이터를 추출하는 시점부터 시간과 주체에 구애받지 않고 접근이 가능하다.
  • 이벤트 스트림의 형태로 실시간으로 데이터를 캡처하는 방식이다.
  • 검색할 수 있도록 이벤트 스트림을 영구적으로 저장한다.
  • 실시간으로 이벤트 스트림을 조작, 처리 및 반응한다.
  • 필요에 따라 이벤트 스트림을 다른 목적지 기술로 라우팅할 수 있다.

특징

  • 실시간으로 필요한 기능들을 처리할 수 있다.
  • 실시간으로 추적하고 모니터링할 수 있다.
  • 센서 데이터를 지속적으로 캡처하고 분석할 수 있다.
  • 고객 상호 작용 및 데이터를 수집하고 즉시 대응할 수 있다.
  • 여러 곳에서 생성된 데이터를 연결, 저장 및 사용 가능하게 한다.
  • 이벤트 중심 아키텍처 및 마이크로서비스의 기반 역할을 한다.

Kafka - Event Streaming Platform

kafka는 세 가지 주요 기능을 통해 이벤트 스트리밍을 구현할 수 있다.

  1. To publish (write) and subscribe to (read) streams of events, including continuous import/export of your data from other systems.
  2. To store streams of events durably and reliably for as long as you want.
  3. To process streams of events as they occur or retrospectively.
  • 프로듀서(Producer)
    • 메시지를 생산하여 브로커의 토픽으로 전달하는 역할이다.
  • 브로커(Broker)
    • 카프카 애플리케이션이 설치되어 있는 서버 또는 노드를 지칭한다.
  • 컨슈머(Consumer)
    • 브로커의 토픽으로부터 저장된 메시지를 전달받는 역할이다.
  • 주키퍼(Zookeeper)
    • 분산 애플리케이션 관리를 위한 코디네이션 시스템이다.
    • 분산된 노드의 정보를 중앙에 집중하고 구성관리, 그룹 네이밍, 동기화 등의 서비스를 수행한다.

작동방식

  • 프로듀서는 새 메시지를 카프카에 전달한다.
  • 전달된 메시지는 브로커의 토픽이라는 메시지 구분자에 저장한다.
  • 컨슈머는 구독한 토픽에 접근하여 메시지를 가져온다. (pull 방식)
  •  

특징

  • 다른 메시지 큐들과는 지향하는 바가 다르다.
  • pub-sub 구조를 가진다.
    • 메시지를 보내는 pub 역할과 받는 sub 역할이 완벽하게 분리되어 있다.
    • 느슨한 결합을 통해 한쪽 시스템에서 문제가 발생하더라도 서로 의존성이 없으므로 연쇄작용이 발생할 확률이 낮다.
    • 컨슈머의 서버가 추가 되더라도 카프카로만 보내면 되기 때문에 서버 추가에 대한 부담이 없다.
    • 하나의 토픽에 여러 프로듀서 & 컨슈머들이 접근 가능한 구조이다.
      • 하나 이상의 토픽으로 메시지를 보내고 가져올 수 있다.
  • 디스크에 메시지를 저장한다.
    • TCP/IP 통신을 통해 디스크에 바로 저장한다.
      • RabbitMQ(APMQ 프로토콜 이용)
      • kafka 외의 MQ의 경우 메모리에 저장하는 방식을 사용한다.
      • 다른 MQ 또한 별도의 설정을 통해 디스크에 저장하는 방식을 사용하여 서버 다운에 대응할 수 있지만 Kafka는 별도의 설정을 할 필요가 없다.
    • 통신방법의 차이로 초당 10만건의 데이터 처리가 가능하다.
    • 특별한 설정 없이 데이터의 영속성(Persistence) 가 보장된다.
    • 트래픽이 일시적으로 폭주해 컨슈머의 처리가 늦어지더라도 디스크에 보관되기 때문에 컨슈머는 손실 없이 메시지를 가져갈 수 있다.
  • 분산 환경에 특화되도록 설계되었다.
    • 하나의 카프카 클러스터는 3대의 브로커로부터 시작해 수십대의 브로커로 확장 가능하다.
    • 확장 작업은 카프카 서비스의 중단 없이 온라인 상태에서 작업이 가능하다.
    • 트래픽 및 사용량 증가로 클러스터를 확장하는 작업은 간단하다.
  • 클러스터 구성, fail-over , replication 등 여러 특징이 있다.
    • 고성능을 유지하기 위해 내부적으로 분산 처리, 배치 처리 등 다양한 기법을 사용한다.
    • 단일 시스템보다 성능이 좋다.

카프카 데이터 모델

토픽(Topic)

  • 메시지를 논리적으로 묶은 개념이다.
    • 데이터베이스의 테이블 및 파일시스템의 폴더와 유사한 개념이다.
  • 프로듀서가 메시지를 보낼경우 토픽에 메시지가 저장된다.

아파치 카프카란 무엇인가

파티션(Partition)

  • 토픽을 구성하는 데이터 저장소이며 메시지가 저장되는 위치이다.
  • 여러개의 프로듀서에서 한개의 파티션으로 메시지를 보낼 경우 병목이 생기고, 메시지의 순서를 보장할 수 없게 된다.
  • 파티션을 여러개로 늘리고 그 수만큼 프로듀서도 늘려 하나의 파티션마다 하나의 프로듀서 메시지를 받으면 빠르다.
  • 파티션이 무작정 많아질 경우
    • 파일 핸들러의 낭비가 존재한다.
      • 각 파티션은 브로커의 디렉토리와 매핑되고 저장되는 데이터마다 2개의 파일(인덱스, 실제 파일)이 있기 때문에 많은 파일 핸들이 생길 경우 리소스가 낭비된다.
    • 장애 복구 시간이 증가할 수 있다.
      • 카프카는 리플리케이션(Replication)을 지원하고, 이를 통해 지속적으로 리더 파티션을 팔로워 파티션으로 리플리케이션하게된다.
      • 파티션 수가 너무 많을 경우 리플리케이션 수행이 느려져 장애복구시간이 증가할 수 있다.
    • 파티션 수를 줄이는 것이 불가능하다.
      • 카프카에서 파티션 수를 늘리는 것은 아무때나 가능하지만 파티션 수를 줄이는 방법은 제공하지 않는다.
      • 줄이고 싶다면 토픽 자체를 삭제하는 것 말고는 방법이 없다.

오프셋과 메시지순서

  • 오프셋(offset)
    • 파티션마다 메시지가 저장되는 위치이다.
    • 파티션 내에서 순차적으로 유니크하게 증가하는 숫자 형태로서 동일 파티션 내 메시지의 순서를 보장해준다.
    • 컨슈머는 메시지를 가져올 때마다 오프셋 정보를 커밋(commit)함으로써 기존에 어디 위치까지 가져왔는지 알 수 있게 된다.

파티션과 메시지순서

  • 파티션을 여러개 지정할 경우
    • 프로슈머가 메시지를 보낼 때 파티션이 여러개인 경우 메시지는 각각의 파티션으로 순차적으로 배분한다. (Round-robin 방식)
    • 메시지의 순서는 오로지 동일 파티션 내 오프셋을 기준으로만 보장된다.
    • 여러개의 파티션을 사용할 경우 동일 파티션 내에서는 순서가 보장되지만, 파티션과 파티션 사이에서는 순서를 보장하지 못하기 때문에 전체 메시지를 출력할 경우 순서가 섞일 수 있다.
    • 전체 메시지의 순서를 보장하고 싶은 경우 partition을 1개로만 설정해야 한다.
      • 이 경우, 파티션이 하나이므로 분산 처리가 불가능하다.

리플리케이션

아파치 카프카란 무엇인가

  • 고가용성 및 데이터 유실을 막기 위해 리플리케이션을 수행한다.
  • 원본 파티션의 경우 '리더'가 되고, 복제 파티션의 경우 '팔로워'가 된다.
  • 리더 파티션이 있는 브로커가 다운될 경우
    • 복제 파티션을 가진 브로커의 팔로워 파티션이 새로운 리더가 되어 정상적으로 프로듀서의 요청을 처리한다.

ISR(In Sync Replica)

  • 리더와 팔로워로 이루어진 리플리케이션 그룹이다.
  • 리플리케이션 그룹 내 동기화 및 신뢰성을 유지한다.
  • 팔로워는 Read/Write 권한이 없고 오로지 리더로부터 데이터를 복제하기 때문에 특정 팔로워가 다운되서 리플리케이션을 못할 경우 동기화 문제가 발생한다.
  • 문제가 감지된 팔로워 즉, 설정된 일정주기(replica.lag.time.max.ms)만큼 요청이 오지 않는 팔로워는 ISR 그룹에서 추방된다.

Consumer 그룹

  • 컨슈머가 메시지를 소비하는 시간보다 프로듀서가 메시지를 전달하는 속도가 더 빨라서 메시지가 점점 쌓일 경우를 대비한다.
  • 동일 토픽에 대해 여러 컨슈머가 메시지를 가져갈 수 있도록 컨슈머 그룹이라는 기능을 제공한다.
  • 하나의 consumer가 프로듀서의 메시지 전송 속도를 따라가지 못할 경우