RHEL 9 계열에 Kafka 4.3.1[1] 을 KRaft 모드로 3노드 구성한다. sudo 권한이 필요하다.
Kafka 4.0 부터 ZooKeeper 가 완전히 빠졌다. 브로커는 KRaft 모드로만 동작한다[2].
예전 문서의zookeeper.connect설정은 4.x 에서 쓰지 않는다. ZooKeeper 기반 구성은 Kafka Broker 설정 을 볼 것.
| 항목 | 요구 |
|---|---|
| 브로커 · Connect · 도구 | Java 17 이상 |
| 클라이언트 · Streams | Java 11 이상 |
| Scala | 2.13 전용 (4.0 에서 2.12 빌드 중단) |
이 문서의 구성은 노드 3대를 controller 와 broker 겸용(combined)으로 쓴다. 운영 규모가 커지면 controller 를 분리한다.
| 호스트 | node.id | 역할 |
|---|---|---|
| kafka01 | 1 | controller + broker |
| kafka02 | 2 | controller + broker |
| kafka03 | 3 | controller + broker |
sudo dnf install -y java-17-openjdk java-17-openjdk-devel
java -version
sudo useradd -r -m -d /home/kafka -s /bin/bash kafka
sudo mkdir -p /opt/apps /data/kafka /var/log/kafka
sudo chown -R kafka:kafka /data/kafka /var/log/kafka
cd /usr/local/src
sudo curl -LO https://dlcdn.apache.org/kafka/4.3.1/kafka_2.13-4.3.1.tgz
sudo tar -xzf kafka_2.13-4.3.1.tgz -C /opt/apps/
sudo ln -s /opt/apps/kafka_2.13-4.3.1 /opt/kafka
sudo chown -R kafka:kafka /opt/apps/kafka_2.13-4.3.1 /opt/kafka
dlcdn.apache.org에는 현행 버전만 있다. 지난 버전은archive.apache.org/dist/kafka/에서 받는다.
sudo tee /etc/security/limits.d/kafka.conf > /dev/null <<'LIM'
kafka - nofile 100000
LIM
echo 'vm.swappiness = 1' | sudo tee -a /etc/sysctl.conf
echo 'vm.max_map_count = 262144' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
한 노드에서 한 번만 만들고, 그 값을 세 노드가 모두 쓴다.
/opt/kafka/bin/kafka-storage.sh random-uuid
MkU3OEVBNTcwNTJENDM2Qk
/opt/kafka/config/server.properties 를 노드마다 만든다. 아래는 kafka01 기준이다.
process.roles=broker,controller
node.id=1
controller.quorum.voters=1@kafka01:9093,2@kafka02:9093,3@kafka03:9093
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
advertised.listeners=PLAINTEXT://kafka01:9092
controller.listener.names=CONTROLLER
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
inter.broker.listener.name=PLAINTEXT
log.dirs=/data/kafka
num.partitions=3
default.replication.factor=3
min.insync.replicas=2
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
log.retention.hours=168
log.segment.bytes=1073741824
노드마다 바꿀 것은 node.id 와 advertised.listeners 두 개다.
controller.quorum.voters는 세 노드가 같은 값이어야 한다. 하나라도 다르면 쿼럼이 서지 않는다.
default.replication.factor=3·min.insync.replicas=2는 브로커 한 대가 빠져도 쓰기가 계속되는 조합이다.
세 노드 모두에서 수행한다. -t 에는 5단계에서 만든 같은 UUID 를 넣는다.
sudo -u kafka /opt/kafka/bin/kafka-storage.sh format \
-t MkU3OEVBNTcwNTJENDM2Qk \
-c /opt/kafka/config/server.properties
Formatting /data/kafka with metadata.version 4.3-IV0.
sudo tee /etc/systemd/system/kafka.service > /dev/null <<'UNIT'
[Unit]
Description=Apache Kafka
After=network.target
[Service]
Type=simple
User=kafka
Group=kafka
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk"
Environment="KAFKA_HEAP_OPTS=-Xmx4G -Xms4G"
ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-failure
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
UNIT
sudo systemctl daemon-reload
sudo systemctl enable kafka --now
sudo systemctl status kafka
힙은 4~6GB 면 충분하다. 남는 메모리는 페이지 캐시로 둔다 — Kafka 는 디스크 읽기를 페이지 캐시에 맡긴다.
sudo firewall-cmd --permanent --add-port={9092,9093}/tcp
sudo firewall-cmd --reload
/opt/kafka/bin/kafka-metadata-quorum.sh --bootstrap-server kafka01:9092 describe --status
ClusterId: MkU3OEVBNTcwNTJENDM2Qk
LeaderId: 1
CurrentVoters: [1,2,3]
/opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server kafka01:9092 | head -3
/opt/kafka/bin/kafka-topics.sh --bootstrap-server kafka01:9092 \
--create --topic test --partitions 3 --replication-factor 3
/opt/kafka/bin/kafka-topics.sh --bootstrap-server kafka01:9092 --describe --topic test
# 보내기
echo "hello" | /opt/kafka/bin/kafka-console-producer.sh --bootstrap-server kafka01:9092 --topic test
# 받기
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server kafka01:9092 --topic test --from-beginning --timeout-ms 5000
확인이 끝나면 지운다.
/opt/kafka/bin/kafka-topics.sh --bootstrap-server kafka01:9092 --delete --topic test
| 항목 | 내용 |
|---|---|
| ZooKeeper | 4.0 에서 제거. ZooKeeper 기반 클러스터는 3.x 에서 KRaft 로 먼저 옮긴 뒤 올린다 |
| Java | 브로커 · Connect · 도구는 Java 17 이상 |
| Scala | 2.12 빌드 없음. kafka_2.13-* 만 받는다 |
| 프로토콜 | 구버전 API 를 제거했다. 브로커가 2.1 이상이어야 4.0 클라이언트를 붙일 수 있고, 반대로 클라이언트도 2.1 이상이어야 4.0 브로커에 붙는다 |
| 메시지 포맷 | v0 · v1 제거 (3.0 에서 deprecated) |
| 컨슈머 그룹 | KIP-848 새 리밸런스 프로토콜이 정식 제공. group.protocol=consumer 로 켠다 |
최신 버전 4.3.1 — 2026-09-16 확인. 지원 계열은 4.3 · 4.2 · 4.1 이다. https://kafka.apache.org/downloads ↩︎
Apache Kafka 4.0 Release Announcement — 2026-09-16 확인. https://kafka.apache.org/blog/2025/03/18/apache-kafka-4.0.0-release-announcement/ ↩︎