Procesamiento de datos
Este artículo proporciona una descripción detallada de la implementación de la inserción de datos, la creación de índices y la consulta de datos en Milvus.
Inserción de datos
Puede especificar un número de fragmentos para cada colección en Milvus, cada fragmento corresponde a un canal virtual(vchannel). Como muestra la siguiente figura, Milvus asigna a cada vchannel del log broker un canal físico(pchannel). Cualquier solicitud entrante de inserción/eliminación se dirige a los fragmentos basándose en el valor hash de la clave primaria.
La validación de las solicitudes DML se traslada al proxy porque Milvus no tiene transacciones complicadas. El proxy solicitaría una marca de tiempo para cada solicitud de inserción/borrado a TSO (Timestamp Oracle), que es el módulo de tiempo que se coloca con el coordinador raíz. Las marcas de tiempo se utilizan para determinar la secuencia de las solicitudes de datos que se procesan, ya que la marca de tiempo más antigua se sobrescribe con la más reciente. El proxy recupera la información por lotes desde el coordinador de datos, incluidos los segmentos de las entidades y las claves primarias, para aumentar el rendimiento global y evitar sobrecargar el nodo central.
Canales 1
Tanto las operaciones DML (lenguaje de manipulación de datos) como las operaciones DDL (lenguaje de definición de datos) se escriben en la secuencia de registro, pero a las operaciones DDL sólo se les asigna un canal debido a su baja frecuencia de aparición.
Canales 2
Los vcanales se mantienen en los nodos del corredor de registro subyacente. Cada canal es físicamente indivisible y está disponible para cualquier nodo, pero sólo para uno. Cuando la tasa de ingestión de datos alcanza el cuello de botella, hay que tener en cuenta dos cosas: Si el nodo log broker está sobrecargado y necesita ser escalado, y si hay suficientes shards para asegurar el balance de carga para cada nodo.
Secuencia de escritura de registros
El diagrama anterior resume los cuatro componentes que intervienen en el proceso de escritura de la secuencia de registros: proxy, corredor de registros, nodo de datos y almacenamiento de objetos. El proceso implica cuatro tareas: validación de las solicitudes DML, publicación-suscripción de la secuencia de registro, conversión de registro de flujo a instantáneas de registro y persistencia de las instantáneas de registro. Las cuatro tareas están desacopladas entre sí para garantizar que cada una de ellas sea gestionada por su tipo de nodo correspondiente. Los nodos del mismo tipo son iguales y pueden escalarse de forma elástica e independiente para acomodar distintas cargas de datos, en particular datos de flujo masivo y muy fluctuantes.
Creación de índices
La creación de índices la realiza el nodo de índices. Para evitar la creación frecuente de índices para las actualizaciones de datos, una colección en Milvus se divide en segmentos, cada uno con su propio índice.
Creación de índices
Milvus permite crear índices para cada campo vectorial, campo escalar y campo primario. Tanto la entrada como la salida de la creación de índices se relacionan con el almacenamiento de objetos: El nodo de índice carga las instantáneas de registro a indexar desde un segmento (que está en el almacenamiento de objetos) a la memoria, deserializa los datos y metadatos correspondientes para construir el índice, serializa el índice cuando se completa la construcción del índice y lo vuelve a escribir en el almacenamiento de objetos.
La creación de índices implica principalmente operaciones vectoriales y matriciales, por lo que requiere muchos cálculos y memoria. Los vectores no pueden indexarse eficientemente con índices tradicionales basados en árboles debido a su naturaleza altamente dimensional, pero pueden indexarse con técnicas más maduras en este tema, como los índices basados en clusters o grafos. Independientemente de su tipo, la construcción de índices implica cálculos iterativos masivos para vectores a gran escala, como Kmeans o graph traverse.
A diferencia de la indexación de datos escalares, la creación de índices vectoriales debe aprovechar al máximo la aceleración SIMD (instrucción única, datos múltiples). Milvus tiene soporte innato para conjuntos de instrucciones SIMD, por ejemplo, SSE, AVX2 y AVX512. Dado el "hipo" y la naturaleza intensiva en recursos de la creación de índices vectoriales, la elasticidad adquiere una importancia crucial para Milvus en términos económicos. Las futuras versiones de Milvus profundizarán en la computación heterogénea y la computación sin servidor para reducir los costes asociados.
Además, Milvus también admite el filtrado escalar y la consulta de campos primarios. Tiene índices incorporados para mejorar la eficiencia de la consulta, por ejemplo, índices de filtro Bloom, índices hash, índices basados en árboles e índices invertidos, y planea introducir más índices externos, por ejemplo, índices de mapa de bits e índices aproximados.
Consulta de datos
Por consulta de datos se entiende el proceso de buscar en una colección determinada el número k de vectores más cercanos a un vector objetivo o todos los vectores que se encuentren dentro de un rango de distancia especificado con respecto al vector. Los vectores se devuelven junto con su clave primaria y sus campos correspondientes.
Consulta de datos
Una colección en Milvus se divide en múltiples segmentos, y los nodos de consulta cargan índices por segmento. Cuando llega una solicitud de búsqueda, se transmite a todos los nodos de consulta para realizar una búsqueda simultánea. A continuación, cada nodo poda los segmentos locales, busca los vectores que cumplen los criterios y reduce y devuelve los resultados de la búsqueda.
Los nodos de consulta son independientes entre sí en una consulta de datos. Cada nodo es responsable únicamente de dos tareas: Cargar o liberar segmentos siguiendo las instrucciones de la coordenada de consulta; realizar una búsqueda dentro de los segmentos locales. Y el proxy es responsable de reducir los resultados de búsqueda de cada nodo de consulta y devolver los resultados finales al cliente.
Traspaso
Existen dos tipos de segmentos: segmentos crecientes (para datos incrementales) y segmentos sellados (para datos históricos). Los nodos de consulta se suscriben a vchannel para recibir actualizaciones recientes (datos incrementales) como segmentos crecientes. Cuando un segmento creciente alcanza un umbral predefinido, el coordinador de datos lo sella y comienza la construcción del índice. A continuación, una operación de transferencia iniciada por el coordinador de consultas convierte los datos incrementales en datos históricos. El coordinador de consultas distribuirá los segmentos sellados de forma uniforme entre todos los nodos de consulta en función del uso de memoria, la sobrecarga de la CPU y el número de segmentos.
A continuación
- Aprenda a utilizar la base de datos vectorial Milvus para realizar consultas en tiempo real.
- Conozca la inserción y persistencia de datos en Milvus.
- Aprenda cómo se procesan los datos en Milvus.