Her veri koleksiyonu, bölümlere ayrılır. Her bir bölümün bağımsız bir vektör depolama, yük depolama ve indeksi bulunmaktadır.
Bölümlerdeki veriler genellikle birbirleriyle kesişmez. Ancak, aynı noktanın farklı bölümlerde depolanması sorun teşkil etmez çünkü arama, tekrarlayan kayıt mekanizmasını içerir.
Bölümler, vektör depolama, yük depolama, vektör indeksi, yük indeksi ve iç ve dış kimlikler arasındaki ilişkiyi depolamak için bir ID eşlemesi içerir.
Bölümler, depolama ve indeks türüne bağlı olarak "eklenebilir" veya "eklenemez" olabilir. "Eklenebilir" bölümlerde veri ekleyebilir, silebilir ve sorgulayabilirken, "eklenemez" bölümlerde yalnızca veri okunabilir ve silinebilir.
Bir koleksiyondaki bölümlerin yapılandırması farklı olabilir ve birbirinden bağımsızdır, ancak en az bir "eklenebilir" bölüm gereklidir.
Vektör Depolama
Uygulamanın ihtiyaçlarına bağlı olarak, Qdrant şu veri depolama seçeneklerinden birini kullanabilir. Seçim, arama hızı ve RAM kullanımı arasında denge kurmalıdır.
Bellek Depolama - Tüm vektörleri RAM'de depolar ve kalıcılık sırasında yalnızca disk erişimi gerektiğinden en yüksek hızı sağlar.
Memmap Depolama - Diskle ilişkilendirilmiş bir dosya ile sanal bir adres alanı oluşturur. Eşlenmiş dosyalar doğrudan RAM'e yüklenmez, ancak sayfa önbelleğini kullanılarak erişilir. Bu yaklaşım, mevcut belleğin esnek kullanımına izin verir. Yeterli RAM ile hızı neredeyse bellek depolama kadar hızlıdır.
Memmap Depolama Yapılandırma
Memmap'ın (ayrıca disk depolama olarak da bilinir) kullanımını yapılandırmanın iki yolu vardır:
- Koleksiyon oluşturma API'sinde vektörler için
on_disk
seçeneğini ayarlayın:
Sadece v1.2.0 ve üstü için geçerlidir
PUT /collections/{collection_name}
{
"vectors": {
"size": 768,
"distance": "Cosine",
"on_disk": true
}
}
Bu, tüm vektörleri hemen memmap depolamada saklayan bir koleksiyon oluşturacaktır. Qdrant örneği hızlı diskler kullanıyorsa ve büyük koleksiyonları işlemesi gerekiyorsa, bu önerilen yaklaşımdır.
-
memmap_threshold_kb
seçeneğini ayarlayın. Bu seçenek, bölümleri memmap depolamaya dönüştürmek için eşik değerini belirler.
Bu işlemi uygulamanın iki yolu bulunmaktadır:
- Eşik değerini küresel olarak yapılandırma dosyasında ayarlayın. Parametre adı
memmap_threshold_kb
dir. - Her bir koleksiyon için oluşturma veya güncelleme sırasında eşik değerini ayrı ayrı ayarlayın.
PUT /collections/{collection_name}
{
"vectors": {
"size": 768,
"distance": "Cosine"
},
"optimizers_config": {
"memmap_threshold": 20000
}
}
Memmap eşik değeri parametresini ayarlarken kural basittir:
- Eğer kullanım senaryosu dengeli ise –
indexing_threshold
ile aynı eşik değerini (varsayılan 20000) ayarlayın. Bu durumda, optimizer herhangi bir ek çalışma gerçekleştirmeyecek ve tüm eşik değerlerini aynı anda optimize edecektir. - Yazma yükü yüksek ve RAM düşük ise – memmap eşik değerini
indexing_threshold
'dan daha düşük ayarlayın, örneğin 10000. Bu durumda, optimizer önce bölümleri memmap depolamaya dönüştürecektir ve ardından indeksleme uygulayacaktır.
Ayrıca, memmap depolamayı yalnızca vektörler için değil, aynı zamanda HNSW indeksleri için de kullanabilirsiniz. Bu özelliği etkinleştirmek için, koleksiyon oluşturulurken hnsw_config.on_disk
parametresini true
olarak ayarlayın.
PUT /collections/{collection_name}
{
"vectors": {
"size": 768,
"distance": "Cosine"
},
"optimizers_config": {
"memmap_threshold": 20000
},
"hnsw_config": {
"on_disk": true
}
}
Yük Verisi Depolama
Qdrant, İçBellek ve DiskÜzerinde olmak üzere iki tür yük verisi depolamasını destekler.
İçBellek yük veri depolaması, yük verilerini bellekteki vektörlerle aynı şekilde düzenler. Hizmet başladığında yük verileri belleğe yüklenir, disk ve RocksDB sadece kalıcılık için kullanılır. Bu depolama türü çok hızlıdır ancak özellikle yük büyük değerleri içeriyorsa (metin özetleri veya hatta görüntüler gibi) tüm verileri saklamak için geniş miktarda bellek alanı gerekebilir.
Büyük yük değerleri için, DiskÜzerinde yük depolamasını kullanmak tercih edilir. Bu depolama türü, yükü doğrudan RocksDB'ye okur ve yazar, bu nedenle saklama için geniş miktarda bellek gerektirmez. Ancak, erişim gecikmesi dezavantajıdır. Vektörleri yük koşullarına göre sorgulamanız gerekiyorsa, diske saklanan değerleri kontrol etme işlemi çok uzun sürebilir. Bu durumda, diske erişimi önlemek için her bir filtreme koşulu için yük dizini oluşturmanızı öneririz. Alan dizini oluşturulduğunda, Qdrant, dizinlenen alanın tüm değerlerini bellekte tutar, depolama türüne bakılmaksızın.
İstenilen yük depolama türünü yapılandırma dosyası aracılığıyla veya bir koleksiyon oluşturulurken on_disk_payload
koleksiyon parametresini kullanarak belirleyebilirsiniz.
Sürüm Kontrolü
Veri bütünlüğünü sağlamak için, Qdrant tüm veri değişikliklerini iki aşamada gerçekleştirir. İlk olarak, veri Yazma-Öncesi-Günlüğü'ne (WAL) yazılır, bu günlük tüm işlemlere ardışık numaralar atar ve sıralar.
Değişiklikler WAL'a eklenince, güç kesintisi durumunda bile kaybolmaz. Daha sonra, değişiklikler segmente girer. Her segment, üzerinde uygulanan değişikliklerin en son sürümünü ve her bir noktanın sürümünü saklar. Yeni bir değişikliğin ardışık numarası bir noktanın mevcut sürümünden küçükse, güncelleyici o değişikliği yok sayar. Bu mekanizma, Qdrant'ın anormal kapanmalarda depolamayı etkili bir şekilde Yazma-Öncesi-Günlük'ten kurtarmasına izin verir.