사건의 발단
매번 Kafka를 실행시키기 귀찮아서 개발을 편하게 하기 위해서 EC2에 Kafka를 올려두었다. 그런데 로컬 환경이 아니다 보니 진짜 여러 오류가 많이 발생했다. 그래서 나중에 혹시 또 겪을 수도 있기 때문에 해결한 과정을 정리해 두기로 했다.
Image 문제 - repository does not exist or may require
wurstmeister/kafka와 wurstmeister/zookeeper 이미지를 이용해서 실행하려고 했는데 오류가 발생했다.
pull access denied for wurstmeister/kafka, repository does not exist or may require
딱 보니까 이미지에 문제가 생긴거 같아서 검색을 통해 confluent kafka로 변경했다.
docker compose up 실행 오류 - 인프런
version: '2' services: zookeeper: image: wurstmeister/zookeeper container_name: zookeeper ports: - '2181:2181' kafka: image: w...
www.inflearn.com
변경 전
wurstmeister/zookeeper
wurstmeister/kafka
변경 후
confluentinc/cp-zookeeper:latest
confluentinc/cp-kafka:latest
network was found but has incorrect label com.docker.compose.network set to ""
WARN[0029] a network with name delibird-network exists but was not created by compose.
Set `external: true` to use an existing network network delibird-network was found
but has incorrect label com.docker.compose.network set to ""
이번에는 위와 같은 경고가 떴다.
docker-compose -f docker-compose-single-broker.yml up -d - 인프런
docker compose 명령어를 사용하면 강의와 다르게 에러가 뜨고 있습니다.docker compose 에서 생성한 네트워크가 아니라는 말도 있는데 혼자서는 해결이 안되고 있네요.https://github.com/wurstmeister/kafka-docker
www.inflearn.com
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
KAFKA_HEAP_OPTS: "-Xmx256M -Xms256M"
networks:
my-network:
ipv4_address: 172.18.0.100
kafka:
image: confluentinc/cp-kafka:latest
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 172.18.0.101
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://퍼블릭IP:9092
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_HEAP_OPTS: "-Xmx256M -Xms256M"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- zookeeper
networks:
my-network:
ipv4_address: 172.18.0.101
networks:
my-network:
external: true # <---------- 이 부분!!
name: delibird-network
docker-compose 파일의 networks.my-network에 external: true를 추가해서 해결했다.
KAFKA_ADVERTISED_LISTENERS is required.
docker-compose 파일을 이용해서 실행은 했으나 docker ps -a로 확인하니 바로 종료가 됐다.
그래서 docker logs 컨테이너ID로 로그를 확인하니 아래와 같은 오류가 발생한 것을 알 수 있었다.
KAFKA_ADVERTISED_LISTENERS is required.
Command [/usr/local/bin/dub ensure KAFKA_ADVERTISED_LISTENERS] FAILED !
이번엔 이런 문제가 발생했다.
docker-compose 파일의 환경 변수에 KAFKA_ADVERTISED_LISTENERS 정보를 작성해주면 된다.
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
KAFKA_HEAP_OPTS: "-Xmx256M -Xms256M"
networks:
my-network:
ipv4_address: 172.18.0.100
kafka:
image: confluentinc/cp-kafka:latest
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 172.18.0.101
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://퍼블릭IP:9092 # <---------- 이 부분!!
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_HEAP_OPTS: "-Xmx256M -Xms256M"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- zookeeper
networks:
my-network:
ipv4_address: 172.18.0.101
networks:
my-network:
external: true
name: delibird-network
단, 주의할 점은 로컬 IP가 아닌 EC2의 외부에 노출되는 IP를 작성해야 한다는 점이다.
one of (ZOOKEEPER_CLIENT_PORT,ZOOKEEPER_SECURE_CLIENT_PORT) is required.
one of (ZOOKEEPER_CLIENT_PORT,ZOOKEEPER_SECURE_CLIENT_PORT) is required.
Command [/usr/local/bin/dub ensure-atleast-one ZOOKEEPER_CLIENT_PORT ZOOKEEPER_SECURE_CLIENT_PORT] FAILED !
다음에는 또 이런 오류가 발생했다...
딱 보니까 앞에서 해결했던 것과 비슷하게 위 환경 변수를 추가해 주면 될 거 같다.
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181 # <---------- 이 부분!!
KAFKA_HEAP_OPTS: "-Xmx256M -Xms256M"
networks:
my-network:
ipv4_address: 172.18.0.100
kafka:
image: confluentinc/cp-kafka:latest
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 172.18.0.101
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://퍼블릭IP:9092
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_HEAP_OPTS: "-Xmx256M -Xms256M"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- zookeeper
networks:
my-network:
ipv4_address: 172.18.0.101
networks:
my-network:
external: true
name: delibird-network
메모리 부족 - There is insufficient memory for the Java Runtime Environment to continue.
There is insufficient memory for the Java Runtime Environment to continue.
Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
An error report file with more information is saved as:
잘 실행되려나 싶었는데 zookeeper만 실행되고 kafka는 실행하자마자 종료됐다. 이번에도 로그를 확인해보니...
메모리가 부족하다고 한다. EC2 프리티어는 메모리를 1GB만 제공하기 때문에 그런 것 같다. kafka 하나만 램을 이렇게 차지하니 조절해야할 필요가 있었다.
https://velog.io/@kkh30123/kafka-%EC%84%A4%EC%B9%98
kafka 설치
ssh -i kafka.pem ubuntu@ {IP}ubuntu@ip-172-31-45-34:~$ sudo apt-get updateubuntu@ip-172-31-45-34:~$ sudo apt-get upgradeubuntu@ip-172-31-45-34:~$ sudo
velog.io
위 블로그를 참고해서 docker-compose 파일을 수정했다.
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
KAFKA_HEAP_OPTS: "-Xmx256M -Xms256M" # <---------- 이 부분!!
networks:
my-network:
ipv4_address: 172.18.0.100
kafka:
image: confluentinc/cp-kafka:latest
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 172.18.0.101
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://퍼블릭IP:9092
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_HEAP_OPTS: "-Xmx256M -Xms256M" # <---------- 이 부분!!
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- zookeeper
networks:
my-network:
ipv4_address: 172.18.0.101
networks:
my-network:
external: true
name: delibird-network
이렇게 작성해주니 일단 메모리 문제는 해결했고 둘 다 잘 실행됐다.
java.lang.IllegalArgumentException: Error creating broker listeners from '172.18.0.101:9092': Unable to parse 172.18.0.101:9092 to a broker endpoint
이제 Kafka와 Zookeeper는 잘 실행되었으나 로컬 프로젝트에서 actuator/busrefresh로 테스트해봤는데 아래와 같은 오류가 발생했다.
java.lang.IllegalArgumentException: Error creating broker listeners from '172.18.0.101:9092':
Unable to parse 172.18.0.101:9092 to a broker endpoint
Connection to node 1001 (/172.18.0.101:9092) could not be established.
Broker may not be available. (org.apache.kafka.clients.NetworkClient)
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
KAFKA_HEAP_OPTS: "-Xmx256M -Xms256M"
networks:
my-network:
ipv4_address: 172.18.0.100
kafka:
image: confluentinc/cp-kafka:latest
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 172.18.0.101
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://퍼블릭IP:9092 # <---------- 이 부분!!
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_HEAP_OPTS: "-Xmx256M -Xms256M"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- zookeeper
networks:
my-network:
ipv4_address: 172.18.0.101
networks:
my-network:
external: true
name: delibird-network
KAFKA_ADVERTISED_LLISTNERS의 값을 PLAINTEXT://를 접두사로 EC2의 퍼블릭IP와 포트를 적어주도록 하자.
나는 내부 네트워크 명을 적어서 오류가 발생했던 것이다.

로컬 환경에서 사용했던 server.properties 파일에서도 해당 내용을 찾을 수 있다. 이 내용을 변경해주는 것이다.
Client requested connection close from node 1001 (org.apache.kafka.clients.NetworkClient)
Client requested connection close from node 1001 (org.apache.kafka.clients.NetworkClient)
Postman으로 다시 테스트하는데 이번에는 이런 오류가 발생했다....
응답이 오지 않고 결국 500 응답을 뱉어낸다.
로컬에서 카프카와 통신 오류
아파치 카프카 애플리케이션 프로그래밍 with 자바라는 책을 공부하고 실습 중이었다. EC2 서버에 카프카 클러스터를 구성하고 로컬에서 카프카 클라이언트를 구성했다.로컬에서 위의 명령어를
velog.io
다행히도 나와 정확히 같은 이유로 오류가 발생했던 분이 있어서 잘 해결했다.
인바운드 규칙에서 EC2의 퍼블릭IP를 허용해주어야 한다. 이유는 위 블로그에 잘 나와있다.
해결 완료

드디어 모든 오류를 해결하고 204 응답을 보게되었다..!
오류가 오류를 만들어내니 정말 절망적이었는데 결국 해결하게 되니 아주 기분이 좋다!

메모리가 자꾸 신경쓰여 top 명령어로 조회해보니 1기가중 거의 800메가를 차지하고 있길래 나중에 더 실행되어야 하는 서비스들을 위해 swap 공간을 생성하기로 했다.
https://ittrue.tistory.com/297
[AWS] 프리티어 EC2 인스턴스 메모리 부족 현상 해결하기(램 성능 개선)
Intro AWS 프리티어 계정으로 EC2를 사용하다 보면 램 부족 현상으로 인해 서버가 자주 터지게 된다. 프로젝트 빌드 도중에 멈추기도 하고, 서버가 갑자기 다운되는 현상이 자주 발생할 수 있다. AWS
ittrue.tistory.com
위 블로그를 참고해서 2기가 swap 공간을 만들었다.

이걸로 이제 당분간은 괜찮을거 같다.
----- 추가 ------
카프카는 스왑 공간에서 실행하게 되면 장점인 대용량 데이터 처리를 제대로 할 수 없다고 해서 그냥 GCP로 옮겼다...
'공부 > Spring Cloud' 카테고리의 다른 글
| [Spring Cloud][GCP] Gateway에서 HTTPS 사용하기 (pem -> p12) (0) | 2024.06.23 |
|---|---|
| [Spring Cloud] 나를 괴롭히는 CORS 오류 해결하기 (0) | 2024.06.18 |
| [Spring Cloud][7] config-service 추가 및 설정 대칭키 암호화 (0) | 2024.05.10 |
| [Spring Cloud][6] Store 마이크로 서비스 구현하기 1 (0) | 2024.05.06 |
| [Spring Cloud][5] JWT, OAuth2 로그아웃 구현하기 (0) | 2024.05.04 |