본문 바로가기

공부

Kafka 도커로 구축


이 글은 Docker를 사용하여 Kafka와 Zookeeper를 실행하고, 토픽을 만들어 메시지를 전송하는 방법에 대한 내용입니다.

Kafka

Kafka는 대규모 분산 시스템에서 데이터를 신속하게 처리하고 전송할 수 있는 오픈 소스 분산 메시징 시스템입니다. Kafka는 큐잉, 게시-구독 메시징, 스트리밍 등의 메시징 패턴을 지원합니다.

Kafka는 크게 Producer, Consumer, Topic, Partition, Broker, Cluster 등으로 구성됩니다. Producer는 메시지를 생성하고 Kafka 클러스터에 전송합니다. Consumer는 Kafka 클러스터에서 메시지를 수신하고 처리합니다. Topic은 메시지의 주제를 나타내며, Partition은 메시지가 저장되는 물리적인 장소입니다. Broker는 Kafka 클러스터에 속한 브로커 서버를 의미하며, Cluster는 전체 Kafka 시스템을 의미합니다.

Kafka는 높은 처리량, 내구성, 확장성을 제공하며, 스트리밍 데이터 처리에 특화되어 있습니다. Kafka는 많은 대규모 분산 시스템에서 사용되며, Hadoop, Spark 등과 같은 다른 오픈 소스 프로젝트에서도 사용됩니다.

Zookeeper

Zookeeper는 분산 시스템에서 데이터를 동기화하고 관리하는 데 사용되는 오픈 소스 프로젝트입니다. Zookeeper는 분산 시스템에서 데이터를 안정적으로 저장하고 검색할 수 있도록 지원합니다.

Zookeeper는 데이터를 트리 구조로 구성하고, 각각의 노드에는 이름과 값이 할당됩니다. Zookeeper는 노드의 생성, 업데이트, 삭제 및 모니터링을 제공합니다. 또한, Zookeeper는 클러스터 내의 노드 간의 상호작용을 제공하며, 장애가 발생했을 때 자동으로 복구할 수 있는 기능도 제공합니다.

Zookeeper는 많은 대규모 분산 시스템에서 사용되며, Kafka, Hadoop, Solr, Elasticsearch 등과 같은 다른 오픈 소스 프로젝트에서도 사용됩니다. Zookeeper는 분산 시스템에서의 안정성과 일관성을 유지하는 데 중요한 역할을 합니다.

Kafka에서 Zookeeper 역할

Kafka는 분산 메시징 시스템으로, Zookeeper는 분산 시스템에서 데이터를 동기화하고 관리하는 데 사용되는 오픈 소스 프로젝트입니다. Kafka는 Zookeeper를 사용하여 브로커, 토픽 및 파티션의 메타데이터를 저장하고 관리합니다.

  1. Broker 정보 저장 및 관리: Zookeeper는 Kafka 클러스터 내의 모든 브로커 정보를 저장하고 관리합니다. 브로커가 추가되거나 삭제되면, Zookeeper는 브로커 목록을 업데이트하고 모든 브로커가 최신 목록을 사용하도록 보장합니다.
  2. Topic, Partition 정보 저장 및 관리: Zookeeper는 Kafka 클러스터 내의 모든 토픽 및 파티션 정보를 저장하고 관리합니다. 브로커가 토픽을 생성하거나 삭제하면, Zookeeper는 토픽 및 파티션 정보를 업데이트하고 모든 브로커가 최신 정보를 사용하도록 보장합니다.
  3. 리더 선출: Kafka의 각 파티션은 하나의 리더와 여러 개의 팔로워 브로커로 구성됩니다. Zookeeper는 리더 선출 프로세스를 관리하고, 각 파티션의 리더와 팔로워 목록을 업데이트합니다.
  4. 클러스터 구성 관리: Zookeeper는 Kafka 클러스터의 구성 관리를 담당합니다. 클러스터 내에서 브로커, 토픽, 파티션 등이 변경될 때마다 Zookeeper는 모든 브로커가 최신 구성을 사용하도록 보장합니다.

따라서, Kafka에서 Zookeeper는 Kafka 클러스터 내의 모든 메타데이터를 관리하고 업데이트하며, 안정적이고 일관성 있는 분산 시스템을 구축하는 데 중요한 역할을 합니다.

STEP.1 docker-compose.yml 파일 작성

version: '3'

services:

  # wurstmeister/zookeeper:3.4.6
  zookeeper:
    hostname: zookeeper
    container_name: zookeeper
    image: wurstmeister/zookeeper:3.4.6
    ports:
      - "2181:2181"

  # wurstmeister/kafka:2.13-2.8.1
  kafka:
    hostname: kafka
    container_name: kafka
    image: wurstmeister/kafka:2.13-2.8.1
    environment:
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CREATE_TOPICS: "topic:1:1"
    ports:
      - "9092:9092"
    depends_on:
      - zookeeper

먼저, 위와 같은 Docker Compose 파일을 작성합니다.

STEP.2 컨테이너 실행 및 확인 ****

🎮  docker-compose up -d

 🎮  docker ps

터미널에서 "docker-compose up -d" 명령어를 입력하여 컨테이너를 실행합니다. "docker ps" 명령어를 입력하여 실행 중인 컨테이너를 확인합니다.

STEP.3 Kafka 토픽 생성

3-1. Kafka 컨테이너에 접속

🎮  docker exec -it kafka bash

3-2. kafka 토픽 리스트 확인

🎮  kafka-topics.sh --list --bootstrap-server kafka:9092

3-3. kafka 토픽 생성

🎮  kafka-topics.sh --list --bootstrap-server kafka:9092

Kafka 컨테이너에 접속하여, "kafka-topics.sh --list --bootstrap-server kafka:9092" 명령어를 입력하여 Kafka 토픽 리스트를 확인합니다. 이후 "kafka-topics.sh --create --bootstrap-server kafka:9092 --replication-factor 1 --partitions 1 --topic topic" 명령어를 입력하여 **"topic"**이라는 이름의 새로운 토픽을 생성합니다. 생성된 토픽을 확인하기 위해 "kafka-topics.sh --list --bootstrap-server kafka:9092" 명령어를 입력합니다.

STEP.4 메시지 전송 및 컨슈머 실행

4-1. 메시지 발행

🎮  kafka-console-producer.sh --bootstrap-server kafka:9092 --topic topic

명령어를 실행하면 > 라인이 생성되어 메시지를 입력할 수 있습니다. Enter 키를 입력하면 메시지가 전송됩니다.


4-2. “topic” 토픽 컨슈머 시작

🎮  kafka-console-producer.sh --bootstrap-server kafka:9092 --topic topic --from-beginning

"topic" 토픽에 메시지를 전송하기 위해 "kafka-console-producer.sh --bootstrap-server kafka:9092 --topic topic" 명령어를 입력합니다. 이후, "kafka-console-producer.sh --bootstrap-server kafka:9092 --topic topic --from-beginning" 명령어를 입력하여 "topic" 토픽을 컨슈머로 읽어들입니다.

 

STEP.5 Kafka Consumer Group 확인

🎮 kafka-console-producer.sh --bootstrap-server kafka:9092 --list

새로운 컨슈머를 실행하기 위해 "kafka-console-producer.sh --bootstrap-server kafka:9092 --topic topic --from-beginning" 명령어를 입력합니다. 이후, 또 다른 터미널을 열어 Kafka 컨테이너에 접속한 후 "kafka-console-producer.sh --bootstrap-server kafka:9092 --list" 명령어를 입력하여 Kafka Consumer Group 리스트를 확인합니다.


위 과정은 Docker Compose를 이용하여 Kafka 실행 및 메시지 전송 방법의 간단한 예시입니다. Kafka에 대해 더 자세히 알고 싶다면 공식 문서를 참고하시기 바랍니다.