[Kafka] Ui for Apache Kafka 사용하기

손재명·2023년 4월 28일
1

왜 도입을 고려 하였는가,

기존 웹소켓 서버에서는 Redis Pub/Sub만을 사용하여 분산서버에 있는 인스턴스들에게 이벤트를 줬지만, 추후 트래픽 증가나 확장성을 고려하여 앞단에 Kafka를 도입하기로 결정하였습니다.
현재 백엔드 서버도 MSA구조로 점진적으로 확장하며 발전하고 있었고, Redis만을 사용하여 이벤트를 주고 받게 되면 아무래도 단일 서버이기때문에 추후 트래픽이 몰리면 당연히 처리 속도는 느려질 수 밖에 없고 장애가 생길 가능성이 높았습니다.
물론 Redis Cluster를 사용하거나 Sentinel을 사용해 Failover처리를 하는 방법도 고려하였고 Sentinel을 통해 Failover 처리를 할 수 있도록 구축 하였지만 물리적인 리소스가 늘어나고 그만큼 비용이 발생되는 부분이 있어 전반적인 프로젝트 진행 상황을 보고 도입을 결정하게 되었습니다.

툴 선택

우선, kafka를 관리하기 위한 Ui 툴들은 굉장히 많습니다.
처음에는 kafdrop를 통해 테스트 해보았지만, 아래 이미지 처럼 비교 해보고 사용해본 후 Ui for Apache Kafka가 지원되는 기능이 많을뿐더러 다른 툴들에 비해 UI/UX가 정말 편하게 되어있어 최종적으로는 Ui for Apache Kafka를 사용하기로 결정하였습니다.

시작하기

1. 필요하다면, Repo에 들어간 후 프로젝트를 설치합니다.

https://github.com/provectus/kafka-ui

2. Root 폴더에서 필요한 파일들을 생성합니다.

kafka-zookeeper.yml

version: "3.8"
services:
  zookeeper-1:
    image: confluentinc/cp-zookeeper:5.5.1
    ports:
      - "32181:32181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 32181
      ZOOKEEPER_TICK_TIME: 2000

  kafka-1:
    image: confluentinc/cp-kafka:5.5.1
    ports:
      - "9092:9092"
    depends_on:
      - zookeeper-1
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:32181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-1:29092,EXTERNAL://localhost:9092
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_NUM_PARTITIONS: 3

  kafka-2:
    image: confluentinc/cp-kafka:5.5.1
    ports:
      - "9093:9093"
    depends_on:
      - zookeeper-1
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:32181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-2:29093,EXTERNAL://localhost:9093
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_NUM_PARTITIONS: 3

  kafka-3:
    image: confluentinc/cp-kafka:5.5.1
    ports:
      - "9094:9094"
    depends_on:
      - zookeeper-1
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:32181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-3:29094,EXTERNAL://localhost:9094
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_NUM_PARTITIONS: 3

ui-kafka.yml

version: "2"
services:
  kafka-ui:
    image: provectuslabs/kafka-ui
    container_name: kafka-ui
    ports:
      - "8989:8080"
    restart: always
    environment:
      - KAFKA_CLUSTERS_0_NAME=local
      - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka-1:29092,kafka-2:29093,kafka-3:29094
      - KAFKA_CLUSTERS_0_ZOOKEEPER=zookeeper-1:22181

3. 배포하기

  • 저는 로컬에 docker 및 docker-compose가 설치 되어있는 상태에서 진행하였으며, 오로지 테스트를 위한 로컬 배포를 설명하고 있습니다.

먼저 kafka와 zookeeper를 배포해줍니다.
$ docker-compose -f kafka-zookeeper.yml up -d

이후, ui for Apache Kafka를 배포합니다.
$ docker-compose -f ui-kafka.yml up -d

4. 확인해보기

http://localhost:8989/
로컬 서버로 접속 하게 되면, 아래 이미지 처럼 정상적으로 구동되고 있는게 보입니다.

정리하며,

Kafka에 대한 이해와 숙련이 저도 아직까진 더 필요하기에 프로젝트의 작은 부분부터 점진적으로 Kafka를 적용해 나아갈 예정이며, 관련된 서버 아키텍처와 적용 사례는 추후 포스팅 하겠습니다 감사합니다 ~!

profile
”빠르게 성장하는 로켓 개발자“ 성장하는 과정을 기록하다.

0개의 댓글