Kodeloka
  1. Kodeloka
  2. Kelas Apache Kafka
  3. Materi

1 · Fondasi · Modul 3 dari 13

KRaft: Kafka Tanpa ZooKeeper

ZooKeeper sudah dihapus sepenuhnya di Kafka 4.0. Tutorial lama yang menyuruh Anda menjalankan ZooKeeper kini menyesatkan.

Apa yang Berubah

Selama satu dekade Kafka menyimpan metadata klaster — daftar topik, konfigurasi, keanggotaan broker, ACL — di ZooKeeper, sistem terpisah yang harus dijalankan dan dipelihara sendiri.

KRaft (Kafka Raft) memindahkan metadata itu ke dalam Kafka sendiri, disimpan pada topik internal __cluster_metadata dan direplikasi memakai protokol konsensus Raft.

DULU (Kafka 2.x/3.x mode lama)     SEKARANG (KRaft)
  ┌────────────┐                    ┌────────────────────┐
  │ ZooKeeper  │ ← 3 node terpisah  │ Kafka controller   │
  └─────┬──────┘                    │ quorum (3 node)    │
        │                           └─────────┬──────────┘
  ┌─────┴──────┐                              │
  │  Broker    │                        ┌─────┴──────┐
  └────────────┘                        │  Broker    │
                                        └────────────┘
  Dua sistem, dua model operasi     Satu sistem, satu biner
🚫 Jangan ikuti tutorial yang memakai zookeeper.connect

Mode ZooKeeper sudah dihapus di Kafka 4.0 — bukan sekadar deprecated. Perintah lama seperti --zookeeper localhost:2181 pada kafka-topics.sh juga sudah lama hilang; semuanya kini memakai --bootstrap-server. Bila panduan yang Anda ikuti menjalankan zookeeper-server-start.sh, panduan itu sudah usang.

Peran Baru: Controller dan Broker

Pada KRaft, tiap node punya process.roles:

PeranTugasDipakai kapan
controllerAnggota quorum metadata, memilih leader partisiProduksi: 3 node khusus
brokerMenyimpan dan melayani data topikProduksi: sebanyak yang dibutuhkan
broker,controllerKeduanya sekaligus (mode gabungan)Pengembangan lokal, klaster kecil

Konfigurasi Minimal KRaft

process.roles=broker,controller
node.id=1
controller.quorum.voters=1@host1:9093,2@host2:9093,3@host3:9093

listeners=PLAINTEXT://:9092,CONTROLLER://:9093
inter.broker.listener.name=PLAINTEXT
controller.listener.names=CONTROLLER

log.dirs=/var/lib/kafka/data

Sebelum broker pertama kali dijalankan, direktori penyimpanan harus diformat dengan sebuah cluster id:

KAFKA_CLUSTER_ID=$(kafka-storage.sh random-uuid)
kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c server.properties
⚠️ Semua node harus memakai cluster id yang sama

Jalankan random-uuid sekali saja, lalu pakai nilai itu untuk memformat setiap node. Memformat tiap node dengan id berbeda menghasilkan node yang menolak bergabung, dengan pesan galat yang tidak langsung menunjuk penyebabnya.

Kenapa Ini Lebih Baik

  • Satu sistem untuk dioperasikan — satu biner, satu model keamanan, satu tempat memantau.
  • Pemulihan controller jauh lebih cepat — metadata sudah ada di memori tiap controller, tidak perlu dimuat ulang dari ZooKeeper.
  • Skala partisi jauh lebih besar — jutaan partisi per klaster menjadi realistis.
  • Startup lebih ringkas — penting untuk klaster di Kubernetes yang sering dijadwal ulang.
💡 Untuk pengembangan lokal

Kafka modern bisa dijalankan sebagai satu kontainer tunggal tanpa ZooKeeper. Image apache/kafka resmi sudah memakai KRaft secara default dan siap pakai untuk pengembangan hanya dengan menyetel beberapa variabel lingkungan.