TOOL/Kafka 2021. 4. 20. 14:45

Kafka

큰 인프라의 개발환경을 경험하는 개발자가 아니지만, 어찌저찌 Kafka를 구축하는 Project를 경험하였다.

자료와 정보를 얻기가 정말 힘들었고 혼란도 많았지만.. 나름대로 내용을 간단히 정리해 보았다.

1. Kafka 소개

1-1. 개요

  • LinkedIn 개발자들이 만들었다.
  • 고가용성, 확장성, 고성능, 분산 데이터 스트리밍 플랫폼
    • 고가용성(高可用性, HA, High Availability): 시스템이 상당히 오랜 기간 동안 지속적으로 정상 운영이 가능한 성질 (Wiki)
    • 확장성(Scale-Out): 장비를 추가해서 확장하여 성능을 향상시키는 방식
  • Loosely Coupled, FileSystem
  • 구독-발행 모델의 메세지 큐 (Pub-Sub Model Message Queue)

1-2. 요약

  • [Producer] ==> (Zookeeper:[Kafka-Sever],[Kafka-Sever]...) ==> [Consumer]
    • Zookeeper: '분산 코디네이션 서비스'를 제공하는 오픈소스 프로젝트로서, Kafka는 Zookeeper로 클러스터를 구성한다. 단일 구성시에도 필수.
    • Broker: Topic(주제) 단위로 Message들을 관리합니다.
    • Topic(주제): 1개 이상으로 구성된 Partition에 분산되어 Message가 저장되게 하는 논리 단위.
    • Producer: 특정 Topic에 Message들을 Publish(발행)한다. Message는 각 Partition에 나뉘어 저장된다.
    • Consumer: Topic을 Message들을 Subscribe(구독)한다. 성공적으로 읽어갈 때마다 Partition 내의 Offset(위치)를 Commit한다. 다시 Topic에 접근할 때는 해당 Offset 정보를 통해 이어서 읽어 갈 수 있다.
    • Consumer Group: 1개의 Topic에 대응하는 Consumer가 Publish 속도 등에 균형을 맞추기 위해 Consumer 확장 기능.
    • Rebalance: Consumer GroupConsumer가 추가/삭제될 때, 소유권 이동이 발생하는 현상
  • Replication: 장애에 대비하여 데이터 유실을 방지, 지속적인 서비스를 제공하기 위해 구성
    • Topic 단위로 Replication Factor를 지정한다. 지정한 수 만큼 Broker에 복제한다.
    • 내부적으로는 Partition 별로 복제한다.
    • ISR(In Sync Replica): Replication Group을 의미. 1개의 Leader와 여러개의 Follower로 구성한다.
      • Leader:
        • Leader를 통해서만 읽기/쓰기 작업이 진행된다. 장애가 발생되어도 정상인 Broker가 있다면, 새로운 Leader Broker가 선출된다.
        • Leader는 주기적으로 Follower를 감시하고, 일정시간 동안 반응이 없다면 ISR 그룹에서 추방한다.
      • Follower:
        • Leader의 data를 그대로 복제한다.
        • Leader의 data와 같은 형상을 유지하기 위해 짧은 주기로 동기화합니다.

2. Kafka 환경

2-1. 필수

2-2. 필요성

Kafka 사용전, 먼저 어떤 Data(Message)를 취급할 것인가를 확인!

  • A) 단순 Log Data인가?
    • Log성 누적 정보인가?
  • B) 식별 Data인가?
    • 날짜 Data가 포함된 Message인가?
    • 순차적 숫자 Data가 포함된 Message인가?
  • C) 변경사항 Data인가?
    • 변경 Data가 포함된 Message인가?

2-3. 제품

Web상에서 정보검색시, 혼란스럽지 않도록 알아야 할 몇몇 솔루션 알기.

'Apache Kafka'와 'Confluent Platform으로 구성된 Kafka'의 구성과 설정이 조금은 상이할 수 있기에 유의해야 한다.

2-3-1. Apache Kafka

OpenSource로 개발되고 있다.

- -
URL http://kafka.apache.org/
Download https://kafka.apache.org/downloads
License APACHE LICENSE, VERSION 2.0
Quick Start local

2-3-2. Confluent Platform

Apache Kafka를 활용하여, Confluent 사에서 다양한 기능과 솔루션을 제공하고 있다.

무료 Community License로도 여러 Connector와 편리한 도구를 제공하고 있다.

- -
URL https://www.confluent.io/get-started/#confluent-platform
Download https://www.confluent.io/get-started/#confluent-platform
License https://docs.confluent.io/platform/current/installation/license.html
Quick Start docker, local / docker(ce), local(ce)
  • ※ 종류
    • Develop License: 클러스터 당 1개의 Broker만 사용하는 전제로 플랫폼의 모든 기능을 사용 가능.
    • Trial License: 30일 체험판 기간동안 모든 기능을 사용 가능.
    • Enterprise License: 모든 기능 사용 가능.
    • Community License: 내장된 Connector와 Confluent Hub의 몇몇 Connector, REST Proxy, ksqlDB, Schema Registry 등을 사용 가능.

2-3-3. Debizium

Apache Kafka에 변경사항만 전송할 수 있도록, DB의 CDC기능을 이용한 Kafka-Connector(Source) 를 제공하고 있다.

(단, Source DB에 대한 관리권한 등이 없거나 CDC 기능을 사용할 수 없다면 적용이 어려울 수 있다.)

- -
URL https://debezium.io/
Download https://debezium.io/releases/
License APACHE LICENSE, VERSION 2.0
Quick Start docker

3. Kafka 체험

Kafka 팀에서 제공해주는 친절하고 이해하기 쉬운 예제가 있다.

원문 링크와 함께 개인적으로 간결히 재정리 하였다.

  • 예제 - Quick Start
    • 원문: http://kafka.apache.org/quickstart
    • 환경:
      • Linux / Windows
      • Kafka 2.7.0
      • Java 8 버전 이상
      • 9092 Port
      • 터미널 4개
    • 구성:
      • bin/zookeeper-server-start.sh:
      • bin/kafka-server-start.sh
      • bin/kafkac-topic.sh
      • bin/kafkac-console-producer.sh
      • bin/kafkac-console-consumer.sh
      • ※ Windows에서 실행시 bin/{FILE}.sh이 아니라 bin/windows/{FILE}.bat를 이용한다. - 예) bin/windows/zookeeper-server-start.bat

3-1. Kafka 환경 설치

3-2. Kafka 환경 실행

  • Run

      cd kafka_2.13-2.7.0
      bin/zookeeper-server-start.sh config/zookeeper.properties
      bin/kafka-server-start.sh config/server.properties
    • ※ zookeeper와의 의존성을 제거하려는 움직임이 있는 듯 하지만 아직은 실행이 필요하다.

3-3. Kafka에 Topic 생성

  • Create Topic

      bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092
  • Check Topic

      bin/kafka-topics.sh --describe --topic quickstart-events --bootstrap-server localhost:9092

3-4. console-producer와 console-consumer로 data를 Topic에 쓰기/읽기

  • kafka-console-producer 실행

      bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092
  • 아무 글이나 입력해 본다.

      hello kafka!?
  • kafka-console-consumer 실행

      bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092
    • --from-beginning 옵션으로 topic에 기존에 입력되었던 data를 실행과 함께 출력한다.

    • 실행과 함께 출력된 Message

       hello kafka!?
  • 추가적으로 kafka-console-producer창에 가서 아무 말이나 더 입력해보면, 바로 kafka-console-consumer에 출력되는 것을 볼 수 있다.

3-5. Stop all

다음 순으로 [CTRL] + [C]로 종료.

  1. kafka-console-producer
  2. kafka-console-consumer
  3. kafka-server-start
  4. zookeeper-server-start

3-6. Remove data

  • FileSystem에 저장된 data까지 지우고 싶다면, 다음 2 경로를 제거한다.

    • /tmp/kafka-logs
    • /tmp/zookeeper
  • 예)

      rm -rf /tmp/kafka-logs /tmp/zookeeper
  • ※ Windows의 경우 실행한 드라이브의 Root에 생성되어 있다.

    • C:\\tmp\\kafka-logs
    • C:\\tmp\\zookeeper

4. Kafka API

Kafka 팀에서 다음 API를 제공해주고 있다.

  • INTRODUCTION: http://kafka.apache.org/intro#intro_apis
  • API 종류
    • Producer API: 여러 topic에 Event Stream을 publish(쓰기) 처리.
    • Consumer API: 여러 topic을 subscribe(읽기)하고 produce된 Event Stream을 처리.
    • Streams API: transformations(변환), aggregations(집계) 및 joins(병합), windowing, 이벤트 시간 기반 처리 등.. Event Stream을 처리하는 higher-level functions을 제공.
    • Connect API: 외부시스템/애플리케이션에서 Event Stream을 읽기/쓰기, Data 가져오기/내보내기. 그러나 Kafka 커뮤니티에서 이미 즉시 사용할 수있는 수백 개의 커넥터를 제공 중..
    • Admin API: Topic, Broker 및 Kafka객체를 관리/검사.

5. Reference