Cada colección de datos se divide en segmentos. Cada segmento tiene almacenamiento vectorial independiente, almacenamiento de carga útil e índice.
Generalmente, los datos en los segmentos no se superponen. Sin embargo, almacenar el mismo punto en diferentes segmentos no causa problemas porque la búsqueda contiene un mecanismo de deduplicación.
Los segmentos incluyen almacenamiento vectorial, almacenamiento de carga útil, índice vectorial, índice de carga útil y un mapeador de ID para almacenar la relación entre IDs internos y externos.
Los segmentos pueden ser "apilables" o "no apilables" dependiendo del tipo de almacenamiento e índice utilizados. Se puede añadir, eliminar y consultar datos libremente en los segmentos "apilables", mientras que los segmentos "no apilables" solo pueden leer y eliminar datos.
La configuración de los segmentos en una colección puede ser diferente e independiente entre sí, pero se requiere al menos un segmento "apilable".
Almacenamiento Vectorial
Según las necesidades de la aplicación, Qdrant puede utilizar una de las siguientes opciones de almacenamiento de datos. La elección debe equilibrarse entre la velocidad de búsqueda y el uso de RAM.
Almacenamiento en Memoria - Almacena todos los vectores en RAM, proporcionando la mayor velocidad porque solo se requiere acceso al disco durante la persistencia.
Almacenamiento Memmap - Crea un espacio de direcciones virtuales asociado con un archivo en disco. Los archivos mapeados no se cargan directamente en la RAM, sino que se accede a ellos mediante el almacenamiento en caché de páginas. Este enfoque permite el uso flexible de la memoria disponible. Con suficiente RAM, su velocidad es casi tan rápida como el almacenamiento en memoria.
Configuración del Almacenamiento Memmap
Hay dos formas de configurar el uso de memmap (también conocido como almacenamiento en disco):
- Establecer la opción
on_disk
para vectores en la API de creación de colecciones:
Solo aplicable a v1.2.0 y superior
PUT /collections/{nombre_coleccion}
{
"vectores": {
"tamaño": 768,
"distancia": "Coseno",
"en_disco": true
}
}
Esto creará una colección que almacena inmediatamente todos los vectores en el almacenamiento memmap. Este es el enfoque recomendado cuando la instancia de Qdrant usa discos rápidos y necesita manejar colecciones grandes.
- Establecer la opción
memmap_threshold_kb
. Esta opción define el umbral para convertir los segmentos en almacenamiento memmap.
Hay dos formas de implementar esto:
- Establecer el umbral a nivel global en el archivo de configuración. El nombre del parámetro es
memmap_threshold_kb
. - Establecer el umbral individualmente para cada colección durante la creación o actualización.
PUT /collections/{nombre_coleccion}
{
"vectores": {
"tamaño": 768,
"distancia": "Coseno"
},
"configuracion_optimizadores": {
"umbral_memmap": 20000
}
}
La regla general para establecer el parámetro de umbral de memmap es sencilla:
- Si el escenario de uso es equilibrado, establezca el umbral de memmap igual al
umbral_de_indexación
(el valor predeterminado es 20000). En este caso, el optimizador no realizará ejecuciones adicionales y optimizará todos los umbrales a la vez. - Si la carga de escritura es alta y la RAM es baja, establezca el umbral de memmap por debajo del
umbral_de_indexación
, por ejemplo, 10000. En este caso, el optimizador primero convertirá los segmentos en almacenamiento memmap y luego aplicará la indexación.
Además, se puede utilizar el almacenamiento memmap no solo para vectores, sino también para los índices HNSW. Para habilitar esta función, establezca el parámetro hnsw_config.on_disk
en true
al crear la colección.
PUT /collections/{nombre_coleccion}
{
"vectores": {
"tamaño": 768,
"distancia": "Coseno"
},
"configuracion_optimizadores": {
"umbral_memmap": 20000
},
"configuracion_hnsw": {
"en_disco": true
}
}
Almacenamiento de carga útil
Qdrant admite dos tipos de almacenamiento de carga útil: En memoria y En disco.
El almacenamiento de carga útil en memoria organiza los datos de carga útil de la misma manera que los vectores en memoria. Los datos de carga útil se cargan en la memoria cuando el servicio se inicia, mientras que el disco y RocksDB se utilizan solo para la persistencia. Este tipo de almacenamiento es muy rápido pero puede requerir una gran cantidad de espacio en la memoria para almacenar todos los datos, especialmente si la carga útil incluye valores grandes (como resúmenes de texto o incluso imágenes).
Para valores de carga útil grandes, es preferible utilizar el almacenamiento de carga útil en disco. Este tipo de almacenamiento lee y escribe la carga útil directamente en RocksDB, por lo que no requiere una gran cantidad de memoria para el almacenamiento. Sin embargo, la desventaja es la latencia de acceso. Si necesita consultar vectores basados en condiciones de carga útil, verificar los valores almacenados en el disco puede llevar demasiado tiempo. En este caso, recomendamos crear un índice de carga útil para cada campo utilizado para condiciones de filtrado para evitar el acceso al disco. Una vez que se crea el índice de campo, Qdrant siempre mantendrá todos los valores del campo indexado en la memoria, independientemente del tipo de almacenamiento de carga útil.
Puede especificar el tipo de almacenamiento de carga útil deseado a través del archivo de configuración o mediante el parámetro de colección on_disk_payload
al crear una colección.
Control de versión
Para garantizar la integridad de los datos, Qdrant realiza todos los cambios de datos en dos etapas. Primero, los datos se escriben en el registro de transacciones (WAL), que ordena y asigna números secuenciales a todas las operaciones.
Una vez que los cambios se agregan al WAL, no se pierden incluso en caso de un corte de energía. Luego, los cambios ingresan al segmento. Cada segmento almacena la versión más reciente de los cambios aplicados a él, así como la versión de cada punto individual. Si el número secuencial de un nuevo cambio es menor que la versión actual de un punto, el actualizador ignorará ese cambio. Este mecanismo permite a Qdrant recuperar eficientemente almacenamiento desde el WAL en caso de apagones anormales.