🚀 Prueba Zilliz Cloud, el Milvus completamente gestionado, gratis—¡experimenta un rendimiento 10 veces más rápido! Prueba Ahora>>

milvus-logo
LFAI
  • Home
  • Blog
  • Visión general de la arquitectura distribuida

Visión general de la arquitectura distribuida

  • Engineering
March 17, 2020
milvus

El objetivo de Milvus es lograr una búsqueda de similitudes y un análisis eficientes para vectores a gran escala. Una instancia independiente de Milvus puede gestionar fácilmente la búsqueda de vectores a escala de miles de millones de vectores. Sin embargo, para conjuntos de datos de 10.000 millones, 100.000 millones o incluso mayores, se necesita un clúster Milvus. El clúster puede utilizarse como instancia independiente para aplicaciones de nivel superior y puede satisfacer las necesidades empresariales de baja latencia y alta concurrencia para datos a escala masiva. Un clúster Milvus puede reenviar solicitudes, separar la lectura de la escritura, escalar horizontalmente y expandirse dinámicamente, proporcionando así una instancia Milvus que puede expandirse sin límites. Mishards es una solución distribuida para Milvus.

Este artículo presentará brevemente los componentes de la arquitectura de Mishards. En los próximos artículos se presentará información más detallada.

1-milvus-cluster-mishards.png 1-milvus-cluster-mishards.png

Visión general de la arquitectura distribuida

2-distributed-architecture-overview.png 2-distributed-architecture-overview.png

Rastreo de servicios

3-service-tracing-milvus.png 3-servicio-tracing-milvus.png

Componentes principales del servicio

  • Marco de descubrimiento de servicios, como ZooKeeper, etcd y Consul.
  • Equilibrador de carga, como Nginx, HAProxy, Ingress Controller.
  • Nodo Mishards: sin estado, escalable.
  • Nodo Milvus de sólo escritura: nodo único y no escalable. Es necesario utilizar soluciones de alta disponibilidad para este nodo para evitar un único punto de fallo.
  • Nodo Milvus de sólo lectura: Nodo con estado y escalable.
  • Servicio de almacenamiento compartido: Todos los nodos Milvus utilizan un servicio de almacenamiento compartido para compartir datos, como NAS o NFS.
  • Servicio de metadatos: Todos los nodos Milvus utilizan este servicio para compartir metadatos. Actualmente, sólo es compatible con MySQL. Este servicio requiere una solución MySQL de alta disponibilidad.

Componentes escalables

  • Mishards
  • Nodos Milvus de sólo lectura

Introducción de componentes

Nodos Mishards

Mishards se encarga de dividir las peticiones del flujo ascendente y enrutar las subpeticiones a los subservicios. Los resultados se resumen para devolverlos al flujo ascendente.

4-mishards-nodes.jpg 4-nodos-mishards.jpg

Como se indica en el gráfico anterior, tras aceptar una solicitud de búsqueda TopK, Mishards primero divide la solicitud en sub-solicitudes y envía las sub-solicitudes al servicio descendente. Cuando se recogen todas las subrespuestas, éstas se fusionan y se devuelven al servicio ascendente.

Como Mishards es un servicio sin estado, no guarda datos ni participa en cálculos complejos. Así, los nodos no tienen grandes requisitos de configuración y la potencia de cálculo se utiliza principalmente en la fusión de subrespuestas. Por lo tanto, es posible aumentar el número de nodos Mishards para una alta concurrencia.

Nodos Milvus

Los nodos Milvus son responsables de las operaciones centrales relacionadas con CRUD, por lo que tienen unos requisitos de configuración relativamente altos. En primer lugar, el tamaño de la memoria debe ser lo suficientemente grande como para evitar demasiadas operaciones de IO de disco. En segundo lugar, la configuración de la CPU también puede afectar al rendimiento. A medida que aumenta el tamaño del clúster, se necesitan más nodos Milvus para aumentar el rendimiento del sistema.

Nodos de sólo lectura y nodos de escritura

  • Las operaciones principales de Milvus son la inserción y la búsqueda de vectores. La búsqueda tiene requisitos extremadamente altos en las configuraciones de CPU y GPU, mientras que la inserción u otras operaciones tienen requisitos relativamente bajos. Separar el nodo que ejecuta la búsqueda del nodo que ejecuta otras operaciones permite un despliegue más económico.
  • En términos de calidad de servicio, cuando un nodo realiza operaciones de búsqueda, el hardware relacionado funciona a plena carga y no puede garantizar la calidad de servicio de otras operaciones. Por lo tanto, se utilizan dos tipos de nodos. Las solicitudes de búsqueda son procesadas por nodos de sólo lectura y las demás solicitudes son procesadas por nodos con capacidad de escritura.

Sólo se permite un nodo de escritura

  • Actualmente, Milvus no soporta compartir datos para múltiples instancias con capacidad de escritura.

  • Durante el despliegue, debe tenerse en cuenta un único punto de fallo de los nodos con capacidad de escritura. Es necesario preparar soluciones de alta disponibilidad para los nodos con capacidad de escritura.

Escalabilidad de los nodos de sólo lectura

Cuando el tamaño de los datos es extremadamente grande, o el requisito de latencia es extremadamente alto, puede escalar horizontalmente los nodos de sólo lectura como nodos con estado. Supongamos que hay 4 hosts y cada uno tiene la siguiente configuración: Núcleos CPU: 16, GPU: 1, Memoria: 64 GB. El siguiente gráfico muestra el cluster cuando se escalan horizontalmente los nodos stateful. Tanto la potencia de cálculo como la memoria escalan linealmente. Los datos se dividen en 8 fragmentos y cada nodo procesa solicitudes de 2 fragmentos.

5-read-only-node-scalability-milvus.png 5-nodo-de-solo-lectura-escalabilidad-milvus.png

Cuando el número de peticiones es grande para algunos fragmentos, pueden desplegarse nodos de sólo lectura sin estado para estos fragmentos con el fin de aumentar el rendimiento. Cuando los hosts se combinan en un clúster sin servidor, la potencia de cálculo aumenta linealmente. Dado que los datos a procesar no aumentan, la potencia de procesamiento para el mismo fragmento de datos también aumenta linealmente.

6-read-only-node-scalability-milvus-2.png 6-nodo-de-solo-lectura-escalabilidad-milvus-2.png

Servicio de metadatos

Palabras clave MySQL

Para más información sobre los metadatos de Milvus, consulte Cómo ver metadatos. En un sistema distribuido, los nodos Milvus con capacidad de escritura son los únicos productores de metadatos. Los nodos Mishards, los nodos Milvus con capacidad de escritura y los nodos Milvus de sólo lectura son todos consumidores de metadatos. Actualmente, Milvus sólo admite MySQL y SQLite como backend de almacenamiento de metadatos. En un sistema distribuido, el servicio sólo puede desplegarse como MySQL de alta disponibilidad.

Descubrimiento del servicio

Palabras clave: Apache Zookeeper, etcd, Consul, Kubernetes

7-service-discovery.png 7-descubrimiento-de-servicios.png

El descubrimiento de servicios proporciona información sobre todos los nodos Milvus. Los nodos Milvus registran su información cuando se conectan y se desconectan cuando se desconectan. Los nodos Milvus también pueden detectar nodos anómalos comprobando periódicamente el estado de salud de los servicios.

El descubrimiento de servicios contiene una gran cantidad de frameworks, incluyendo etcd, Consul, ZooKeeper, etc. Mishards define las interfaces de descubrimiento de servicios y ofrece posibilidades de escalado mediante plugins. Actualmente, Mishards proporciona dos tipos de plugins, que corresponden al clúster Kubernetes y a las configuraciones estáticas. Puedes personalizar tu propio descubrimiento de servicios siguiendo la implementación de estos plugins. Las interfaces son temporales y necesitan un rediseño. En los próximos artículos encontrarás más información sobre cómo escribir tu propio plugin.

Equilibrio de carga y fragmentación de servicios

Palabras clave: Nginx, HAProxy, Kubernetes

7-load-balancing-and-service-sharding.png 7-balanceo-de-carga-y-distribución-de-servicios.png

El descubrimiento de servicios y el equilibrio de carga se utilizan conjuntamente. El balanceo de carga puede configurarse como polling, hashing o hashing consistente.

El equilibrador de carga se encarga de reenviar las solicitudes de los usuarios al nodo Mishards.

Cada nodo Mishards adquiere la información de todos los nodos Milvus descendentes a través del centro de descubrimiento de servicios. Todos los metadatos relacionados pueden adquirirse mediante el servicio de metadatos. Mishards implementa la fragmentación consumiendo estos recursos. Mishards define las interfaces relacionadas con las estrategias de enrutamiento y proporciona extensiones a través de plugins. Actualmente, Mishards proporciona una estrategia de hashing consistente basada en el nivel de segmento más bajo. Como se muestra en el gráfico, hay 10 segmentos, s1 a s10. Según la estrategia de hashing consistente basada en segmentos, Mishards enruta las peticiones relativas a s1, 24, s6, y s9 al nodo Milvus 1, s2, s3, s5 al nodo Milvus 2, y s7, s8, s10 al nodo Milvus 3.

En función de sus necesidades empresariales, puede personalizar el enrutamiento siguiendo el plugin de enrutamiento hashing consistente predeterminado.

Rastreo

Palabras clave: OpenTracing, Jaeger, Zipkin

Dada la complejidad de un sistema distribuido, las peticiones se envían a múltiples invocaciones de servicios internos. Para ayudar a localizar problemas, necesitamos rastrear la cadena de invocación de servicios internos. A medida que aumenta la complejidad, las ventajas de un sistema de rastreo disponible se explican por sí solas. Elegimos el estándar CNCF OpenTracing. OpenTracing proporciona API independientes de la plataforma y del proveedor para que los desarrolladores implementen cómodamente un sistema de rastreo.

8-tracing-demo-milvus.png 8-tracing-demo-milvus.png

El gráfico anterior es un ejemplo de rastreo durante la invocación de una búsqueda. La búsqueda invoca get_routing, do_search, y do_merge consecutivamente. do_search también invoca search_127.0.0.1.

Todo el registro de rastreo forma el siguiente árbol:

8-search-traceid-milvus.png 8-search-traceid-milvus.png

El siguiente gráfico muestra ejemplos de información de solicitud/respuesta y etiquetas de cada nodo:

request-response-info-tags-node-milvus.png request-response-info-tags-node-milvus.png

OpenTracing se ha integrado en Milvus. Se ofrecerá más información en los próximos artículos.

Monitorización y alertas

Palabras clave: Prometheus, Grafana

10-monitor-alert-milvus.jpg 10-monitor-alert-milvus.jpg

Resumen

Como middleware de servicios, Mishards integra descubrimiento de servicios, solicitud de enrutamiento, fusión de resultados y rastreo. También se proporciona expansión basada en plugins. Actualmente, las soluciones distribuidas basadas en Mishards siguen presentando los siguientes inconvenientes:

  • Mishards utiliza proxy como capa intermedia y tiene costes de latencia.
  • Los nodos de escritura de Milvus son servicios de punto único.
  • Depende de un servicio MySQL de alta disponibilidad. -El despliegue es complicado cuando hay múltiples shards y un único shard tiene múltiples copias.
  • Carece de una capa de caché, como el acceso a metadatos.

Arreglaremos estos problemas conocidos en las próximas versiones para que Mishards se pueda aplicar al entorno de producción de forma más cómoda.

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

Sigue Leyendo