Kafka Topic Advanced: Segments and Indexes
Kafka Topic Internals: Segments and Indexes
Apache Kafka adalah platform streaming data yang dirancang untuk menangani data dalam skala besar dengan performa tinggi. Salah satu aspek penting dari arsitektur Kafka adalah cara menyimpan dan mengelola data dalam topik, khususnya melalui partisi, segmen, dan indeks. Dalam artikel ini, kita akan menjelajahi secara mendalam bagaimana Kafka menangani penyimpanan data menggunakan segmen dan indeks, struktur direktori penyimpanan, serta pertimbangan konfigurasi untuk mengoptimalkan performa dan mencegah masalah operasional. Memahami internal Kafka ini penting untuk troubleshooting, pengaturan konfigurasi, dan memahami perilaku sistem.
Partisi dan Segmen dalam Topik Kafka
Unit penyimpanan dasar di Kafka adalah replika partisi. Ketika Anda membuat topik, Kafka mengalokasikan partisi secara merata di antara broker yang tersedia dalam klaster untuk memastikan distribusi beban yang seimbang. Setiap partisi dalam topik kemudian dipecah menjadi segmen, yang merupakan unit penyimpanan fisik di disk broker.
Segmen dalam Kafka
Definisi: Segmen adalah file data tunggal di disk yang menyimpan pesan untuk partisi tertentu. Setiap partisi memiliki beberapa segmen, tetapi hanya satu segmen yang aktif pada satu waktu, yaitu segmen tempat data baru ditulis.
Batas Segmen: Kafka menutup segmen aktif dan membuka segmen baru ketika salah satu dari dua batas berikut tercapai:
Ukuran Maksimum: Dikonfigurasi oleh parameter
log.segment.bytes
(default: 1 GB).Waktu Maksimum: Dikonfigurasi oleh parameter
log.segment.ms
(default: 1 minggu, atau 604800000 milidetik).
Proses Penulisan: Ketika broker menerima data untuk partisi, data tersebut ditambahkan ke segmen aktif. Setelah segmen mencapai batas ukuran atau waktu, segmen ditutup, dan segmen baru dibuka.
Penghapusan Segmen: Segmen hanya dapat dihapus setelah ditutup. Segmen aktif tidak dapat dihapus karena sedang digunakan untuk penulisan.
Struktur Penyimpanan
Kafka menyimpan semua data topik dalam direktori yang ditentukan oleh properti log.dirs
dalam file konfigurasi broker (server.properties
). Contoh konfigurasi:
log.dirs=/tmp/kafka-logs
Di dalam direktori ini, Kafka membuat subdirektori untuk setiap partisi topik, dengan nama format nama-topik-nomor-partisi
. Misalnya, untuk topik bernama configured-topic
dengan tiga partisi, struktur direktori akan terlihat seperti:
/tmp/kafka-logs/
βββ configured-topic-0/
βββ configured-topic-1/
βββ configured-topic-2/
Setiap direktori partisi berisi file-file segmen dan indeks yang terkait.
Indeks dalam Kafka
Untuk mendukung akses data yang efisien, Kafka memelihara dua jenis indeks untuk setiap segmen dalam partisi:
Indeks Offset ke Posisi (
*.index
):Mencatat pemetaan antara offset pesan dan posisi fisiknya dalam file segmen.
Membantu Kafka menemukan pesan dengan offset tertentu secara cepat tanpa harus memindai seluruh file segmen.
Indeks Timestamp ke Offset (
*.timeindex
):Mencatat pemetaan antara timestamp pesan dan offset-nya.
Memungkinkan Kafka menemukan pesan berdasarkan waktu tertentu, yang berguna untuk konsumer yang memulai pembacaan dari timestamp tertentu.
Contoh Struktur Direktori Partisi
Jika Anda menjelajahi direktori partisi (misalnya, configured-topic-0
), Anda akan menemukan file seperti berikut:
configured-topic-0/
βββ 00000000000000000000.index
βββ 00000000000000000000.log
βββ 00000000000000000000.timeindex
βββ 00000000000000010000.index
βββ 00000000000000010000.log
βββ 00000000000000010000.timeindex
File
*.log
: File segmen yang menyimpan pesan aktual.File
*.index
: Indeks offset ke posisi untuk segmen tersebut.File
*.timeindex
: Indeks timestamp ke offset untuk segmen tersebut.
Nama file segmen didasarkan pada offset pertama dalam segmen tersebut. Misalnya, 00000000000000010000.log
berisi pesan mulai dari offset 10000.
Pertimbangan Konfigurasi Segmen
Konfigurasi segmen sangat memengaruhi performa, penggunaan disk, dan efisiensi operasional Kafka. Dua parameter utama yang mengontrol segmen adalah:
log.segment.bytes
Deskripsi: Menentukan ukuran maksimum file segmen dalam byte. Default adalah 1 GB (1073741824 byte).
Dampak:
Ukuran Kecil: Segmen yang lebih kecil berarti file lebih sering ditutup dan dibuka, yang dapat mengurangi efisiensi penulisan disk karena overhead alokasi file baru.
Ukuran Besar: Segmen yang lebih besar mengurangi frekuensi pembukaan file baru, tetapi dapat meningkatkan waktu pemrosesan saat pembersihan log atau pemadatan (compaction).
Pertimbangan: Untuk topik dengan tingkat produksi rendah, ukuran segmen yang kecil dapat menyebabkan terlalu banyak file terbuka, yang berpotensi memicu kesalahan "Too many open files" pada sistem operasi. Pastikan batas file terbuka di OS (misalnya,
ulimit
di Linux) dikonfigurasi dengan benar.
Contoh Pengaturan pada Level Topik:
kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type topics --entity-name configured-topic --add-config log.segment.bytes=536870912
(Mengatur ukuran segmen menjadi 512 MB)
log.segment.ms
Deskripsi: Menentukan waktu maksimum (dalam milidetik) sebelum segmen ditutup, meskipun belum mencapai batas ukuran. Default adalah 1 minggu (604800000 ms).
Dampak:
Waktu Pendek: Menutup segmen berdasarkan waktu yang lebih singkat (misalnya, harian) dapat membantu manajemen log, tetapi jika banyak segmen ditutup secara bersamaan, ini dapat memengaruhi performa disk.
Waktu Panjang: Segmen tetap terbuka lebih lama, yang dapat mengurangi overhead penutupan file, tetapi memperlambat pembersihan log untuk topik dengan tingkat produksi rendah.
Pertimbangan: Untuk topik dengan lalu lintas rendah, pertimbangkan untuk menggunakan waktu yang lebih pendek (misalnya, harian: 86400000 ms) untuk memastikan segmen ditutup secara teratur.
Contoh Pengaturan pada Level Topik:
kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type topics --entity-name configured-topic --add-config log.segment.ms=86400000
(Mengatur penutupan segmen setiap hari)
Catatan Penting
File Handle Terbuka: Kafka memelihara file handle terbuka untuk setiap segmen (aktif dan tidak aktif) di setiap partisi. Dengan banyak partisi dan segmen, jumlah file handle bisa sangat besar. Pastikan sistem operasi dikonfigurasi untuk mendukung jumlah file handle yang tinggi (misalnya, atur
ulimit -n 65535
di Linux).Pembersihan Log: Segmen yang sudah ditutup dapat dihapus berdasarkan kebijakan retensi (
retention.ms
atauretention.bytes
) atau dipadatkan jikacleanup.policy=compact
. Segmen aktif tidak akan dihapus.Performa Disk: Penutupan segmen massal (misalnya, karena
log.segment.ms
pendek di banyak partisi) dapat menyebabkan lonjakan aktivitas disk, yang perlu dipertimbangkan dalam lingkungan dengan beban tinggi.
Struktur Direktori Kafka
Kafka menyimpan data dan indeksnya dalam direktori yang ditentukan oleh log.dirs
. Struktur ini dirancang untuk efisiensi dan skalabilitas:
Direktori Partisi: Setiap partisi topik memiliki direktori sendiri (misalnya,
configured-topic-0
).File Segmen dan Indeks: Setiap direktori partisi berisi pasangan file segmen (
.log
), indeks offset (.index
), dan indeks timestamp (.timeindex
).Manajemen Penyimpanan: Kafka mengelola penyimpanan secara otomatis, menutup segmen lama dan membuka segmen baru berdasarkan konfigurasi
log.segment.bytes
danlog.segment.ms
.
Contoh Perintah untuk Memeriksa Struktur Direktori
Untuk memeriksa direktori log Kafka:
ls -l /tmp/kafka-logs/
Untuk memeriksa isi direktori partisi tertentu:
ls -l /tmp/kafka-logs/configured-topic-0/
Praktik Terbaik untuk Konfigurasi Segmen
Sesuaikan Ukuran Segmen dengan Tingkat Produksi:
Untuk topik dengan tingkat produksi tinggi, gunakan
log.segment.bytes
default (1 GB) atau lebih besar untuk mengurangi overhead penutupan file.Untuk topik dengan tingkat produksi rendah, kurangi
log.segment.bytes
(misalnya, 100 MB) untuk mencegah segmen tetap terbuka terlalu lama.
Gunakan Waktu Penutupan yang Wajar:
Untuk topik dengan lalu lintas rendah, atur
log.segment.ms
ke nilai yang lebih kecil (misalnya, 1 hari: 86400000 ms) untuk memastikan segmen ditutup secara teratur.Hindari penutupan segmen massal dengan memastikan waktu penutupan tidak sinkron untuk semua partisi.
Konfigurasi Batas File Terbuka:
Periksa dan tingkatkan batas file handle di sistem operasi (misalnya,
ulimit -n
) untuk mendukung banyak segmen dan partisi.Pantau metrik seperti jumlah file handle terbuka menggunakan alat seperti JMX.
Gunakan Konfigurasi Dinamis:
Gunakan
kafka-configs.sh
untuk mengubahlog.segment.bytes
ataulog.segment.ms
pada level topik tanpa restart broker:kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type topics --entity-name configured-topic --add-config log.segment.bytes=536870912
Pantau Penyimpanan Disk:
Pastikan direktori
log.dirs
memiliki cukup ruang disk untuk menampung segmen dan indeks.Gunakan kebijakan retensi (
retention.ms
atauretention.bytes
) untuk mengelola ukuran log agar tidak memenuhi disk.
Uji di Lingkungan Non-Produksi:
Uji perubahan konfigurasi segmen di lingkungan pengujian untuk memahami dampaknya pada performa disk dan manajemen file handle.
Penjelasan Tambahan
Dampak pada Konsumer
Indeks offset dan timestamp memungkinkan konsumer mengakses pesan dengan cepat berdasarkan offset atau waktu. Misalnya:
Konsumer dapat memulai pembacaan dari offset tertentu menggunakan
seek()
atau dari timestamp tertentu menggunakanoffsetsForTimes()
.Indeks mengurangi latensi pencarian karena Kafka tidak perlu memindai seluruh file segmen.
Mode KRaft
Dalam mode KRaft (Kafka tanpa Zookeeper, mulai versi 3.3), manajemen segmen dan indeks tetap sama, tetapi metadata partisi dikelola oleh controller Kafka, bukan Zookeeper. Ini membuat operasi lebih efisien, tetapi konfigurasi log.segment.bytes
dan log.segment.ms
tetap relevan.
Pemecahan Masalah
Jika Anda mengalami masalah seperti "Too many open files":
Periksa jumlah file handle terbuka:
lsof -p <pid_broker> | wc -l
Tingkatkan batas file handle di sistem operasi:
ulimit -n 65535
Kurangi
log.segment.bytes
untuk topik dengan tingkat produksi rendah untuk mengurangi jumlah segmen aktif.
Kesimpulan
Segmen dan indeks adalah komponen inti dari penyimpanan topik Kafka, memungkinkan efisiensi dalam penulisan, pembacaan, dan manajemen data. Dengan memahami cara Kafka membagi partisi menjadi segmen dan menggunakan indeks offset serta timestamp, Anda dapat mengoptimalkan performa klaster dengan mengatur parameter seperti log.segment.bytes
dan log.segment.ms
. Struktur direktori log.dirs
memberikan wawasan tentang organisasi data, sementara praktik terbaik seperti menyesuaikan ukuran segmen, memantau file handle, dan menggunakan konfigurasi dinamis membantu menjaga keandalan dan efisiensi sistem.
Last updated