Membangun Database Sendiri
(nan.fyi)- Menjelaskan prinsip dasar dan proses implementasi database key-value
- Dimulai dari penyimpanan dan pencarian persisten melalui sistem berkas
- Muncul masalah ketidakefisienan saat operasi tambah, ubah, dan hapus data
- Berkembang secara bertahap menjadi struktur yang lebih efisien seperti append-only file, index, pengurutan, segmen kompaksi (compaction), dan lain-lain
- Berkaitan dengan struktur modern seperti LSM Tree yang dipakai di sistem skala besar
Pengantar: Memulai Database Sendiri
Jika kita menganggap tidak ada konsep database, maka kita mengeksplorasi langkah demi langkah bagaimana membangun database sendiri. Meninjau proses implementasi bentuk database key-value yang paling sederhana
Ide Dasar: Penyimpanan yang Persisten Menggunakan File
- Tujuan database adalah menyimpan data secara persisten dan kemudian mencari secara efisien di kemudian hari
- Cara paling umum adalah menuliskan setiap pasangan key-value ke file dengan memakai file system
- Saat menyimpan data, misalnya, isi file ditambahkan dengan format seperti
$ db set 1 "Lorem ipsum" - Untuk mencari data, gunakan cara memeriksa secara berurutan semua pasangan key-value di file untuk menemukan key yang diinginkan
- Saat perubahan dilakukan, nilai key tersebut diganti langsung di file, dan saat penghapusan dilakukan, record itu dihapus dari file
Permasalahan: Modifikasi In-Place yang Tidak Efisien
- Modifikasi dan penghapusan langsung di file sangat tidak efisien
- Karena file hanyalah aliran byte, bila data di tengah diubah, semua data setelahnya harus dipindahkan
- Misalnya, saat mengganti suatu record dengan nilai baru yang panjangnya berbeda, beban pemindahan seluruh isi setelahnya muncul
- Semakin banyak data, semakin besar dampaknya terhadap kecepatan dan efisiensi
Peningkatan 1: Struktur Append-Only File
- Terapkan metode menyimpan semua perubahan dengan tetap membiarkan data lama ada, yaitu hanya menambahkan catatan baru di akhir file saat melakukan perubahan atau penghapusan
- Setiap kali data berubah, tambahkan record baru dan ubah algoritma agar mencari key versi terbaru
- Penghapusan ditandai dengan nilai khusus "tombstone" (seperti null)
- Kelebihan: pencatatan dapat dilakukan secara efisien tanpa memindahkan data yang sudah ada
- Kekurangan: file makin membesar karena data duplikat dan penanda penghapusan
- Kecepatan pencarian tetap lambat karena tetap membutuhkan pemindaian menyeluruh
Peningkatan 2: Pengaturan Ukuran File dan Compaction
- Untuk mengatasi masalah file yang terus membesar, saat file melebihi ukuran tertentu, pindah ke file baru (segment) dan hapus data yang tidak perlu (duplikat/terhapus) dari file lama agar ukurannya berkurang (compaction)
- Saat compaction, pertahankan hanya data yang benar-benar dibutuhkan dan hapus catatan lama atau penanda penghapusan yang sudah tidak relevan
- Struktur berkembang menjadi beberapa file segment yang dapat digabung (merge) bila diperlukan
Peningkatan 3: Pencarian Cepat Melalui Index
- Buat in-memory hash table index yang menyimpan offset posisi file untuk setiap key agar pencarian menjadi lebih cepat
- Saat query, indeks diperiksa lebih dulu lalu langsung membaca lokasi file yang sesuai
- trade-off: pencarian cepat, tetapi karena indeks ada di memori, jika jumlah key sangat banyak akan terkena batas memori
- Karena pengelolaan indeks, kinerja tulis sedikit menurun
Peningkatan 4: Sorted String Tables dan Sparse Index
- Jika data selalu disimpan dalam urutan key, query rentang (range query) bisa menjadi sangat efisien
- Dengan keadaan terurut, indeks tidak perlu menyimpan semua key, cukup menyimpan sebagian key (sparse index)
- Densitas indeks dapat diatur untuk menyeimbangkan konsumsi memori dan efisiensi pencarian
Cara Implementasi: Kombinasi In-Memory dan On-Disk untuk Ketahanan Persitenan
- Data baru pertama-tama ditulis ke daftar in-memory yang terurut, dan juga dicatat ke file append-only sebagai bentuk backup
- Ketika daftar in-memory membesar, data tersebut disimpan ke file di disk (SST) dalam keadaan terurut, sambil memperbarui indeks
- Saat membaca, sistem memeriksa memori terlebih dahulu, jika tidak ada maka mencari di disk menggunakan indeks
- File di disk dikelola sebagai immutable, sehingga modifikasi/penghapusan tetap ditangani dengan menambahkan data baru
- Data yang berlebihan, duplikat, atau terhapus dibersihkan secara berkala lewat compaction agar ukuran file terjaga
Kemunculan LSM Tree (Log-Structured Merge Tree)
- Struktur yang berkembang ini saat ini banyak digunakan dengan nama LSM Tree
- Kombinasi memtable in-memory dan file on-disk sorted string table (SST) ini cepat dan cocok untuk skala besar
- LevelDB, Amazon DynamoDB, dan sistem key-value skala besar lain menjadikan ini sebagai struktur data inti
- Meski ada kekurangan dan perbedaan dari struktur lain (misalnya DB relasional berbasis B-Tree), performanya terbukti handal untuk beban trafik tinggi dan skalabilitas besar
Kesimpulan
- Dimulai dari file-based sederhana lalu berkembang melalui append-only, index, pengurutan, segment-compaction, dan kombinasi in-memory-on-disk menjadi desain database yang lebih baik
- Memungkinkan mempelajari cara kerja dan pertimbangan struktural database melalui proses implementasi langsung
- Struktur LSM Tree berperan sebagai komponen standar pada sistem data berskala besar modern
- Masih ada ruang untuk mengeksplorasi pendekatan lain, termasuk struktur B-Tree pada basis data relasional di masa depan
1 komentar
Komentar Hacker News