kafka docker 개발 세팅

Divan·2022년 8월 29일
3
post-thumbnail

개발용 kafka를 Docker-compose로 세팅하고 Golang으로 메세지를 날려 보겠습니다.

1. Wurstmeister Docker image 내려받기

우선 Wurstmeister에서 만든 docker image를 사용하기위해서는 docker-compose를 설치하여 주세요. (docker-desktop에서는 내장되어 있습니다.)

아래의 코드로 wurstmeister/kafka repository를 clone 해줍니다.

> git clone https://hub.docker.com/r/wurstmeister/kafka/

다운받은 폴더에는 docker-compose 파일이 있는것을 확인합니다.

2. Docker-compose.yml 주소 수정

우선 localhost 기준으로 설정하고 아래에서 public Ip에서 접근하는 방법을 설명하겠습니다. 여기서는 개발 서버를 세팅하기에 broker를 하나만 사용합니다.

docker-compose-single-broker.yml파일을 수정합니다.
(nano가 설치 안되어있을시 apt-get install nano를 실행합니다.)

> nano docker-compose-single-broker.yml

KAFKA_ADVENRTISED_HOST_NAME: 127.0.0.1 로 변경합니다.

참고

KAFKA_CREATE_TOPICS 환경변수는 Topic을 컨테이너 생성과 동시에 생성을 한다.
"{TopicName}:{partition 수}:{replica 수} "

  • Topic1의 경우 파티션은1개 레플리카는3개인 토픽이 생성된다.
    environment:
      KAFKA_CREATE_TOPICS: "Topic1:1:3,Topic2:1:1:compact"

3. Container 만들기

docker-compose로 container를 생성 및 실행합니다.

> docker-compose -f docker-compose-single-broker.yml up -d

contaner의 실행을 확인합니다.

> docker ps

zookeeper와 kafka가 실행되었음을 확인 가능합니다.
kafka는 분산-어플리케이션(replica가 1이상)상태로 보통 운영합니다. 이때 분산어플리케이션을 연결하고, 안정적으로 관리합니다.


4. 테스트 (localhost)

테스트 방식에는 두가지 방식이 있습니다.
1. container에서 bash로 실행
2. wurstmeister 에서 start-kafka-shell.sh로 실행

1. container로 실행

아래의 아이디로 container에 접속을 합니다.
여기서는 kafkadocker_kafka_1 를 입력해줍니다.
(컨테이너 id, name은 docker ps를 하면 표시 됩니다. )

> docker exec -it <docker Container id  4자리 이상 or container anme> bin/bash

2. conatainer에서 bash로 실행

git clone한 폴더에서 shell script를 실행시켜줍니다.

현재는 localhost로 실행했기에 아래와 같은값으로 실행해줍니다.
<DOCKER_HOST_IP> 는 127.0.0.1
<ZK_HOST:ZK_PORT> 는 127.0.0.1 : 2181

> ./start-kafka-shell.sh <DOCKER_HOST_IP> <ZK_HOST:ZK_PORT>

아래와 같이 나온다면 정상적으로 접속을 한것입니다.

아래 부터는 접속 방식에 상관없이 공통인 부분입니다. (2번 방식을 추천합니다.)

우선 위치를 이동시켜 줍니다 (/bin directory)

> cd opt/kafka/bin/

아래와 같이 다양한 .sh 파일을 확인합니다.

아래와 같이 입력을하면 kafka에서 생성된 토픽의 리스트를 확인

> kafka-topics.sh --list --bootstrap-server  127.0.0.1:9092

순서를 따라 했다면 topic은 test만 보입니다.

  • 토픽을 생성하는 명령
 > ./kafka-console-producer.sh --bootstrap-server 127.0.0.1:9092 --topic msg_test
  • 메세지 생성
 > ./kafka-console-producer.sh --bootstrap-server 127.0.0.1:9092 --topic msg_test
  • 메세지 받기
 > ./kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic msg_test --from-beginning

5. Aws(ec2)에 올리기

위와 같이 localhost기준으로 만들었다. 그렇기에 ec2에 container 실해하고 port fowarding을 하고, docker-copmose 파일의 KAFKA_ADVERTIESED_HOST_NAME만 public ip로 변경하고 실행한다고 해서도 실행이 되지 않는다.
"server.properties"를 변경해줘야 접속이 가능하다.

만약 sever.properties를 변경하지 않았다면 아래와 같은 Err를 확인 가능하다.
err : dial tcp 0.0.0.0 :9092 connect :connection refused
혹은 booostrap-server connect dinied

server.properies 내용 변경

container로 접속

> docker exec -it <container id or name> bin/bash

server.properies 파일이 있는 디렉토리 이동

> cd /opt/kafka/config

*편리를 위해서 nano 편집기를 위선 설치합니다.

> apt-get update
> apt-get install nano

nano 편집기로 파일을 열어요

> nano server.properties

하나의 값을 변경해줘야합니다.

#advertiesed.listensers=PLANINTEXT://youser.host.name :9092
-> advertiesed.listensers=PLANINTEXT://<public_ip> :9092

참고
advertiesd.host.name은 localhost로 되어있어도 메세지를 주고 받는데 문제가 없었습니다.


이후에는 golang에서 메세지를 emit하는것과 listen하는것을 테스트하는것을 정리하겠습니다.

profile
하루 25분의 투자

0개의 댓글