본문 바로가기
MessageSystem/Apache Kafka

[Kafka] kafka cluster 실습 환경 구축

by 곰민 2023. 1. 21.

kafka 관련 포스팅을 하기 이전 kafka cluster(카프카 클러스터) 를 구축 하여에 실습환경을 구성해보도록 하겠습니다.

컨테이너(container) 환경에서 실습환경은 진행됩니다.

가상화 기술과 Docker, 대량의 Container를 효율적으로 띄우고 관리하기 위해 나온 Docker Compose, Container 오케스트레이션을 위한 Kubernates등에 대해서는 추후 자세히 포스팅하겠습니다.

apache kafka cluster 구축

 

kafka cluster(카프카 클러스터) 구축 


container 환경에서 1~3대의 zookeeper 와 1~3대의 kafka를 만들어 실습환경을 구성해 보도록 하겠습니다.

Docker-Desktop설치 후

container를 여러 대 띄우는데 활용하기 유용한 docker-compose를 활용하도록 하겠습니다.

 

주키퍼는 분산 애플리케이션을 위한 코디네이션 시스템입니다.
kafka 브로커들의 메타데이터를 저장, 관리해주는 시스템 입니다.
클라이언트는 주키퍼 마스터가 응답을 하지 않으면 다른 주키퍼 마스터에게 요청을 합니다.

 

Docker-Desktop 설치


Download Docker Desktop | Docker

 

Download Docker Desktop | Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

win/mac 환경 모두에서 container들 상태 / volumes 할당 / 간단한 shell cli제공등 docker사용 시 유용하기 때문에 Docker-Desktop 설치하는 것을 권장합니다.

  • Docker-Desktop설치 시 Docker-compose 역시 설치되기 때문에 별도의 설치가 필요하지 않습니다.

 

실습환경 구성


  1. 별도의 경로에서 docker-compose.yml or yaml 파일을 생성합니다.

kafka docker-compose
kafka 실습 환경 폴더

docker-compose.yml

version: '3.7'
services: 

  zk1:
    container_name: zookeeper1
    image: wurstmeister/zookeeper:latest
    restart: always
    hostname: zk1
    ports:
      - "2181:2181"
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
    volumes:
      - "~/zk-cluster/zk1/data:/data"

  zk2:
    container_name: zookeeper2
    image: wurstmeister/zookeeper:latest
    restart: always
    hostname: zk2
    ports:
      - "2182:2181"
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
    volumes:
      - "~/zk-cluster/zk2/data:/data"

  zk3:
    container_name: zookeeper3
    image: wurstmeister/zookeeper:latest
    restart: always
    hostname: zk3
    ports:
      - "2183:2181"
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
    volumes:
      - "~/zk-cluster/zk3/data:/data"

  kafka1:
    container_name: kafka1
    image: wurstmeister/kafka:latest
    restart: on-failure
    depends_on:
      - zk1
      - zk2
      - zk3
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ADVERTISED_HOST_NAME: host.docker.internal
      BOOTSTRAP_SERVERS: host.docker.internal:9092, host.docker.internal:9093, host.docker.internal:9094
      KAFKA_ZOOKEEPER_CONNECT: "zk1:2181,zk2:2182,zk3:2183"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2

  kafka2:
    container_name: kafka2
    image: wurstmeister/kafka:latest
    restart: on-failure
    depends_on:
      - zk1
      - zk2
      - zk3
    ports:
      - "9093:9092"
    volumes:
       - /var/run/docker.sock:/var/run/docker.sock
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ADVERTISED_HOST_NAME: host.docker.internal
      BOOTSTRAP_SERVERS: host.docker.internal:9092, host.docker.internal:9093, host.docker.internal:9094
      KAFKA_ZOOKEEPER_CONNECT: "zk1:2181,zk2:2182,zk3:2183"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2

  kafka3:
    container_name: kafka3
    image: wurstmeister/kafka:latest
    restart: on-failure
    depends_on:
      - zk1
      - zk2
      - zk3
    ports:
      - "9094:9092"
    volumes:
       - /var/run/docker.sock:/var/run/docker.sock
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ADVERTISED_HOST_NAME: host.docker.internal
      BOOTSTRAP_SERVERS: host.docker.internal:9092, host.docker.internal:9093, host.docker.internal:9094
      KAFKA_ZOOKEEPER_CONNECT: "zk1:2181,zk2:2182,zk3:2183"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2

  kafka-ui:
    image: provectuslabs/kafka-ui
    container_name: kafka-ui
    ports:
      - "10000:8080"
    restart: always
    environment:
      - KAFKA_CLUSTERS_0_NAME=local
      - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=host.docker.internal:9092,host.docker.internal:9093,host.docker.internal:9094
      - KAFKA_CLUSTERS_0_ZOOKEEPER=zk1:2181,zk2:2182,zk1:2183

 

 

version: docker-compose 버전을 지정합니다

services: docker-compose의 경우 docker 컨테이너로 수행될 서비스들은 services 하위에 기술합니다.

  • zookeeper: 서비스 이름을 zk1, zk2, zk3으로 작성했습니다.
    • service 하위에 작성하면 서비스 이름으로 동작합니다.
    • image: wurstmeister/zookeeper:latest
    • environment: 몇몇 환경변수를 지정할 수 있습니다.
      • ZOO_MY_ID: zookeeper에서 앙상블이라고 하는 클러스터 내에서 주키퍼를 구별하기 위한 환경변수 id는 반드시 유일해야 하며 1~255 사이에 값이 들어가야 합니다.
      • ZOO_SERVERS: zookeeper 앙상블(클러스터) 내 시스템 목록을 지정 즉 클러스터 내 주키퍼 노드 리스트들을 입력합니다
        • server.id=<address1>:<port1>:<port2>[:role];[<client port address>:]<client port> 형식으로 입력합니다
  • kafka
    • image: wurstmeister/kafka:latest
    • depends_on:
      • docker-compose에서는 서비스들의 우선순위를 지정해 주기 위해서 depends_on을 이용합니다.
      • zk라고 지정하였으므로, kafka는 zookeeper이 먼저 실행되어 있어야 컨테이너가 올라오게 됩니다.
    • ports:
      • kafka 브로커의 포트를 의미합니다.
      • 외부포트 : 컨테이너내부 포트 형식으로 지정합니다.
    • environment:
      • KAFKA_BROKER_ID: 클러스터 각 노드에 할당할 브로커의 아이디 유니크 해야 합니다.
      • KAFKA_ADVERTISED_HOST_NAME: kafka 브로커에 사용할 host 정보
      • BOOTSTRAP_SERVERS: kafka 브로커 리스트를 나열해 주면 됩니다.
      • KAFKA_ZOOKEEPER_CONNECT: 연결할 zookeeper를 지정해 줍니다.
      • KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 토픽 파티션의 복제 개수
    • kafka-ui 는 선택사항입니다 개괄적인 정보를 web-ui로 제공 받고 싶으시면 추가하시는 것을 추천 드립니다.

 

Docker-Compose 실행 & Container 확인


${docker-compose.yml파일경로}/$ docker-compose -f docker-compose.yml up -d

 

docker-compose를 실행합니다.

 

docker ps

 

docker ps 명령어를 통해서 실행 중인 컨테이너 목록을 확인합니다.

 

kafka docker ps
떠잇는 container 확인

kafka-ui 접속


0.0.0.0:10000 로 접근하여 실행중인 broker 들을 확인할 수 있습니다.

kafka ui

broker, topics, consumer, segement, partition 등 개괄적인 정보를 확인할 수 있습니다.

Topic 생성


Kafka pub/sub 모델에서의 Topic을 생성해 보도록 하겠습니다.

pub/sub과 topic에 대해서는  Message Queue 포스팅에서 확인하실 수 있습니다.

https://colevelup.tistory.com/3

 

Message Queue란?

서론 Apache Kafka나 RabbitMQ와 같이 MessageQueue를 활용하는 방법들이 있다. MessageQueue란 무엇이고 어떤 패턴들이 존재할까? 알아보도록 하자 Message Queue Message Message란 무엇일까? 한 시스템에서 또 다른

colevelup.tistory.com

 

 

docker-compose exec kafka1 kafka-topics.sh --create --topic my-topic --bootstrap-server kafka1:9092 --replication-factor 3 --partitions 2

 

exec kafka1

  • kafka1에서 명령어를 실행하겠다는 것입니다.
  • kafka-topics.sh를 실행합니다.
    • —create : topic을 생성합니다.
    • —topic : topic 명을 지정합니다.
    • —bootstrap-server : kafka cluster 내에서 초기 metadata를 initial 하기 위해서 가져오는 kafka 브로커 url 중 하나.(브로커중 하나에 액세스 할 수 없으면 다른 브로커로 대체됨.)
    • —replication-factor : topic을 복제할 숫자 (리플리케이션에 대해서는 추후 자세히 보스팅)
    • —partitions : topic을 파티션 즉 분할할 숫자(파티션에 대해서도 추후 포스팅)

 

docker-compose exec kafka1 kafka-topics.sh --describe --topic my-topic --bootstrap-server kafka1:9092

 

topic 생성이 완료되었다면.

—describe를 통해서 topic에 대한 정보를 확인합니다.

 

kafka topic describe

Consumer & Producer 실행해보기


docker-compose exec kafka1 bash

 

kafka1 container에 bash로 붙도록 합니다

 

cd opt/kafka/bin

 

kafka bin 경로로 이동합니다

 

kafka-console-consumer.sh --topic my-topic --bootstrap-server kafka1:9092

 

kafka-console-consumer.sh 명령어를 활용하여 my-topic을 consume 하는 consumer를 실행합니다.

 

kafka-console-producer.sh --topic my-topic --broker-list kafka1:9092

 

kafka-console-producer.sh 명령어를 활용하여 my-topic에 메시지를 전달하는 producer를 실행합니다.

그리고 전달할 메시지를 입력해 줍니다.

kafka producer
producer

producer에서 test라는 메시지를 보냈고

 

 

kafka test message
consumer

consumer에서 test라는 메시지를 받았습니다.

 

 

간단하게 kafka cluster 실습환경을 구축하고 Topic 생성 메시지 전달 같은 것들을 실습해 보았습니다 앞으로 카프카 관련 글에 대해서는 해당 환경 내에서 진행한다는 가정을 하고 포스팅을 진행하도록 하겠습니다.

 

참조


Kafka CLI tools location in wurstmeister/kafka

[Kafka] Docker Compose로 멀티브로커 Kafka 구성하기

zookeeper - Official Image | Docker Hub

Docker

실전 카프카 개발부터 운영까지

반응형

댓글