티스토리 뷰

Docker를 이용한 zookeeper, kafka 실행

기본 개념

Apache Kafka

Apache Kafka란 LinkedIn에서 개발된 분산 메시징 시스템으로, 대용량의 실시간 로그 처리에 특화된 아키텍처 설계를 통해 기존 메시징 시스템보다 우수한 TPS를 가지고 있습니다.

kafka의 개념에 대한 자세한 내용은 다음 페이지를 참조하시길 바랍니다.


zookeeper, kafka 실행

docker-compose.yaml 파일 작성

프로젝트를 생성할 디렉토리로 이동해 kafka-with-docker 디렉토리를 생성하고 zookeeper 및 kafka 컨테이너를 실행하기 위한 docker-compose.yaml 파일을 작성합니다.

cd /opt/gopath/src/github.com/
mkdir kafka-with-docker

cd /opt/gopath/src/github.com/kafka-with-docker
vi docker-compose.yaml

kafka 환경변수

  • KAFKA_ADVERTISED_LISTENERS : kafka 브로커를 가리키는 사용 가능 주소 목록. kafka는 초기 연결 시 이를 client에게 보냄

  • KAFKA_LISTENERS : kafka 브로커가 들어오는 연결을 수신 대기하는 주소 및 리스너 이름 목록

  • KAFKA_ZOOKEEPER_CONNECT : ZooKeeper 연결 문자열. ,로 구분 ex) <zookeeper서버의 hostname>:<zookeeper서버의 포트번호>

  • KAFKA_CREATE_TOPICS : 생성할 Topic명:Partition 개수:Replica 개수

version: '2'

networks:
  test:

services:
  zookeeper:
    image: wurstmeister/zookeeper:3.4.6
    container_name: zookeeper
    ports:
      - "2181:2181"
    networks:
      - test

  kafka:
    image: wurstmeister/kafka:2.12-2.0.1
    container_name: kafka
    environment:
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CREATE_TOPICS: "javainuse-topic:1:1"   # Topic명:Partition개수:Replica개수
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "9092:9092"
    depends_on:
      - zookeeper
    networks:
      - test


zookeeper&kafka 컨테이너 실행

작성한 docker-compose.yaml 파일을 이용해 zookeeper 및 kafka 컨테이너를 실행합니다.

cd /opt/gopath/src/github.com/kafka-with-docker
# zookeeper&kafka 컨테이너 실행
docker-compose up -d
# zookeeper&kafka 컨테이너 실행 중지
docker-compose down


zookeeper 컨테이너 로그 확인

docker container logs zookeeper


kafka 컨테이너 로그 확인

docker container logs kafka


kafka 실행 확인

바이너리 파일 다운로드

kafka가 제대로 실행되었는지 확인하기 위해 공식 사이트에서 제공하는 kafka 바이너리 파일들을 다운로드합니다. 여기서 주의할 점은, kafka 컨테이너의 실행 이미지 버전과 kafka 바이너리 파일의 버전이 동일해야 합니다.

위의 docker-compose.yaml 파일에서 kafka 실행 이미지를 wurstmeister/kafka:2.12-2.0.1로 설정했기 때문에 이와 동일한 버전의 kafka 바이너리 파일을 다운로드합니다. 이를 위해 kafka 컨테이너의 이미지 버전을 latest가 아닌 고정된 버전으로 사용하는 것을 추천합니다.

cd /opt/gopath/src/github.com/kafka-with-docker
wget http://mirror.navercorp.com/apache/kafka/2.0.1/kafka_2.12-2.0.1.tgz
tar -zxvf kafka_2.12-2.0.1.tgz
rm kafka_2.12-2.0.1.tgz

kafka topic 생성 확인

console을 이용하여 kafka 컨테이너에서 설정한 'javainuse-topic' topic이 제대로 생성되었는지 확인합니다.

cd /opt/gopath/src/github.com/kafka-with-docker/kafka_2.12-2.0.1
sh bin/kafka-topics.sh --zookeeper localhost:2181 --list

bin/kafka-topics.sh 실행 옵션

  • --zookeeper : zookeeper가 실행 중인 호스트. 별도의 서버에 구축했다면 server_ip:server_port로 지정

  • --list : 리스트 출력

  • --create : topic 생성

  • --topic : 생성할 topic명

  • --partitions : 생성할 topic의 파티션 개수

  • --replication-factor : 생성할 topic의 복사본 개수

※ topic은 kafka 컨테이너 실행 시 생성했기 때문에, 따로 생성하지 않습니다.


kafka Consumer 실행

console을 이용해 kafka consumer를 실행하여 메시지 수신 상태로 대기시킵니다.

※ 이 단계는 메시지 수신이 정상적으로 이루어지는지 확인하기 위한 절차로, 이후에는 node.js를 이용해 수신할 예정입니다.

cd /opt/gopath/src/github.com/kafka-with-docker/kafka_2.12-2.0.1
bin/kafka-console-consumer.sh --topic javainuse-topic --bootstrap-server localhost:9092 --from-beginning


bin/kafka-console-consumer.sh 실행 옵션

  • --topic : 메시지를 가져올 topic. 여기에선 kafka 컨테이너 실행 시에 생성한 javainuse-topic으로 설정

  • --bootstrap-server : kafka가 실행 중인 호스트. 별도의 서버에 구축했다면 server_ip:server_port로 지정

  • --from-beginning : 맨 처음부터 메시지를 가져옴


kafka Producer 실행

또 다른 console을 이용해 kafka producer를 실행하여 메시지 생산 상태로 대기시킵니다. 위 명령을 실행하면 > 이 출력되면서 입력 대기 상태가 됩니다.

※ 이 단계는 메시지 생산이 정상적으로 이루어지는지 확인하기 위한 절차로, 이후에는 Maven 프로젝트를 이용해 생산할 예정입니다.

cd /opt/gopath/src/github.com/kafka-with-docker/kafka_2.12-2.0.1
bin/kafka-console-producer.sh --topic javainuse-topic --broker-list localhost:9092


bin/kafka-console-producer.sh 실행 옵션

  • --topic : 메시지를 생산할 topic. 여기에선 kafka 컨테이너 실행 시에 생성한 javainuse-topic으로 설정

  • --broker-list : kafka가 실행 중인 호스트. 별도의 서버에 구축했다면 server_ip:server_port로 지정

kafka 메시지 전송

이 상태에서 console에 메시지를 입력한 뒤 Enter를 누르면 Consumer를 실항한 console에 생산한 메시지가 출력되야 합니다.


참고 사이트


댓글
댓글쓰기 폼