Setiap kumpulan data dibagi menjadi segmen. Setiap segmen memiliki penyimpanan vektor independen, penyimpanan payload, dan indeks.
Data dalam segmen biasanya tidak tumpang tindih. Namun, menyimpan titik yang sama dalam segmen yang berbeda tidak menyebabkan masalah karena pencarian mengandung mekanisme penghapusan duplikasi.
Segmen termasuk penyimpanan vektor, penyimpanan payload, indeks vektor, indeks payload, dan pemeta ID untuk menyimpan hubungan antara ID internal dan eksternal.
Segmen dapat "dipendatang" atau "tidak dapat dipendatang" tergantung pada jenis penyimpanan dan indeks yang digunakan. Anda dapat dengan bebas menambah, menghapus, dan meminta data dalam segmen "dapat dipendatang", sementara segmen "tidak dapat dipendatang" hanya dapat membaca dan menghapus data.
Konfigurasi segmen dalam sebuah koleksi dapat berbeda dan independen satu sama lain, tetapi setidaknya satu segmen "dapat dipendatang" diperlukan.
Penyimpanan Vektor
Tergantung pada kebutuhan aplikasi, Qdrant dapat menggunakan salah satu opsi penyimpanan data berikut. Pilihan harus seimbang antara kecepatan pencarian dan penggunaan RAM.
Penyimpanan Memori - Menyimpan semua vektor di RAM, memberikan kecepatan tertinggi karena akses ke disk hanya diperlukan selama persistensi.
Penyimpanan Memmap - Membuat ruang alamat virtual yang terkait dengan file di disk. File yang dipetakan tidak dimuat langsung ke dalam RAM tetapi diakses menggunakan caching halaman. Pendekatan ini memungkinkan penggunaan memori yang fleksibel. Dengan cukup RAM, kecepatannya hampir sama cepatnya dengan penyimpanan memori.
Mengkonfigurasi Penyimpanan Memmap
Ada dua cara untuk mengkonfigurasi penggunaan memmap (juga dikenal sebagai penyimpanan di-disk):
- Tetapkan opsi
on_disk
untuk vektor dalam API pembuatan koleksi:
Hanya berlaku untuk v1.2.0 dan lebih tinggi
PUT /collections/{collection_name}
{
"vectors": {
"size": 768,
"distance": "Cosine",
"on_disk": true
}
}
Ini akan membuat sebuah koleksi yang langsung menyimpan semua vektor dalam penyimpanan memmap. Ini adalah pendekatan yang disarankan ketika instansi Qdrant menggunakan disk cepat dan perlu menangani koleksi yang besar.
- Tetapkan opsi
memmap_threshold_kb
. Opsi ini menetapkan ambang batas untuk mengonversi segmen ke penyimpanan memmap.
Ada dua cara untuk mengimplementasikan ini:
- Tetapkan ambang batas secara global dalam file konfigurasi. Nama parameter tersebut adalah
memmap_threshold_kb
. - Tetapkan ambang batas secara individual untuk setiap koleksi selama pembuatan atau pembaruan.
PUT /collections/{collection_name}
{
"vectors": {
"size": 768,
"distance": "Cosine"
},
"optimizers_config": {
"memmap_threshold": 20000
}
}
Aturan praktis untuk menetapkan parameter ambang batas memmap adalah sederhana:
- Jika skenario penggunaan seimbang – tetapkan ambang batas memmap sama dengan
indexing_threshold
(default adalah 20000). Dalam hal ini, pengoptimal tidak akan melakukan lari tambahan dan akan mengoptimalkan semua ambang batas sekaligus. - Jika beban tulis tinggi dan RAM rendah – tetapkan ambang batas memmap lebih rendah dari
indexing_threshold
, misalnya, 10000. Dalam hal ini, pengoptimal akan terlebih dahulu mengonversi segmen ke penyimpanan memmap dan kemudian menerapkan indeks.
Selain itu, Anda dapat menggunakan penyimpanan memmap bukan hanya untuk vektor tetapi juga untuk indeks HNSW. Untuk mengaktifkan fitur ini, atur parameter hnsw_config.on_disk
ke true
saat membuat koleksi.
PUT /collections/{collection_name}
{
"vectors": {
"size": 768,
"distance": "Cosine"
},
"optimizers_config": {
"memmap_threshold": 20000
},
"hnsw_config": {
"on_disk": true
}
}
Penyimpanan Payload
Qdrant mendukung dua jenis penyimpanan payload: InMemory dan OnDisk.
Penyimpanan payload InMemory mengatur data payload dengan cara yang sama seperti vektor dalam memori. Data payload dimuat ke dalam memori saat layanan dimulai, sementara disk dan RocksDB digunakan hanya untuk persistensi. Jenis penyimpanan ini sangat cepat namun mungkin memerlukan sejumlah besar ruang memori untuk menyimpan semua data, terutama jika payload mencakup nilai yang besar (seperti ringkasan teks atau bahkan gambar).
Untuk nilai payload yang besar, disarankan untuk menggunakan penyimpanan payload OnDisk. Jenis penyimpanan ini langsung membaca dan menulis payload ke RocksDB, sehingga tidak memerlukan sejumlah besar memori untuk penyimpanan. Namun, sisi negatifnya adalah adanya laten akses. Jika Anda perlu menanyakan vektor berdasarkan kondisi payload, memeriksa nilai yang disimpan di disk mungkin membutuhkan waktu yang terlalu lama. Dalam kasus ini, disarankan untuk membuat indeks payload untuk setiap bidang yang digunakan untuk kondisi penyaringan untuk menghindari akses disk. Setelah indeks bidang dibuat, Qdrant akan selalu menyimpan semua nilai dari bidang yang diindeks dalam memori, terlepas dari jenis penyimpanan payload.
Anda dapat menentukan jenis penyimpanan payload yang diinginkan melalui file konfigurasi atau dengan menggunakan parameter koleksi on_disk_payload
saat membuat koleksi.
Kontrol Versi
Untuk memastikan integritas data, Qdrant melakukan semua perubahan data dalam dua tahap. Pertama, data ditulis ke Write-ahead-log (WAL), yang mengurutkan dan memberikan nomor urut ke semua operasi.
Setelah perubahan ditambahkan ke WAL, mereka tidak hilang bahkan dalam kasus pemadaman listrik. Kemudian, perubahan memasuki segmen. Setiap segmen menyimpan versi terbaru dari perubahan yang diterapkan padanya, serta versi masing-masing titik individu. Jika nomor urut perubahan baru kurang dari versi saat ini dari suatu titik, pengubah akan mengabaikan perubahan tersebut. Mekanisme ini memungkinkan Qdrant untuk secara efisien memulihkan penyimpanan dari WAL dalam kasus pemadaman abnormal.