상세 컨텐츠

본문 제목

Docker-Compose로 Confluent Kafka 와 C3(Confluent Control Center) 설치

Data Platform/Kafka

by leediz 2022. 10. 10. 21:04

본문

Docker-Compose로 Confluent Kafka 와 C3(Confluent Control Center) 설치


이전 포스팅에서 Confluent에 대해 정말 간략하게 설명을 했었다. Confluent 라이센스를 적용하여 프로젝트를 짧게나마 해본 입장에서 여러 Confluent Ecosystem 중에서 C3(Confluent Control Center)를 유용하게 잘 사용했었기에 C3에 대해 소개할겸 이번 포스팅은 docker-copomse를 사용하여 kafka broker 클러스터와 C3(Confluent Control Center) 설치를 다뤄보겠다.

 

Confluent란

Apache Kafka를 만든 멤버들이 창립한 회사로 Confluent Kafka와 함께 여러 컴포넌트와 기능을 추가한 유료 라이센스를 제공하는 회사이다. Confluent는 package가 제공되어 On-prem 형태로도 설치를 할 수 있으나, SaaS형태로도 서비스를 제공하고 있는 점이 큰 특징이다.

  • Apache Kafka VS Confluent Kafka

Confluent 웨비나에서는 Apache kafka와 Confluent kafka의 기본 기능 자체에는 큰 차이가 있지 않으나, 오픈소스인 Apache Kafka보다 더 최적화되어 동작하도록 아예 코드를 새로 만들었다고 설명을 했다. 마치 같은 자동차이지만 자동차 가격이나 브랜드에 따라 엔진이 다른것과 같은 이치라는 예시를 들었다.

 

설치하기에 앞서

Mac에서 기존에 설치했던 Kafka를 C3와 연동해보려 했는데, C3는 Kafka broker가 3대 이상일 때에만 연동이 가능한것 같아 이번 설치 포스팅은 docker-compose 파일을 구성하여 docker Container로 Kafka broker 3대 클러스터를 실행한 다음 C3(Confluent Control Center)를 실행했다.

 

docker-compose 파일 구성

  • docker-compose.yml
version: '3'
services:
  zookeeper:
    image: zookeeper:3.7
    hostname: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOO_MY_ID: 1
      ZOO_PORT: 2181
    volumes:
      - ./data/zookeeper/data:/data
      - ./data/zookeeper/datalog:/datalog
  kafka1:
    image: confluentinc/cp-kafka:7.2.2
    hostname: kafka1
    ports:
      - "9091:9091"
    environment:
      KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER_INTERNAL://kafka1:19091,LISTENER_DOCKER_EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9091
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER_INTERNAL
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_BROKER_ID: 1
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS: kafka1:19091
      CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
      CONFLUENT_METRICS_ENABLE: 'true'
      CONFLUENT_SUPPORT_CUSTOMER_ID: 'anonymous'
    volumes:
      - ./data/kafka1/data:/tmp/kafka-logs
    depends_on:
      - zookeeper
  kafka2:
    image: confluentinc/cp-kafka:7.2.2
    hostname: kafka2
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER_INTERNAL://kafka2:19092,LISTENER_DOCKER_EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER_INTERNAL
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_BROKER_ID: 2
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS: kafka2:19092
      CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
      CONFLUENT_METRICS_ENABLE: 'true'
      CONFLUENT_SUPPORT_CUSTOMER_ID: 'anonymous'
    volumes:
      - ./data/kafka2/data:/tmp/kafka-logs
    depends_on:
      - zookeeper
  kafka3:
    image: confluentinc/cp-kafka:7.2.2
    hostname: kafka3
    ports:
      - "9093:9093"
    environment:
      KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER_INTERNAL://kafka3:19093,LISTENER_DOCKER_EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER_INTERNAL
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_BROKER_ID: 3
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS: kafka3:19093
      CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
      CONFLUENT_METRICS_ENABLE: 'true'
      CONFLUENT_SUPPORT_CUSTOMER_ID: 'anonymous'
    volumes:
      - ./data/kafka3/data:/tmp/kafka-logs
    depends_on:
      - zookeeper
  control-center:
    image: confluentinc/cp-enterprise-control-center:7.2.2
    hostname: control-center
    container_name: control-center
    depends_on:
      - zookeeper
      - kafka1
      - kafka2
      - kafka3
    ports:
      - "9021:9021"
    environment:
      CONTROL_CENTER_BOOTSTRAP_SERVERS: 'kafka1:19091,kafka2:19092,kafka3:19093'
      CONTROL_CENTER_REPLICATION_FACTOR: 1
      CONTROL_CENTER_INTERNAL_TOPICS_PARTITIONS: 1
      CONTROL_CENTER_MONITORING_INTERCEPTOR_TOPIC_PARTITIONS: 1
      CONFLUENT_METRICS_TOPIC_REPLICATION: 1
      PORT: 9021

docker-compose 파일의 서비스는 총 4개이다 - zookeeper 1대, kafka broker 3대, c3 1대.

위 docker-compose 파일은 패스트캠퍼스 강의 중 kafka 파트를 참고하여 수정했으며 강사님의 github에 파일이 공개되었으므로 링크를 함께 첨부한다. docker-compose에 대한 설명이나 yml파일에 대한 설명을 추가한다면 포스팅이 매우 길어지게 되고 당장은 실행에만 집중하고 싶으므로 이번 포스팅에서는 생략한다.

  • docker-compose 실행 명령어
$ docker-compose up -d

백그라운드에서 docker-compose가 실행되도록 명령어에 -d 옵션을 추가하여 실행시켰고, 명령어를 실행하면 아래와 같이 4개의 서비스가 다운로드 되며 컨테이너가 실행된다.

docker desktop이 있다면 실행시켜서 컨테이너들이 잘 구동된 것을 확인할 수 있다.

 

C3(Confluent Control Center) 접속

docker-compose.yml 파일에서 설정하기도 했지만, C3의 기본포트는 9021번 포트이다. 컨테이너들이 문제없이 구동되었다면, 웹 브라우저를 실행하여 주소창에 http://localhost:9021 을 입력하여 이동하여 아래와 같이 C3에 접속할 수 있다.

Kafka Broker에서 C3에 metric 정보를 전송하는 옵션을 적용했다면, 위 화면에서 broker가 몇 대인지, 총 파티션 개수, 토픽 개수 등에 대한 클러스터의 기본적인 메트릭 정보를 확인할 수 있다. 하지만 이번 docker를 사용한 설치 과정에서는 별도 옵션을 주지는 않았으므로 아쉽게 확인할수는 없다.
또 다른 특이 사항으로 화면 오른쪽 상단 종모양 옆에 Enterprise trial ends in 29 days 라는 문구를 볼 수 있다. C3의 경우 라이센스가 필요한 유료 기능이므로 이번 설치에서는 30일의 트라이얼 모드로 실행되었다. 포스팅을 위해 하루 전에 미리 테스트로 실행했기에 30일에서 하루가 지난 29일로 표시가 되어있다.

controlcenter.cluster 패널을 클릭하면 아래와 같이 더 많은 kafka 관련 정보를 확인할 수 있는 C3 화면으로 이동한다.

 

마무리

이번 포스팅은 Kafka clutser를 사용하고 관리하는데 있어 C3(Confluent Control Center)를 함께 사용하면 편리한 점을 공유하고 싶어 작성한다. C3를 실행하기 위해 docker-compose를 사용하여 zookeeper 1대, kafka broker 3대, C3(confluent control center) 1대 등 총 4개의 서비스를 실행했다.
C3의 각 화면에 대한 자세한 설명은 향후 포스팅을 통해 더 설명을 하는것으로 하고 이번 포스팅은 여기서 마친다.

참고 자료

'Data Platform > Kafka' 카테고리의 다른 글

Kafka의 주요 요소 개념 정리  (0) 2022.01.16
Apache Kafka란  (0) 2022.01.09

관련글 더보기

댓글 영역