Apache Kafka 설치 및 확인
로컬에서 Docker를 사용해서 Kafka 서버 환경 만들기
이번에는 Dockerfile 을 사용하여 Apache Kafka를 시작해 보겠다.
Docker 설치
먼저 도커와 도커 컴포즈가 설치해 있어야 한다. 설치 여부는 아래 버전 확인 명령어로 확인할 수 있다.
% docker -v
Docker version 20.10.11, build dea9396
% docker-compose -v
Docker Compose version v2.2.1
설치가 되어 있지 않으면 먼저 설치를 하고 오길 바랍니다. (여기서는 도커 설치를 설명하지 않겠다.)
Docker에 Apache Kafka 서버 설치
다음 단계에서는 Docker 를 사용하여 Apache Kafka를 설치한다.
GitHub에서 Apache Kafka docker 레파지토리 클론
git clone https://github.com/wurstmeister/kafka-docker.git
% git clone https://github.com/wurstmeister/kafka-docker.git
Cloning into 'kafka-docker'...
remote: Enumerating objects: 1100, done.
remote: Counting objects: 100% (82/82), done.
remote: Compressing objects: 100% (44/44), done.
remote: Total 1100 (delta 48), reused 50 (delta 38), pack-reused 1018
Receiving objects: 100% (1100/1100), 285.65 KiB | 7.52 MiB/s, done.
Resolving deltas: 100% (608/608), done.
docker-compose.yml 파일 수정
여기서는 Docker를 이용해 Kafka를 실행 시키는 것만을 하기 때문에, Kafka 분산 환경은 고려하지 않고 우선 한대만 실행시켜 보자.
그러기 위해 저장고에 있는 파일 중 docker-compose.yml
파일이 아니라, docker-compose-single-broker.yml
을 사용해야 한다.
docker를 로컬에 띄울 것이므로 docker-compose-single-broker.yml
파일을 다음과 같이 수정한다.
... 중간 생략 ...
KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
... 중간 생략 ...
docker-compose 실행
docker-compose -f docker-compose-single-broker.yml up -d
여기서 -f
옵션은 docker-compose.yml
이 아닌 다른 이름을 가진 docker-compose를 실행시킬 경우 사용한다.
docker-compose.yml
이 아닌 docker-compose.single-broker.yml
을 사용할 것이기 때문에 -f
옵션 뒤에 파일 이름을 지정한다.
-d
옵션은 백그라운드에 띄운다는 것이다.
% docker-compose -f docker-compose-single-broker.yml up -d
[+] Running 17/17
⠿ zookeeper Pulled 20.8s
⠿ a3ed95caeb02 Pull complete 1.1s
... 중간 생략 ...
=> => writing image sha256:5609038ba9d28b5380b4403f4905867e9fa39cc48b03e6f32466be47b5e9b35d 0.0s
=> => naming to docker.io/library/kafka-docker_kafka 0.0s
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
[+] Running 3/3
⠿ Network kafka-docker_default Created 0.1s
⠿ Container kafka-docker_kafka_1 Started 0.7s
⠿ Container kafka-docker_zookeeper_1 Started 0.8s
docker가 제대로 띄어졌는지 확인
위 명령어를 실행해보면 Kafka와 Zookeeper 두대가 실행되고 있는 것을 확인할 수 있다.
docker ps -a
% docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30cf1bccb37f kafka-docker_kafka "start-kafka.sh" 2 minutes ago Up 2 minutes 0.0.0.0:9092->9092/tcp kafka-docker_kafka_1
c578f5c36248 wurstmeister/zookeeper "/bin/sh -c '/usr/sb..." 2 minutes ago Up 2 minutes 22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp kafka-docker_zookeeper_1
로컬에 Kafka 클라이언트 설치
이것으로 Docker로 메세지를 받을 Kafka 서버는 실행이 되었다. 그러면, 이제 동작 확인을 위해 로컬에 Kafka 클라이언트를 설치해서 실제 메세지를 송수신 해보자.
우선 Kafka 클라이언트를 설치하기 위해 위에서 실행한 Kafka 서버의 버전을 확인하여 같은 버전을 설치하는 것이 호환성이 좋다.
위에서 클론 받은 레포에 들어가 Dockerfile
파일 내용을 확인해보자.
... 중간 생략 ...
ARG kafka_version=2.8.1
ARG scala_version=2.13
... 중간 생략 ...
상단 부근에 Kafka 버전과 Scala 버전을 확인할 수 있을 것이다.
이 Kafka 버전에 동일하게 Kafka 공식 사이트의 DOWNLOAD 페이지에서 다운로드 받으면 된다.
아래는 curl
명령어를 이용한 다운로드 방식이다.
curl https://archive.apache.org/dist/kafka/2.8.1/kafka_2.13-2.8.1.tgz -o kafka_2.13.2.8.1.tgz
% curl https://archive.apache.org/dist/kafka/2.8.1/kafka_2.13-2.8.1.tgz -o kafka_2.13-2.8.1.tgz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 68.1M 100 68.1M 0 0 130k 0 0:08:55 0:08:55 --:--:-- 115k
다운로드를 다 받았다면, 이제 아래와 같이 압축을 풀면 된다.
tar xzvf kafka_2.13-2.8.1.tgz
TOPIC 생성
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic devkuma-topic
% cd kafka_2.13-2.8.1
% bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic devkuma-topic
Created topic devkuma-topic.
Producer 실행
bin/kafka-console-producer.sh --topic devkuma-topic --broker-list localhost:9092
아래와 같이 CLI 명령어를 실행시키면, 메세지 전송 대기 상태가 된다.
bin/kafka-console-producer.sh --topic devkuma-topic --broker-list localhost:9092
>
>
가 보이며 대기 상태가 되었다면, 메세지를 송신 대기 상태가 된 것이다.
Consumer 실행 Producer 콘솔에 메시지를 송신하기 전에, 메시지를 수신할 Consumer 콘솔을 띄워보자.
또 다른 터미널 창을 더 띄워서, Consumer 콘솔을 아래와 같이 실행한다.
bin/kafka-console-consumer.sh --topic devkuma-topic --bootstrap-server localhost:9092 --from-beginning
아래와 같이 CLI 명령어를 실행시키면, 메세지 전송 대기 상태가 된다.
$ bin/kafka-console-consumer.sh --topic devkuma-topic --bootstrap-server localhost:9092 --from-beginning
실행을 하고 아무 표시 내용 없이 대기가 되었다면, 메시지를 수신 대기 상태가 된 것이다.
Producer에서 메세지 전송 후 Consumer에서 수신 확인 그럼, Producer 콘솔 실행시킨 터미널 창으로 돌아가서 아무거나 타이핑 해보자.
% bin/kafka-console-producer.sh --topic devkuma-topic --broker-list localhost:9092
>hello
>devkuma
>weclome to devkuma
그러면, Consumer 콘솔 실행시킨 터미널 창에서 입력한 메시지를 수신 받을 것을 확인할 수 있을 것이다.
% bin/kafka-console-consumer.sh --topic devkuma-topic --bootstrap-server localhost:9092 --from-beginning
hello
devkuma
weclome to devkuma