Pendahuluan
Dalam arsitektur sistem modern, data bergerak dengan sangat cepat. Mulai dari event sensor IoT, log aplikasi, hingga transaksi keuangan — semua membutuhkan sistem yang mampu mengalirkan data secara real-time.
Nah, di sinilah Apache Kafka berperan.
Kafka adalah event streaming platform yang didesain untuk mengirim, menerima, menyimpan, dan memproses data dengan kecepatan tinggi serta keandalan tinggi. Kafka banyak digunakan oleh perusahaan besar seperti LinkedIn, Uber, dan Netflix untuk menangani miliaran event per hari.
Sebelumnya, Kafka sangat bergantung pada Zookeeper sebagai komponen koordinasi cluster. Namun sejak versi 3.x, Kafka telah beralih ke KRaft mode (Kafka Raft), yang menghilangkan kebutuhan akan Zookeeper.
Mode baru ini membuat arsitektur Kafka lebih sederhana, cepat, dan mudah dikelola.
Pada artikel ini, kita akan membangun Apache Kafka KRaft mode + Kafka UI menggunakan Docker Compose — lengkap dari nol, mulai dari pembuatan folder, penjelasan tiap konfigurasi, hingga pengujian.
Apa Itu Apache Kafka?
Apache Kafka adalah platform distributed streaming yang digunakan untuk:
-
Mengirim, menerima, menyimpan, dan memproses stream data secara real-time.
-
Digunakan dalam sistem yang membutuhkan event streaming seperti logging, telemetry, IoT, analytics, dan komunikasi antar-mikroservis.
Siap — berikut dokumentasi lengkap dan rapi dari nol untuk men-setup Apache Kafka modern tanpa Zookeeper (KRaft mode) menggunakan Docker Compose.
Cocok untuk server seperti milik kamu (Rocky Linux / Ubuntu)
1. Buat Folder Project
Masuk ke direktori kerja yang kamu mau, lalu buat folder bernama kafka:
cd /opt
mkdir -p kafka
cd kafka
Struktur yang akan kita buat nanti seperti ini:
/opt/kafka/
├── docker-compose.yml
└── data/
├── kafka/
└── logs/
Buat folder untuk data Kafka (biar persist setelah restart):
mkdir -p data/kafka data/logs
2. Buat File docker-compose.yml
Gunakan editor favorit (misal vi): pastikan docker compose di buat di folder /opt/kafka/
vi docker-compose.yml
Kemudian isi
services:
kafka:
image: apache/kafka:3.8.0
container_name: kafka
restart: always
ports:
- "9092:9092"
environment:
# === Mode modern: tanpa Zookeeper ===
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.100.70:9092 #sesuaikan dengan ip di server
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
# === Cluster ID unik (buat pertama kali saja) ===
CLUSTER_ID: "5L6g3nShT-eMCtK--X86sw"
# === Konfigurasi tambahan ===
KAFKA_LOG_DIRS: /var/lib/kafka/data
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
volumes:
- ./data/kafka:/var/lib/kafka/data
- ./data/logs:/var/log/kafka
kafka-ui:
image: provectuslabs/kafka-ui:latest
container_name: kafka-ui
restart: always
ports:
- "8080:8080"
environment:
- KAFKA_CLUSTERS_0_NAME=LocalKafka
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=10.14.158.186:9092
depends_on:
- kafka
3. Format Cluster Kafka (Langkah penting pertama kali)
Kafka mode KRaft harus diformat sekali untuk membuat metadata awal cluster.
Jalankan perintah berikut hanya sekali:
docker compose run --rm kafka kafka-storage format --ignore-formatted --cluster-id=5L6g3nShT-eMCtK--X86sw --config /opt/kafka/config/kraft/server.properties
Jika direktori /opt/kafka/config/kraft/server.properties tidak ada (karena image Kafka bawaan), gunakan perintah yang lebih aman berikut:
docker compose run --rm kafka kafka-storage format --ignore-formatted --cluster-id=5L6g3nShT-eMCtK--X86sw --config /etc/kafka/kraft/server.properties
Kalau sukses, akan muncul pesan seperti:
Formatting was successful.
4. Jalankan Kafka dan Kafka UI
docker compose up -d
Cek container berjalan:
docker ps
Harus muncul dua container:
CONTAINER ID IMAGE COMMAND STATUS xxxxxx apache/kafka:3.8.0 ... Up (healthy) xxxxxx provectuslabs/kafka-ui:latest ... Up
5. Akses Kafka UI
http://192.168.100.70:8080
Kafka UI akan langsung menampilkan cluster “LocalKafka”.
6. Tes Buat Topic dan Producer/Consumer
Masuk ke container Kafka:
docker exec -it kafka bash
Buat topic baru:
kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
Lihat daftar topic:
kafka-topics.sh --list --bootstrap-server localhost:9092
Kirim pesan:
kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092
(ketik pesan, lalu tekan Ctrl+C)
Konsumsi pesan:
kafka-console-consumer.sh --topic test-topic --from-beginning --bootstrap-server localhost:9092
7. Stop dan Restart Kafka
Stop service:
docker compose down
Start ulang:
docker compose up -d
Karena data disimpan di ./data/kafka, semua topic dan message akan tetap ada.
8. Troubleshooting Umum
|
Masalah |
Solusi |
|
Formatting is only supported for clusters in KRaft mode |
Kamu belum format cluster (lihat langkah 3) |
|
Kafka tidak bisa connect dari luar |
Pastikan KAFKA_ADVERTISED_LISTENERS berisi IP server, bukan localhost |
|
Kafka UI tidak bisa connect |
Pastikan KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS diisi IP yang sama |
|
Ingin ganti port Kafka |
Ubah 9092:9092 ke port lain, dan sesuaikan juga di environment Kafka UI |
Struktur Akhir Folder
/opt/kafka/
├── docker-compose.yml
└── data/
├── kafka/
└── logs/
Sekian Tutorial kali ini, semoga bermanfaat