Utilización de la base de datos vectorial Milvus para consultas en tiempo real
Imagen de portada
Este artículo está escrito por Xi Ge y transcreado por Angela Ni.
En el artículo anterior, hemos hablado de la inserción y persistencia de datos en Milvus. En este artículo, continuaremos explicando cómo los diferentes componentes de Milvus interactúan entre sí para completar la consulta de datos en tiempo real.
A continuación se enumeran algunos recursos útiles antes de comenzar. Recomendamos leerlos primero para comprender mejor el tema de este post.
- Profundización en la arquitectura de Milvus
- Modelo de datos Milvus
- El papel y la función de cada componente de Milvus
- Procesamiento de datos en Milvus
- Inserción y persistencia de datos en Milvus
Carga de datos en el nodo de consulta
Antes de ejecutar una consulta, los datos deben cargarse en los nodos de consulta.
Hay dos tipos de datos que se cargan en el nodo de consulta: datos en flujo desde el corredor de registro y datos históricos desde el almacenamiento de objetos (también denominado almacenamiento persistente más adelante).
Diagrama de flujo
El coordinador de datos se encarga de gestionar los datos en flujo que se insertan continuamente en Milvus. Cuando un usuario de Milvus llama a collection.load()
para cargar una colección, el coordinador de consultas consultará al coordinador de datos para saber qué segmentos se han mantenido en el almacenamiento y sus correspondientes puntos de control. Un punto de control es una marca que indica que los segmentos almacenados antes del punto de control se consumen, mientras que los posteriores no.
A continuación, el coordinador de consultas genera una estrategia de asignación basada en la información del coordinador de datos: por segmento o por canal. El asignador de segmentos es responsable de asignar segmentos en el almacenamiento persistente (datos por lotes) a diferentes nodos de consulta. Por ejemplo, en la imagen anterior, el asignador de segmentos asigna los segmentos 1 y 3 (S1, S3) al nodo de consulta 1, y los segmentos 2 y 4 (S2, S4) al nodo de consulta 2. El asignador de canales asigna diferentes nodos de consulta para ver múltiples canales de manipulación de datos (DMChannels) en el log broker. Por ejemplo, en la imagen anterior, el asignador de canales asigna al nodo de consulta 1 el canal 1 (Ch1) y al nodo de consulta 2 el canal 2 (Ch2).
Con la estrategia de asignación, cada nodo de consulta carga los datos del segmento y vigila los canales en consecuencia. En el nodo de consulta 1 de la imagen, los datos históricos (datos por lotes), se cargan a través de los S1 y S3 asignados desde el almacenamiento persistente. Mientras tanto, el nodo de consulta 1 carga datos incrementales (datos en streaming) suscribiéndose al canal 1 en el log broker.
Gestión de datos en el nodo de consulta
Un nodo de consulta necesita gestionar tanto datos históricos como incrementales. Los datos históricos se almacenan en segmentos sellados mientras que los datos incrementales se almacenan en segmentos crecientes.
Gestión de datos históricos
Existen dos consideraciones principales para la gestión de datos históricos: el equilibrio de carga y la conmutación por error del nodo de consulta.
Balance de carga
Por ejemplo, como se muestra en la ilustración, al nodo de consulta 4 se le han asignado más segmentos sellados que al resto de los nodos de consulta. Es muy probable que esto convierta al nodo de consulta 4 en el cuello de botella que ralentice todo el proceso de consulta. Para resolver este problema, el sistema debe asignar varios segmentos del nodo de consulta 4 a otros nodos de consulta. Esto se denomina equilibrio de carga.
Conmutación por error del nodo de consulta
En la imagen anterior se ilustra otra posible situación. Uno de los nodos, el nodo de consulta 4, se cae repentinamente. En este caso, la carga (segmentos asignados al nodo de consulta 4) debe transferirse a otros nodos de consulta en funcionamiento para garantizar la precisión de los resultados de la consulta.
Gestión incremental de datos
El nodo de consulta vigila los DMChannels para recibir datos incrementales. En este proceso se introduce el diagrama de flujo. Primero filtra todos los mensajes de inserción de datos. Esto es para asegurar que sólo se cargan los datos en una partición especificada. Cada colección en Milvus tiene un canal correspondiente, que es compartido por todas las particiones en esa colección. Por lo tanto, se necesita un diagrama de flujo para filtrar los datos insertados si un usuario de Milvus sólo necesita cargar datos en una partición determinada. En caso contrario, los datos de todas las particiones de la colección se cargarán en el nodo de consulta.
Una vez filtrados, los datos incrementales se insertan en segmentos crecientes y se transmiten a los nodos temporales del servidor.
Diagrama de flujo
Durante la inserción de datos, a cada mensaje de inserción se le asigna una marca de tiempo. En el DMChannel de la imagen anterior, los datos se insertan en orden, de izquierda a derecha. La marca de tiempo del primer mensaje de inserción es 1; la del segundo, 2; y la del tercero, 6. El cuarto mensaje marcado en rojo no es un mensaje de inserción, sino un mensaje de marca de tiempo. Esto significa que los datos insertados cuyas marcas de tiempo son menores que esta marca de tiempo ya están en el corredor de registro. En otras palabras, los datos insertados después de este mensaje de marca de tiempo deben tener marcas de tiempo cuyos valores sean mayores que esta marca de tiempo. Por ejemplo, en la imagen anterior, cuando el nodo de consulta percibe que el timetick actual es 5, significa que todos los mensajes de inserción cuyo valor de timestamp es inferior a 5 se cargan en el nodo de consulta.
El nodo de tiempo del servidor proporciona un valor tsafe
actualizado cada vez que recibe un timetick del nodo de inserción. tsafe
significa tiempo de seguridad, y todos los datos insertados antes de este punto de tiempo pueden ser consultados. Por ejemplo, si tsafe
= 9, todos los datos insertados con marcas de tiempo inferiores a 9 pueden consultarse.
Consulta en tiempo real en Milvus
La consulta en tiempo real en Milvus se realiza mediante mensajes de consulta. Los mensajes de consulta se insertan en el log broker mediante un proxy. A continuación, los nodos de consulta obtienen los mensajes de consulta observando el canal de consulta en el corredor de registros.
Mensaje de consulta
Mensaje de consulta
Un mensaje de consulta incluye la siguiente información crucial sobre una consulta:
msgID
: ID de mensaje, el ID del mensaje de consulta asignado por el sistema.collectionID
: El ID de la colección que se va a consultar (si lo especifica el usuario).execPlan
: El plan de ejecución se utiliza principalmente para el filtrado de atributos en una consulta.service_ts
: La fecha y hora del servicio se actualizará junto contsafe
mencionada anteriormente. La marca de tiempo del servicio indica en qué momento se encuentra el servicio. Todos los datos insertados antes deservice_ts
están disponibles para la consulta.travel_ts
: Travel timestamp especifica un rango de tiempo en el pasado. Y la consulta se realizará sobre los datos existentes en el periodo de tiempo especificado portravel_ts
.guarantee_ts
: La marca de tiempo de garantía especifica un periodo de tiempo tras el cual debe realizarse la consulta. La consulta sólo se realizará cuandoservice_ts
>guarantee_ts
.
Consulta en tiempo real
Proceso de consulta
Cuando se recibe un mensaje de consulta, Milvus comprueba en primer lugar si el tiempo de servicio actual, service_ts
, es mayor que la marca de tiempo de garantía, guarantee_ts
, del mensaje de consulta. En caso afirmativo, se ejecuta la consulta. La consulta se realizará en paralelo tanto sobre los datos históricos como sobre los datos incrementales. Dado que puede haber un solapamiento de datos entre los datos históricos y los datos incrementales, se necesita una acción denominada "reducción local" para filtrar los resultados redundantes de la consulta.
Sin embargo, si el tiempo de servicio actual es inferior a la marca de tiempo de garantía en un mensaje de consulta recién insertado, el mensaje de consulta se convertirá en un mensaje no resuelto y esperará a ser procesado hasta que el tiempo de servicio sea superior a la marca de tiempo de garantía.
Los resultados de la consulta se envían finalmente al canal de resultados. El proxy obtiene los resultados de la consulta de ese canal. Asimismo, el proxy realizará una "reducción global", ya que recibe resultados de varios nodos de consulta y los resultados de la consulta pueden ser repetitivos.
Para garantizar que el proxy ha recibido todos los resultados de la consulta antes de devolverlos al SDK, el mensaje de resultados también mantendrá un registro de información que incluye los segmentos sellados buscados, los DMChannels buscados y los segmentos sellados globales (todos los segmentos en todos los nodos de consulta). El sistema puede concluir que el proxy ha recibido todos los resultados de la consulta sólo si se cumplen las dos condiciones siguientes:
- La unión de todos los segmentos sellados buscados registrados en todos los mensajes de resultados es mayor que los segmentos sellados globales,
- Se han consultado todos los DMChannels de la colección.
Por último, el proxy devuelve los resultados finales después de la "reducción global" al SDK de Milvus.
Acerca de la serie Deep Dive
Con el anuncio oficial de la disponibilidad general de Milvus 2.0, orquestamos esta serie de blogs Milvus Deep Dive para ofrecer una interpretación en profundidad de la arquitectura y el código fuente de Milvus. Los temas tratados en esta serie de blogs incluyen
- Carga de datos en el nodo de consulta
- Gestión de datos en el nodo de consulta
- Consulta en tiempo real en Milvus
- Acerca de la serie Deep Dive
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word