개발용 kafka를 Docker-compose로 세팅하고 Golang으로 메세지를 날려 보겠습니다.
우선 Wurstmeister에서 만든 docker image를 사용하기위해서는 docker-compose를 설치하여 주세요. (docker-desktop에서는 내장되어 있습니다.)
아래의 코드로 wurstmeister/kafka repository를 clone 해줍니다.
> git clone https://hub.docker.com/r/wurstmeister/kafka/
다운받은 폴더에는 docker-compose 파일이 있는것을 확인합니다.
우선 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 수} "
environment:
KAFKA_CREATE_TOPICS: "Topic1:1:3,Topic2:1:1:compact"
docker-compose로 container를 생성 및 실행합니다.
> docker-compose -f docker-compose-single-broker.yml up -d
contaner의 실행을 확인합니다.
> docker ps
zookeeper와 kafka가 실행되었음을 확인 가능합니다.
kafka는 분산-어플리케이션(replica가 1이상)상태로 보통 운영합니다. 이때 분산어플리케이션을 연결하고, 안정적으로 관리합니다.
테스트 방식에는 두가지 방식이 있습니다.
1. container에서 bash로 실행
2. wurstmeister 에서 start-kafka-shell.sh로 실행
아래의 아이디로 container에 접속을 합니다.
여기서는 kafkadocker_kafka_1 를 입력해줍니다.
(컨테이너 id, name은 docker ps를 하면 표시 됩니다. )
> docker exec -it <docker Container id 4자리 이상 or container anme> bin/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
위와 같이 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
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하는것을 테스트하는것을 정리하겠습니다.