개요

회사 업무중 카프카를 로컬에서 설치/테스트 할 필요가 생겼다.

카프카 개념 및 설치에 대한 이해는 Kafka 운영자가 말하는 처음 접하는 Kafka 글과 카프카 공식 홈페이지가 도움이 되었다.

필자가 필요한 것은 빠르게 로컬에서 카프카를 띄우는 것인데 Quick Start에 나온 방법대로 바이너리로 서버 시작 시 NumberFormatException이 발생하여 설치가 쉽지 않았다.

따라서 대안으로 Docker를 이용하여 카프카를 빠르게 띄우는 방법을 찾아보고 정리한다. 목적성은 production용 카프카 설치/구동이 아니라 로컬에서 가볍게 카프카를 설치/구동하는 것이다.

Docker로 카프카 서버 띄우기

Docker Engine 설치

Docker Engine 설치는 인터넷에 자료가 많으므로 생략한다.

Docker Compose 설치

카프카는 카프카 클러스터 + zookeeper가 설치되어야 하므로 docker-compose를 통해 docker 컨테이너간의 연계가 필요하다. 이부분을 docker-compose가 쉽게 해결해주므로 이 툴을 이용하기로 한다. docker-compose는 docker가 설치된 상태에서 아래의 방법으로 설치가 가능하다.

$ curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

kafka-docker 레파지토리 클론

카프카를 docker-compose로 띄우는 잘 정리된 github 레파지토리가 있어 이를 이용하였다.

$ git clone https://github.com/wurstmeister/kafka-docker

docker-compose-single-broker.yml 수정

클론 받은 레파지토리 내용 중 값 하나를 수정한다.

로컬에서 실행할 것이기 때문에 KAFKA_ADVERTISED_HOST_NAME값을 127.0.0.1로 수정한다. 해당값을 로컬 호스트 IP로 바꾸는 것은 multi 브로커 환경에서 문제가 생길수 있기 때문에 지양하라고 kafka-docker 운영자는 얘기하지만 필자는 로컬에서 1대의 브로커만 띄우는 것이 목적이므로 아래와 같이 설정하였다.

version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    build: .
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

docker-compose 시작

준비가 다 되었으면 아래의 명령어로 zookeeper 1대, 카프카 클러스터 1대를 시작한다. docker-compose.yml에 정의된 대로 docker-compose를 통해 서버를 실행한다.

$ cd kafka-docker
$ docker-compose -f docker-compose-single-broker.yml up # Single Broker

docker-compose 종료

docker-compose로 실행한 서버는 아래의 명령어로 중지 시킬 수 있다.

$ docker-compose stop

카프카 테스트 해보기

카프카가 docker-compose를 통해 zookeeper 1 대, 클러스터 1대가 제대로 구동중인지 확인을 해보자.

확인하는 방법은 kafka quickstart에 나온 방법대로 카프카 토픽을 만들고 producer, consumer를 실행해 메세지가 옮겨가는지 확인해 보는 것이다.

Kafka 다운로드

카프카가 제대로 설치되었는지 테스트 하기 위해 공식 홈페이지에서 docker-compose로 구동한 카프카와 동일한 버전의 바이너리를 다운로드 한다. 우리가 클론해서 사용하는 kafka-docker의 Dockerfile에 명시된 버전이 스칼라 2.12버전, 카프카 버전 0.10.2.0이니까 해당 버전의 바이너리를 다운로드 한다.

$ wget https://www.apache.org/dyn/closer.cgi?path=/kafka/0.10.2.0/kafka_2.12-0.10.2.0.tgz
$ tar xzvf kafka_2.12-0.10.2.0.tgz
$ cd kafka_2.12-0.10.2.0

필자가 사용한 Dockerfile은 마스터 브랜치 기준이기 때문에 변경될 여지가 있다. 따라서 이부분은 유의하자.

카프카 토픽 생성하기

$ bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test123

producer/consumer 띄워보기

터미널에서 producer를 시작한다.

$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test123

새로운 터미널을 하나 띄워 consumer를 시작한다.

$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test123 --from-beginning

이부분은 백문이 불여일견이므로 직접 스크린샷으로 보는것이 이해가 빠를듯 하다. 아래의 화면과 같이 docker-compose로 카프카 클러스터가 시작된 상황에서 터미널을 추가로 열어 producer, consumer를 실행할 준비를 한다.

producer, consumer를 실행하면 프롬프트만 깜빡이고 아무런 반응이 없다.

producer에서 메세지를 입력하면 consumer에서 출련되는 것을 확인 할 수 있다.