Zookeeper는 점점 사라지고 있고, 앞으로는 Kafka에서 대체될 예정이다. 따라서 KRaft 모드로 카프카를 시작하려는데 어떤 방식으로 카프카를 시작할 지 고민이 되었다.
많은 공식 문서와 기업, 커뮤니티에서 도커로 카프카를 실행하는 방법과 베스트 프랙티스를 제공하고 있다.
다만, 운영 환경(Production)과 개발/테스트 환경에서의 권장도와 주의점이 다르다.
advertised.listeners
)을 신중히 해야 한다.요약:
도커로 카프카를 실행하는 것은 개발/테스트에는 적극 권장, 운영 환경에서도 충분한 준비와 리소스가 있다면 가능하며, 실제로도 많이 사용되고 있다.
따라서 아래와 같이 docker-compose.yml 파일을 작성하였다.
version: '3.8'
services:
kafka:
image: apache/kafka:latest
container_name: kafka
ports:
- "9092:9092"
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LOG_DIRS: /kafka/data
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
volumes:
- kafka_data:/kafka/data
kafka-ui:
image: provectuslabs/kafka-ui:latest
container_name: kafka-ui
ports:
- "8989:8080"
depends_on:
- kafka
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
volumes:
kafka_data:
하지만 이렇게 코드를 짠 후 docker compose up을 하게 되면
kafka | Formatting metadata directory /kafka/data with metadata.version 4.0-IV3. Error while writing meta.properties file /kafka/data: java.nio.file.AccessDeniedException: /kafka/data/bootstrap.checkpoint.tmp
kafka exited with code 1
이런 에러가 발생하게 되면서 kafka container가 바로 종료된다.
이 에러는 Kafka 컨테이너가 /kafka/data
디렉터리에 쓸 권한이 없어서 발생하는 "퍼미션(권한)" 문제다.
특히 Windows나 Mac에서 Docker를 쓸 때 자주 발생한다.
volumes:
- kafka_data:/kafka/data
./kafka_data:/kafka/data
처럼 호스트 경로를 직접 마운트하지 말자.아래 명령어로 컨테이너와 볼륨을 완전히 삭제하고 새로 시작:
docker compose down -v
docker volume prune -f
docker compose up -d
그래도 문제가 반복된다면, 아래 3번을 꼭 확인
컨테이너가 일시적으로라도 살아 있다면,
docker exec -it kafka bash
chown -R 1000:1000 /kafka/data
chmod -R 755 /kafka/data
이 방법은 리눅스/WSL에서만 가능하다.
위의 방법들을 모두 시도 했지만 해결되지 않았다.
Windows에서 Docker 볼륨은 chown, chmod로 권한 변경이 불가능하다.
그리고 Kafka는 Windows 파일 시스템과 궁합이 매우 나쁘다.
가장 확실한 해결책은 WSL2 리눅스 파일 시스템에서 Kafka를 실행하는 것이다.
운영 환경이 아니라면, WSL2/리눅스에서 실습하는 것이 강력히 권장된다.
사전 조건
설치 절차
1. Windows 버전 확인
winver
입력 WSL2 설치
wsl --install
Ubuntu 설치 및 초기 설정
Kafka는 Java 런타임이 필요하므로, Ubuntu 터미널에서 다음 명령어로 Java 11 JDK를 설치한다.
sudo apt update
sudo apt install openjdk-11-jdk -y
설치 완료 후, 아래 명령어로 정상 설치 여부를 확인한다.
java -version
Kafka 공식 사이트에서 최신 버전의 다운로드 링크 복사
https://kafka.apache.org/downloads
wget으로 다운로드 및 압축 해제
wget https://downloads.apache.org/kafka/3.1.0/kafka_2.13-3.1.0.tgz
tar xzf kafka_2.13-3.1.0.tgz
Kafka 디렉터리 확인
ls
Kafka 명령어를 어디서나 사용할 수 있도록 환경변수에 등록합니다.
Kafka bin 디렉터리의 전체 경로 확인
cd kafka_2.13-3.1.0/bin
pwd
/home/사용자명/kafka_2.13-3.1.0/bin
.bashrc 파일 편집
cd ~
nano .bashrc
export PATH="$PATH:/home/사용자명/kafka_2.13-3.1.0/bin"
Ctrl + X
, Y
, Enter
)변경 사항 적용
source ~/.bashrc
적용 확인
echo $PATH
kafka-topics.sh --help
나는 곧 죽어도 도커로 실행하고 싶다.
Bitnami Kafka 이미지는 KRaft 모드를 지원한다. 실제로 최근 버전(3.4.0 이상)부터는 Bitnami 공식 이미지와 Helm 차트 모두에서 KRaft 모드가 기본 지원 및 활성화되어 있다.
즉, Bitnami로 Kafka를 실행할 때도 Zookeeper 없이 KRaft 모드로 동작할 수 있다.
/bitnami/kafka
)의 권한을 자동으로 맞춰주는 로직이 내장되어 있다.KAFKA_CFG_PROCESS_ROLES
, KAFKA_CFG_NODE_ID
등)만 맞게 설정하면/bitnami/kafka
로 고정되어 있고,version: '3.8'
services:
kafka:
image: bitnami/kafka:latest
container_name: kafka
ports:
- "9092:9092"
environment:
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_NODE_ID=1
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LOG_DIRS=/bitnami/kafka/data
- ALLOW_PLAINTEXT_LISTENER=yes
volumes:
- kafka_data:/bitnami/kafka/data
kafka-ui:
image: provectuslabs/kafka-ui:latest
container_name: kafka-ui
ports:
- "8989:8080"
depends_on:
- kafka
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
volumes:
kafka_data: