Kafka 3.0부터는 Zookeeper 없이 KRaft 모드로 운영이 가능합니다.
본 글에서는 VirtualBox 환경에서 JDK 17을 기반으로 Kafka 3.9를 단일 노드로 구성하고 KRaft 모드로 실행하는 방법을 안내합니다.
Kafka 3.9 KRaft 모드 설치 (JDK 17 + 단일 노드 구성)
목차
1. 설치 준비 및 테스트 환경
Kafka를 설치할 가상 머신은 다음과 같이 구성합니다.
- 가상 머신명: host_56_101
- IP 주소: 192.168.56.101 (Host-only + NAT 구성)
- 사양:
- RAM: 4GB 이상 (권장 8GB 이상)
- CPU: 2코어 이상
- 디스크 공간: 10GB 이상
2. Kafka 전용 계정 생성
Kafka를 설치는 root 사용자로 할 수 있으나, 보안과 유지보수를 위해 kafka 계정을 따로 만들어서 설치해 보도록 하겠습니다.
생성한 kafka 가 sudo 명령 사용권한을 부여하기 위해서 sudo 그룹에 추가합니다.
# kafka 계정 생성
sudo adduser kafka
# sudo 그룹 추가
sudo usermod -aG sudo kafka
# kafka 계정으로 전환
su - kafka
3. JDK 17 설치
Kafka는 Java 8, Java 11, Java 17을 지원합니다.
두 버전(Java 8, Java 11)은 Apache Kafka 4.0에서 완전히 제거될 예정입니다.
Java 11 이상 버전은 TLS(전송 계층 보안)가 활성화된 경우 성능이 크게 향상되므로 강력히 권장됩니다.
# 패키지 목록 갱신
sudo apt update
# OpenJDK 17 설치
sudo apt install -y openjdk-17-jdk
# Java 버전 확인
java -version
openjdk version "17.0.14" 2025-01-21
OpenJDK Runtime Environment (build 17.0.14+7-Ubuntu-124.04)
OpenJDK 64-Bit Server VM (build 17.0.14+7-Ubuntu-124.04, mixed mode, sharing)
4. Kafka 3.9 다운로드 및 설정
Kafka를 홈 디렉토리에 다운로드하고 압축을 해제합니다.
cd ~
wget https://downloads.apache.org/kafka/3.9.0/kafka_2.13-3.9.0.tgz
tar xvfz kafka_2.13-3.9.0.tgz
# 환경변수 설정 (선택)
export KAFKA_HOME=~/kafka_2.13-3.9.0
echo "export KAFKA_HOME=$KAFKA_HOME" >> ~/.bashrc
source ~/.bashrc
5. KRaft 모드 설정: 데이터 디렉토리 및 Cluster ID
◆ 데이터 디렉토리 생성
- Kafka는 토픽과 파티션의 메시지 데이터를 로그 세그먼트 파일로 저장하는데, 이 파일들이 보관될 경로를 생성합니다.
- log.dirs=/home/kafka/kafka_2.13-3.9.0/data 설정은 Kafka 브로커가 데이터를 저장하는 디렉터리를 지정하는 역할을 합니다.
- Kafka는 여러 개의 저장 디렉터리를 설정할 수도 있어. 여러 개의 디스크에 데이터를 분산 저장할 때 유용합니다.
예: log.dirs=/mnt/kafka-data1,/mnt/kafka-data2,/mnt/kafka-data3
이렇게 하면 Kafka가 데이터를 자동으로 라운드 로빈 방식으로 분산 저장하여 디스크 사용량을 균형 있게 조절합니다.
mkdir -p ~/kafka_2.13-3.9.0/data
◆ Cluster ID 생성 및 환경변수 설정
- 클러스터를 구성하는 모든 노드(Broker, Controller)는 같은 클러스터 ID를 공유합니다.
- 클러스터 ID는 KRaft모드에서 클러스터를 고유하게 식별하는 고유한 문자열(UUID)입니다.
- 이 ID는 KRaft 모드에서 메타데이터를 관리하는 Controller 노드와 Broker 노드를 연결하고, Kafka의 데이터를 식별하는 역할을 합니다.
- 클러스터 ID는 한 번 설정되면 변경하면 안 되며, 만약 실수로 클러스터 ID를 변경하면, Kafka 데이터를 다시 초기화(format)해야 합니다.
# Cluster ID 생성
export KAFKA_CLUSTER_ID=$($KAFKA_HOME/bin/kafka-storage.sh random-uuid)
# .bashrc에 저장
echo "export KAFKA_CLUSTER_ID=$KAFKA_CLUSTER_ID" >> ~/.bashrc
source ~/.bashrc
# 값 확인
echo $KAFKA_CLUSTER_ID
6. KRaft 서버 설정 수정
KRaft 모드에서는 server.properties 대신 kraft/server.properties를 설정해야 합니다.
ex: /home/kafka/kafka_2.13-3.9.0/config/kraft/server.properties
vi ~/kafka_2.13-3.9.0/config/kraft/server.properties
# Kafka 노드가 Controller와 Broker 역할을 동시에 수행하도록 설정합니다.
# 단일 노드 환경에서는 controller,broker를 함께 지정해야 합니다.
process.roles=controller,broker
# 해당 노드의 고유 ID를 지정합니다.
# 단일 노드에서는 1로 설정하며, 클러스터 환경에서는 각 노드마다 고유 ID를 사용합니다.
node.id=1
# 컨트롤러 선출 및 메타데이터 복제를 위한 컨트롤러 투표자 목록을 설정합니다.
# 형식: nodeId@host:port — 이 예제에서는 node.id=1인 노드가 192.168.56.101:9093 포트에서 컨트롤러 역할 수행
controller.quorum.voters=1@192.168.56.101:9093
# Kafka의 리스너 설정입니다.
# 클라이언트(Broker)는 PLAINTEXT 포트를 통해 접속하고,
# 내부 KRaft 컨트롤러 통신은 CONTROLLER 포트를 사용합니다.
listeners=PLAINTEXT://192.168.56.101:9092,CONTROLLER://192.168.56.101:9093
# Kafka 브로커가 외부 클라이언트에게 자신의 주소를 알릴 때 사용되는 advertised.listeners 설정입니다.
# 보통 listeners와 동일하게 설정하면 됩니다.
advertised.listeners=PLAINTEXT://192.168.56.101:9092,CONTROLLER://192.168.56.101:9093
# Kafka 로그 데이터(토픽 메시지, 세그먼트 파일 등)를 저장할 디렉터리를 지정합니다.
# 여러 디렉터리를 쉼표로 구분하여 설정하면 디스크 사용을 분산시킬 수 있습니다.
log.dirs=/home/kafka/kafka_2.13-3.9.0/data
# Kafka 클러스터를 식별하는 고유한 ID를 지정합니다.
# ${KAFKA_CLUSTER_ID}는 환경변수로 지정된 클러스터 ID를 참조합니다.
# 이 값은 kafka-storage.sh format 시점에 저장되며, 변경해서는 안 됩니다.
cluster.id=${KAFKA_CLUSTER_ID}
7. Kafka 스토리지 포맷
Kafka를 KRaft 모드로 실행하기 위해서는 스토리지를 초기화해야 합니다.
이 과정이 중요한 이유는 클러스터 ID를 저장하고, 초기 설정을 적용하기 때문입니다.
클러스터 ID를 적용하려면 Kafka 스토리지를 포맷해야 합니다.
log.dirs에 설정된 /home/kafka/kafka_2.13-3.9.0/data 디렉터리를 KRaft 모드에 맞게 초기화하며,
기존 데이터가 있을 경우 삭제되므로 데이터 손실에 주의해야 한다.
$KAFKA_HOME/bin/kafka-storage.sh format \
-t $KAFKA_CLUSTER_ID \
-c $KAFKA_HOME/config/kraft/server.properties
Formatting metadata directory /home/kafka/kafka_2.13-3.9.0/data with metadata.version 3.9-IV0.
8. Kafka 실행 및 종료
# 백그라운드 실행 (daemon 모드)
$KAFKA_HOME/bin/kafka-server-start.sh -daemon $KAFKA_HOME/config/kraft/server.properties
# 실행 확인
ps aux | grep kafka
# 종료
$KAFKA_HOME/bin/kafka-server-stop.sh
9. Kafka 메시지 전송 테스트
◆ Kafka 토픽 생성
$KAFKA_HOME/bin/kafka-topics.sh \
--create --topic test-topic \
--bootstrap-server localhost:9092 \
--partitions 1 --replication-factor 1
◆ Producer 실행
$KAFKA_HOME/bin/kafka-console-producer.sh \
--topic test-topic \
--bootstrap-server localhost:9092
◆ Consumer 실행
$KAFKA_HOME/bin/kafka-console-consumer.sh \
--topic test-topic \
--from-beginning \
--bootstrap-server localhost:9092
Producer Console에서 입력한 메세지를 Consumer Console에 출력되는 것을 확인합니다.
Consumer 를 종료한 후 다시 실행해도 전체 메세지를 다시 수신하는 것을 확인합니다.
VirtualBox 가상머신 환경에서 Kafka 3.9.0을 KRaft 모드로 설치하고, 단일 노드로 실행하는 과정을 JDK 17 기반으로 안내했습니다.
KRaft 설정, Cluster ID 생성, server.properties 수정, 스토리지 포맷, Kafka 실행까지의 전 과정을 따라하면 별도 Zookeeper 없이 Kafka를 실행할 수 있습니다.
관련 글 링크
2025.03.27 - [1.시스템&인프라/가상화(WSL,VirtualBox)] - [VirtualBox]5.호스트 전용 네트워크에서 인터넷 연결 방법 (NAT설정)
2025.03.31 - [1.시스템&인프라/Apache Kafka] - 9. Kafka 하드웨어 요구사항 및 JVM 옵션 정리: KRaft 모드
2025.03.29 - [1.시스템&인프라/Ubuntu] - 8. 리눅스 계정 관리 명령어 정리 : 생성, 삭제, 잠금, 그룹
'1.시스템&인프라 > Apache Kafka' 카테고리의 다른 글
12. Kafka KRaft 모드 장애복구 및 증설 테스트 (Controller 3, Broker 3) (0) | 2025.03.31 |
---|---|
11. Kafka 3.9 노드 구성별 server.properties 예시: KRaft 모드 (0) | 2025.03.31 |
9. Kafka 하드웨어 요구사항 및 JVM 옵션 정리: KRaft 모드 (0) | 2025.03.31 |
8. Kafka Consumer 동작 이해하기: Polling, Offset, Commit (0) | 2025.03.31 |
7. Kafka Producer acks 설정 및 동작 이해하기: 데이터 유실 방지 (0) | 2025.03.31 |