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

1 · Fondasi · Modul 2 dari 13

Partisi, Kunci Pesan & Replikasi

Partisi menentukan paralelisme, kunci pesan menentukan urutan, dan replikasi menentukan apakah data Anda selamat. Ketiganya saling tarik-menarik.

Partisi = Unit Paralelisme

Sebuah topik dipecah menjadi beberapa partisi, dan tiap partisi adalah log terpisah yang bisa berada di broker berbeda.

Topik "pesanan" dengan 3 partisi:

  P0 pada broker-1:  [ o1 ][ o4 ][ o7 ]
  P1 pada broker-2:  [ o2 ][ o5 ]
  P2 pada broker-3:  [ o3 ][ o6 ][ o8 ][ o9 ]
🚫 Urutan HANYA dijamin di dalam satu partisi

Tidak ada urutan global di seluruh topik. Bila Anda menulis pesanan.dibuat lalu pesanan.dibayar untuk pesanan yang sama tanpa kunci, keduanya bisa mendarat di partisi berbeda dan dikonsumsi terbalik. Bug semacam ini muncul secara acak dan sangat sulit dilacak.

Kunci Pesan Mengunci Urutan

Bila produser menyertakan kunci, Kafka menghitung hash(kunci) % jumlah_partisi sehingga semua pesan dengan kunci yang sama selalu masuk ke partisi yang sama — dan otomatis terurut relatif satu sama lain.

kirim(topik="pesanan", kunci="pesanan-123", nilai=...)  → selalu P1
kirim(topik="pesanan", kunci="pesanan-124", nilai=...)  → mungkin P0

Semua peristiwa milik pesanan-123 terurut. Antar pesanan, tidak dijamin —
dan memang tidak perlu.

Pilih kunci berdasarkan entitas yang urutannya penting: id pesanan, id pengguna, id perangkat, nomor rekening.

⚠️ Menambah partisi merusak pemetaan kunci

Karena partisi ditentukan modulo jumlah partisi, menaikkan jumlah partisi dari 6 ke 12 membuat kunci yang sama mendarat di partisi berbeda. Pesan lama tetap di tempatnya, pesan baru pindah — sehingga jaminan urutan per kunci putus di titik perubahan. Kafka juga tidak mendukung pengurangan jumlah partisi sama sekali. Rencanakan jumlah partisi sejak awal dengan kelonggaran.

Berapa Partisi yang Tepat?

PertimbanganArah
Konsumen aktif maksimum dalam satu grupTidak boleh melebihi jumlah partisi — kelebihan konsumen akan menganggur
Throughput targetUkur throughput satu partisi, lalu bagi target dengan angka itu
Waktu pemulihan saat broker matiTerlalu banyak partisi memperlambat failover dan membebani controller
Beban berkas dan memori brokerTiap partisi memakan file handle dan buffer

Titik awal yang wajar untuk topik dengan lalu lintas sedang: 6–12 partisi. Puluhan ribu partisi dalam satu klaster masih mungkin pada KRaft, tetapi bukan sesuatu yang perlu dikejar.

Replikasi dan ISR

Tiap partisi punya satu leader dan beberapa follower. Semua penulisan dan pembacaan default melalui leader; follower menyalin data secara asinkron.

Partisi 0, replication.factor = 3
  broker-1: LEADER
  broker-2: follower  ← sinkron, masuk ISR
  broker-3: follower  ← tertinggal jauh, DIKELUARKAN dari ISR

ISR = In-Sync Replicas = replika yang cukup mengejar leader

Kombinasi tiga setelan menentukan daya tahan data:

SetelanNilai produksiAkibat
replication.factor3Tahan kehilangan 1 broker tanpa kehilangan data
min.insync.replicas2Penulisan ditolak bila replika sinkron kurang dari 2
acks (produser)allCommit dianggap sukses setelah semua ISR menerima
🚫 replication.factor 3 saja tidak cukup

Bila min.insync.replicas dibiarkan 1, klaster tetap menerima tulisan meski hanya leader yang hidup. Ketika leader itu kemudian mati, data yang belum tersalin hilang permanen. Tiga replika tanpa min.insync.replicas=2 memberi rasa aman yang palsu.

Sebaliknya, replication.factor=3 dengan min.insync.replicas=3 berarti satu broker mati saja membuat topik berhenti menerima tulisan. Kombinasi 3 dan 2 adalah keseimbangan yang benar.

🚫 unclean.leader.election.enable

Bila diaktifkan, replika yang tertinggal boleh diangkat menjadi leader saat tidak ada ISR yang tersedia. Klaster tetap melayani, tetapi pesan yang sudah di-commit bisa lenyap. Default modern adalah false, dan sebaiknya tetap begitu untuk data yang penting.