본문 바로가기
Web Programming

카프카(kafka) - Docker + 카프카 클러스터 구축 및 토픽생성, 메시지 전송

by 맑은안개 2021. 12. 31.

이미지 출처 - Pixabay

Docker 환경, 카프카 클러스터 구축 및 토픽생성, 메시지 전송

Docker hub에 등록된 카프카 이미지(bitnami)를 사용하여 카프카 클러스터를 구축하고, 카프카에서 제공하는 쉘스크립트를 사용하여 구축한 클러스터에 토픽생성, 프로듀싱, 컨슈밍처리를 해보도록 한다.

카프카 관련 글

2021.12.27 - [Web] - 카프카(kafka) 개요 - 주요 용어 개념 정리

 

카프카(kafka) 개요 - 주요 용어 개념 정리

카프카란? 링크드인은 다 수의 웹 서버에서 생성되는 로그를 효율적으로 추적/수집하기 위한 목적으로, 분산 메시징 처리 시스템인 Kafka(이하 카프카)를 개발했다. 대량의 데이터를 실시간(real ti

youngwonhan-family.tistory.com

2021.12.31 - [Web] - 카프카(kafka) - VSCode에서 Java Producer/Consumer 생성 with Gradle

 

카프카(kafka) - VSCode에서 Java Producer/Consumer 생성 with Gradle

들어가며.. Docker 환경, 카프카 클러스터 구축 및 토픽생성, 메시지 전송 Docker hub에 등록된 카프카 이미지(bitnami)를 사용하여 카프카 클러스터를 구축하고, 카프카에서 제공하는 쉘스크립트를 사

youngwonhan-family.tistory.com

실행환경

  • MacOS 12.0.1 ( on Apple silicon 10 cpu core / 32g ram )
  • Visual Studio Code
  • java 11
  • Docker 실행환경
  • Docker Images
    • bitnami/kafka:3
    • bitnami/zookeeper:3.7

bitnami image의 장점

Why use Bitnami Images?

  • Bitnami closely tracks upstream source changes and promptly publishes new versions of this image using our automated systems.
  • With Bitnami images the latest bug fixes and features are available as soon as possible.
  • Bitnami containers, virtual machines and cloud images use the same components and configuration approach - making it easy to switch between formats based on your project needs.
  • All our images are based on minideb a minimalist Debian based container image which gives you a small base container image and the familiarity of a leading Linux distribution.
  • All Bitnami images available in Docker Hub are signed with Docker Content Trust (DCT). You can use DOCKER_CONTENT_TRUST=1 to verify the integrity of the images.
  • Bitnami container images are released daily with the latest distribution packages available.

1. 이미지 다운로드

사용할 카프카 이미지를 Docker hub에서 다운받는다.

docker pull bitnami/kafka:3
docker pull bitnami/zookeeper:3.7

docker images
bitnami/zookeeper        3.7       ad331d1bde6a   2 days ago     468MB
bitnami/kafka            3         02141b3480a9   2 days ago     615MB

2. Docker-compose 생성/실행

아래의 docker-compose.yml을 생성하고 docker-compose up -d 명령을 실행한다.

version: "3.8"

networks:
  kafka-net:
    driver: bridge

services:
  zookeeper:
    image: bitnami/zookeeper:3.7
    networks:
      - kafka-net
    ports:
      - '2181:2181'
    environment:   
      - ALLOW_ANONYMOUS_LOGIN=yes
  kafka:
    image: bitnami/kafka:3
    networks:
      - kafka-net    
    ports:
      - '9093:9093'
    environment:
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
      - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093
      - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://localhost:9093
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=CLIENT
    depends_on:
      - zookeeper
  • 프로듀서 / 컨슈머 역할의 클라이언트가 같은 네트워크에 위치할 수 있도록 network를 설정한다.
  • bitnami 이미지는 옵션에 CFG는 kafka config에 다음과 같이 프로퍼티로 등록된다. KAFKA_CFG_ZOOKEEPER_CONNECT => zookeeper.connect

프로세스 확인

docker ps 명령으로 zookeeper, broker 클러스터가 정상 기동 되었는지 확인한다.

> docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
4b70a4bcd986   bitnami/kafka:3         "/opt/bitnami/script…"   11 minutes ago   Up 11 minutes   9092/tcp, 0.0.0.0:9093->9093/tcp                       kafka
a63fce1f35da   bitnami/zookeeper:3.7   "/opt/bitnami/script…"   11 minutes ago   Up 11 minutes   2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp   zookeeper

3. 메시지 전송 테스트

kafka로 접속하여 메시지 전송을 테스트 한다. 먼저 두 개의 콘솔을 띄우고 아래 명령으로 접속하여 하나는 프로듀서, 나머지는 컨슈머 역할을 한다.

docker exec -it kafka /bin/bash

토픽생성을 위해 둘 중 하나의 콘솔에 접속하여 토픽을 생성한다.

I have no name!@kafka:/$ kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test --partitions 1 --replication-factor 1
Created topic test.

# 생성한 토픽 확인
I have no name!@256be080de9c:/$ kafka-topics.sh --list --bootstrap-server localhost:9092
test

I have no name!@kafka:/$ kafka-console-producer.sh  --bootstrap-server localhost:9092 --topic test
>test

프로듀서컨슈머 준비가 끝났다. 먼저 프로듀서에서 다음의 명령으로 메시지 전송을 준비한다.

I have no name!@kafka:/$ kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test
>
  • --topic에 위에서 생성한 토픽을 지정한다.

다음으로 컨슈머 콘솔에는 brokertest이름의 토픽에 접근하여 메시지를 PULLING한다.

I have no name!@kafka:/$ kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test

위와 같이 모두 준비 되었다면 프로듀서에서 메시지를 입력하여 컨슈머에서 pull을 잘 받아오는지 확인한다.

Docker를 사용하여 간단한 단일 카프카 클러스터 환경을 구성하고 메시지 전송을 테스트했다. 다음 장에선 Java, Python 으로 간단한 애플리케이션을 만들어 메시지 전송을 해보도록 한다. 나아가서 자주 이용되는 Log4j, nginx 등의 서드파티에서 카프카 연동하는 방법을 알아본다.

반응형