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

참조