티스토리 뷰

반응형

* 카프드롭을 모르시는 분이 많은 것 같아서 사용방법만 적었다. 

* 카프드롭은 간단한 토픽생성과 브로커에 메세지가 들어갔는지만 확인 가능하다. 토픽에 대한 자세한 옵션 설정을 카프드롭을 통해 할 수는 없다.

 

 

먼저 윈도우에 도커를 설치한다. 설치방법은 아래 블로그에 아주 자세하게 나와있다.

https://goddaehee.tistory.com/251

 

[Docker (1)] window10 Docker 설치하기(윈도우 10 도커 설치)

[Docker (1)] window10 Docker 설치하기(윈도우 10 도커 설치) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ Window10 도커 설치 ] 입니다. : ) 도커 설치하기 ▶ 1. 도커란? 도커 설치와 관련된 포스팅 이기.

goddaehee.tistory.com

 

 

폴더 하나 만들고 그 아래 docker-compse.yml 파일을 만든다. 파일 안에 들어가야할 내용은 다음과 같다.

version: "3"
services:
  kafka:
    image: obsidiandynamics/kafka
    restart: "no"
    ports:
      - "2181:2181"
      - "9092:9092"
    environment:
      KAFKA_LISTENERS: "INTERNAL://:29092,EXTERNAL://:9092"
      KAFKA_ADVERTISED_LISTENERS: "INTERNAL://kafka:29092,EXTERNAL://localhost:9092"
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT"
      KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
      KAFKA_ZOOKEEPER_SESSION_TIMEOUT: "6000"
      KAFKA_RESTART_ATTEMPTS: "10"
      KAFKA_RESTART_DELAY: "5"
      ZOOKEEPER_AUTOPURGE_PURGE_INTERVAL: "0"
    healthcheck:
      test: [ "CMD", "nc", "-z", "localhost", "9092" ]
      interval: 10s
      timeout: 5s
      retries: 5

  kafdrop:
    image: obsidiandynamics/kafdrop:4.0.3-SNAPSHOT
    restart: "no"
    ports:
      - "9000:9000"
    environment:
      KAFKA_BROKERCONNECT: "kafka:29092"
      JVM_OPTS: "-Xms16M -Xmx48M"
    depends_on:
      - kafka

 

원래 아래버전이 잘 동작했었는데 오늘 오랜만에 docker compose up 을 해봤더니 kafdrop이 제대로 동작하지 않는 문제를 발견했다. obsidiandynamics님도 이 문제를 알았는지 7시간전에 새로운 버전을 올려주신것을 확인했다. 이미지 파일을 변경했더니 다행히 kafdrop이 잘 올라오는걸 확인할 수 있었다. 

(근데 왜 latest 버전보다 4.0.3-SNAPSHOT이 더 최신이지? latest 배포했다가 뭔가 잘못되서 지금 수정중이신건가.)

 

변경하는김에 도커버전도 3으로 변경해서 kafka 가 완전히 안정된후에 kafdrop이 켜지게 끔 수정했고, jdk 13이상부터 noverify를 지원하지 않는다길래 해당 옵션도 삭제했다.  

 

더보기

예전버전

version: "2"
services:
  kafdrop:
    image: obsidiandynamics/kafdrop
    restart: "no"
    ports:
      - "9000:9000"
    environment:
      KAFKA_BROKERCONNECT: "kafka:29092"
      JVM_OPTS: "-Xms16M -Xmx48M -Xss180K -XX:-TieredCompilation -XX:+UseStringDeduplication -noverify"
    depends_on:
      - "kafka"
  kafka:
    image: obsidiandynamics/kafka
    restart: "no"
    ports:
      - "2181:2181"
      - "9092:9092"
    environment:
      KAFKA_LISTENERS: "INTERNAL://:29092,EXTERNAL://:9092"
      KAFKA_ADVERTISED_LISTENERS: "INTERNAL://kafka:29092,EXTERNAL://localhost:9092"
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT"
      KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
      KAFKA_ZOOKEEPER_SESSION_TIMEOUT: "6000"
      KAFKA_RESTART_ATTEMPTS: "10"
      KAFKA_RESTART_DELAY: "5"
      ZOOKEEPER_AUTOPURGE_PURGE_INTERVAL: "0"

 

기존 이미지와 새로운 이미지의 차이를 알아보기 위해 kafdrop 이미지를 분석해보았다.

 docker inspect obsidiandynamics/kafdrop:latest
 docker inspect obsidiandynamics/kafdrop:4.0.3-SNAPSHOT

 

jdk-17.0.11+9 -> jdk-17.0.13+11

Ubuntu 22.04 -> 24.04

로 변경된걸 확인할  수 있었다. Kafdrop이 JDK 17이상부터 버그가 많다고 듣긴했는데 그 때문인가?

납득이 안되서 더 찾아봤더니 새로운 사실을 알 수 있었다.

Kafdrop github 레포지토리에 7시간전에 새로운 커밋이 올라온것을 확인했다. 

latest 에 문제가 있어서 수정중인게 맞는것 같다. 

 

내용을 보면 알수 있듯이 카프카 띄운 후에 카프드롭 띄우는게 전부인 도커 컴포즈 파일이다.

window powershell 을 켜고 도커 컴포즈 파일이 있는 폴더에서 아래 명령어를 입력한다. 최초 시도라면 각종 도커 이미지 파일이 로딩된 후에 카프카 컨테이너가 띄워질 것이다. 컴퓨터 성능에 따라 다르겠지만 대략 1~2분 정도 걸린다.

docker compose up

 

http://localhost:9000로 kafdrop에 접속한다.

접속이 잘되는가? 그럼 카프카가 잘 뜬것이다. 도커 컴포즈 파일을 보면 Kafdrop 생성 옵션에 depends_on: -kafka가 있기 때문에 카프카가 안떴으면 카프드롭도 안뜨기 때문이다.

(그리고 당연히 9000포트 이미 사용중이면 포트 충돌나서 안 뜬다. 왜 안 뜨는거지? 하고 삽질했는데 알고보니 9000이미 쓰고 있었음.. ㅂㄷㅂㄷ)

 

다음으로 세상에서 제일 간단한 카프카 프로듀서 코드를 만들어서 카프카에 메세지를 넣어보자.

import org.apache.kafka.clients.producer.*;

import java.util.HashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class ProducerApp {
    public static void main(String[] args) {
        HashMap<String, Object> props = new HashMap<>();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        
        // 프로듀서 객체 생성 및 메시지 전송 요청
        Producer<String, String> producer = new KafkaProducer<>(props);
        ProducerRecord<String, String> record = new ProducerRecord<>("example-topic", "Hello World");
        producer.send(record);
        producer.close();
    }
}

 

위 코드를 실행하면 아래처럼 example-topic 이 생성된걸 확인할 수 있다.

(참고로 미리 토픽을 안 만들어놔도 카프카의 기본 설정값은 토픽이 자동 생성되는 방식이기 때문에 따로 카프카 설정값을 변경하지 않은 상태라면 위 코드를 실행만해도 자동으로 토픽이 생성됐을 것이다. 이렇게 생성되는 토픽은 파티션이 1개다.)

 

example-topic 을 눌러서 들어가면 아래의 화면이 나온다. 파티션 0번을 들어가보자.

 

좋아 "Hello World" 메세지가 잘 들어갔다.

위의 화면에 보이는 것들을 조금 더 설명해보자면..

Partition 0 / Offset 0 / #messages 100 

- 0번 파티션에 0번 offset부터 100개의 message 출력한다는 의미이다.

- 숫자값을 변경해서 200번 Offset부터 messages 1개만 출력하는 등 조절할 수 있다. 

 

간단하게 Kafdrop을 이용하는 방법을 살펴봤다.

이제 Kafka를 사용하는 어플리케이션을 테스트 하는게 한결 편해졌을것이다!!

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함