Episode ini membahas log compaction: cleanup policy compact yang menyimpan nilai terbaru per key, tombstone untuk penghapusan, parameter kompaksi seperti min.compaction.lag.ms dan min.cleanable.dirty.ratio, hingga use case changelog topic, materialized views, dan state store.

Pada episode 4 kalian sudah mengenal cleanup policy compact sekilas. Sekarang kita bedah secara utuh. Log compaction adalah mekanisme Kafka untuk membersihkan log dengan cara yang berbeda dari retention delete: alih-alih membuang data berdasarkan umur, kompaksi membuang semua versi lama dari sebuah key dan hanya mempertahankan nilai terbaru.
Kenapa ini penting? Bayangkan topic user-profiles: setiap update profil menulis record baru dengan key user_id. Seiring waktu, mayoritas data di log adalah versi lama yang tidak lagi relevan. Dengan kompaksi, Kafka meringkas log menjadi satu nilai terbaru per user — tanpa kehilangan informasi terkini.
Episode 10 ini akan membahas konsep kompaksi dengan tombstone, parameter konfigurasi yang mengendalikan perilakunya, use case di dunia nyata seperti changelog topic dan materialized views, serta cara memantau kesehatan kompaksi.
Dengan cleanup.policy=compact, broker tidak menghapus record berdasarkan waktu, melainkan menjaga log sedemikian rupa sehingga untuk setiap key hanya nilai terbaru yang tersimpan. Record dengan key yang sama yang lebih tua dibuang oleh proses background bernama cleaner.
Kompaksi mempertahankan satu snapshot per key sambil tetap menyimpan record dengan key unik selama retention masih berlaku. Akibatnya, jumlah data dalam topic compact terus mendekati jumlah key, bukan jumlah tulis.
Bagaimana cara menghapus sebuah key sepenuhnya? Jawabannya adalah tombstone: record dengan key tertentu dan value null. Cleaner menganggap tombstone sebagai penanda "hapus key ini" dan membuang key tersebut dari log beserta semua versi sebelumnya.
Sebelum : (k1,v1) (k1,v2) (k2,v1) (k1,v3) (k2,v2) (k2,null)
Sesudah : (k1,v3) (k2,null)Tombstone sendiri tidak langsung hilang; ia ditahan selama delete.retention.ms sebelum akhirnya dihapus juga. Ini memberi konsumen waktu untuk menangkap peristiwa penghapusan.
Perhatikan nuansa penting: kompaksi bukan jaminan waktu nyata. Record di segmen aktif yang masih terbuka tidak bisa dikompaksi. Kompaksi baru bekerja pada segmen yang sudah tertutup dan cukup "kotor" (mengandung banyak versi usang), sehingga data terbaru selalu utuh selama segmen aktif masih menerima tulis.
Konfigurasi kompaksi diatur lewat kafka-configs.sh per topic:
bin/kafka-configs.sh --bootstrap-server localhost:9092 \
--alter --entity-type topics --entity-name user-profiles \
--add-config cleanup.policy=compact,min.compaction.lag.ms=60000,min.cleanable.dirty.ratio=0.5Parameter kunci yang perlu kalian pahami:
cleanup.policy=compact
min.compaction.lag.ms=60000
max.compaction.lag.ms=300000
delete.retention.ms=86400000
min.cleanable.dirty.ratio=0.5Aturan praktis: min.cleanable.dirty.ratio rendah membuat kompaksi lebih sering (lebih banyak CPU) tapi log lebih ringkas; nilai tinggi menghemat CPU namun log membengkak lebih lama. Kombinasi min.compaction.lag.ms dan delete.retention.ms wajib direncanakan agar konsumen lambat tidak kehilangan data.
Kafka Streams menyimpan state di dalam state store dan mereplikasikannya lewat changelog topic yang ber-cleanup.policy=compact. Karena hanya nilai terbaru per key yang dibutuhkan untuk pemulihan state, kompaksi membuat changelog tetap kecil. Materialized view yang dibangun dari compact topic otomatis merepresentasikan state terkini.
RocksDB dan state store lainnya memakai changelog compact untuk recovery: ketika instance crash, ia membaca changelog dari posisi terakhir checkpoint. Tanpa kompaksi, recovery harus membaca seluruh sejarah; dengan kompaksi, hanya snapshot terakhir per key.
Pola Change Data Capture (episode 27) sering menulis perubahan database ke topic compact. Satu compact topic accounts merepresentasikan tabel terbaru di database: setiap key adalah primary key, dan nilai terbaru adalah state terkini baris tersebut. Data warehouse bisa dibangun ulang dengan membaca snapshot lengkap kapan pun.
Broker mengekspos metrik untuk proses cleaner melalui JMX:
Kompaksi dikatakan lag ketika ada segmen tua yang tidak kunjung dibersihkan, biasanya karena max.compaction.lag.ms terlalu besar atau cleaner kekurangan thread. Pantau dua hal: jumlah segmen yang melebihi max.compaction.lag.ms, dan dirty ratio yang terus naik. Keduanya menandakan cleaner tidak mampu mengejar laju tulis.
bin/kafka-run-class.sh kafka.tools.JmxTool --object-name kafka.log:type=LogCleaner,name=clean-time-percent --report-format=txtkafka.tools.JmxTool adalah alat bawaan untuk membacakan metrik JMX dari terminal. Dalam praktik produksi, metrik ini lebih sering dikumpulkan ke Prometheus (detail di episode 22).
Info
Kompaksi bukan penghapusan berdasarkan waktu. Kalian tetap butuh retention delete untuk membatasi umur data secara keseluruhan, dan kompaksi untuk meringkas nilai per key. Kombinasi cleanup.policy=compact,delete memakai keduanya sekaligus.
Di episode 10 ini kalian sudah memahami bahwa log compaction meringkas log menjadi nilai terbaru per key, cara tombstone menghapus key, parameter konfigurasi seperti min.compaction.lag.ms, max.compaction.lag.ms, delete.retention.ms, dan min.cleanable.dirty.ratio, serta use case changelog topic, materialized views, state store, dan CDC.
Inti yang harus dibawa pulang:
compact,delete menggabungkan ringkasan per key dengan batasan umur data.Di episode 11 selanjutnya kita akan membahas tiered storage (KIP-405) — kemampuan Kafka meng-offload segmen lama ke object storage seperti S3, GCS, dan Azure Blob. Kalian akan belajar konfigurasi remote storage, perbedaan retention lokal dan remote, serta trade-off biaya penyimpanan versus latensi baca.