Creación de una base de datos vectorial para la búsqueda escalable de similitudes
Imagen de portada
Este artículo ha sido escrito por Xiaofan Luan y transcrito por Angela Ni y Claire Yu.
Según las estadísticas, entre el 80% y el 90% de los datos del mundo son no estructurados. Impulsada por el rápido crecimiento de Internet, se espera una explosión de datos no estructurados en los próximos años. En consecuencia, las empresas necesitan urgentemente una base de datos potente que les ayude a manejar y comprender mejor este tipo de datos. Sin embargo, desarrollar una base de datos siempre es más fácil de decir que de hacer. Este artículo tiene como objetivo compartir el proceso de pensamiento y los principios de diseño de la construcción de Milvus, una base de datos vectorial de código abierto, nativa de la nube para la búsqueda de similitud escalable. Este artículo también explica en detalle la arquitectura de Milvus.
Ir a:
- Los datos no estructurados requieren una pila de software básica completa
- Los principios de diseño de Milvus 2.0
- Creación de una base de datos vectorial para la búsqueda escalable de similitudes
Los datos no estructurados requieren una pila de software básica completa
A medida que Internet crecía y evolucionaba, los datos no estructurados se hicieron cada vez más comunes, incluyendo correos electrónicos, documentos, datos de sensores IoT, fotos de Facebook, estructuras de proteínas y mucho más. Para que los ordenadores puedan comprender y procesar los datos no estructurados, estos se convierten en vectores mediante técnicas de incrustación.
Milvus almacena e indexa estos vectores y analiza la correlación entre dos vectores calculando su distancia de similitud. Si los dos vectores incrustados son muy similares, significa que las fuentes de datos originales también lo son.
El flujo de trabajo del tratamiento de datos no estructurados.
Vectores y escalares
Un escalar es una cantidad que sólo se describe en una medida: la magnitud. Un escalar puede representarse como un número. Por ejemplo, un coche circula a una velocidad de 80 km/h. En este caso, la velocidad (80 km/h) es un escalar. Por su parte, un vector es una cantidad que se describe en al menos dos medidas: magnitud y dirección. Si un coche viaja hacia el oeste a una velocidad de 80 km/h, la velocidad (80 km/h oeste) es un vector. La imagen siguiente es un ejemplo de escalares y vectores comunes.
Escalares vs. Vectores
Dado que la mayoría de los datos importantes tienen más de un atributo, podemos entender mejor estos datos si los convertimos en vectores. Una forma habitual de manipular datos vectoriales es calcular la distancia entre vectores utilizando métricas como la distancia euclídea, el producto interior, la distancia de Tanimoto, la distancia de Hamming, etc. Cuanto más cercana es la distancia, más parecidos son los vectores. Para consultar un conjunto de datos vectoriales masivos de forma eficiente, podemos organizar los datos vectoriales creando índices sobre ellos. Una vez indexado el conjunto de datos, las consultas pueden dirigirse a los clusters o subconjuntos de datos que tienen más probabilidades de contener vectores similares a una consulta de entrada.
Para obtener más información sobre los índices, consulte Índice vectorial.
Del motor de búsqueda de vectores a la base de datos de vectores
Desde el principio, Milvus 2.0 está diseñado para servir no sólo como motor de búsqueda, sino, lo que es más importante, como una potente base de datos vectorial.
Una forma de ayudarle a entender la diferencia es establecer una analogía entre InnoDB y MySQL, o Lucene y Elasticsearch.
Al igual que MySQL y Elasticsearch, Milvus también está construido sobre bibliotecas de código abierto como Faiss, HNSW, Annoy, que se centran en proporcionar funcionalidades de búsqueda y garantizar el rendimiento de la búsqueda. Sin embargo, sería injusto degradar Milvus a una mera capa por encima de Faiss, ya que almacena, recupera y analiza vectores y, al igual que cualquier otra base de datos, también proporciona una interfaz estándar para operaciones CRUD. Además, Milvus también cuenta con características como:
- Separación y partición
- Replicación
- Recuperación en caso de catástrofe
- Equilibrio de carga
- Analizador u optimizador de consultas
Base de datos vectorial
Para una comprensión más completa de lo que es una base de datos vectorial, lea el blog aquí.
Un primer enfoque nativo en la nube
Enfoque nativo de la nube
De la nada compartida al almacenamiento compartido, y de ahí a algo compartido
Las bases de datos tradicionales solían adoptar una arquitectura de "nada compartido" en la que los nodos de los sistemas distribuidos son independientes pero están conectados por una red. Los nodos no comparten memoria ni almacenamiento. Sin embargo, Snowflake revolucionó el sector al introducir una arquitectura de "almacenamiento compartido" en la que el cálculo (procesamiento de consultas) se separa del almacenamiento (almacenamiento de bases de datos). Con una arquitectura de almacenamiento compartido, las bases de datos pueden lograr una mayor disponibilidad, escalabilidad y una reducción de la duplicación de datos. Inspiradas por Snowflake, muchas empresas empezaron a aprovechar la infraestructura basada en la nube para la persistencia de los datos, al tiempo que utilizaban el almacenamiento local para el almacenamiento en caché. Este tipo de arquitectura de base de datos se denomina "algo compartido" y se ha convertido en la arquitectura dominante en la mayoría de las aplicaciones actuales.
Aparte de la arquitectura de "algo compartido", Milvus admite el escalado flexible de cada componente utilizando Kubernetes para gestionar su motor de ejecución y separando los servicios de lectura, escritura y otros con microservicios.
Base de datos como servicio (DBaaS)
La base de datos como servicio es una tendencia candente, ya que muchos usuarios no solo se preocupan por las funcionalidades habituales de la base de datos, sino que también anhelan servicios más variados. Esto significa que, aparte de las operaciones CRUD tradicionales, nuestra base de datos tiene que enriquecer el tipo de servicios que puede proporcionar, como gestión de bases de datos, transporte de datos, carga, visualización, etc.
Sinergia con el ecosistema de código abierto más amplio
Otra tendencia en el desarrollo de bases de datos es aprovechar la sinergia entre la base de datos y otras infraestructuras nativas de la nube. En el caso de Milvus, se apoya en algunos sistemas de código abierto. Por ejemplo, Milvus utiliza etcd para almacenar metadatos. También adopta la cola de mensajes, un tipo de comunicación asíncrona de servicio a servicio utilizada en la arquitectura de microservicios, que puede ayudar a exportar datos incrementales.
En el futuro, esperamos construir Milvus sobre infraestructuras de IA como Spark o Tensorflow, e integrar Milvus con motores de streaming para que podamos soportar mejor el procesamiento unificado de streaming y por lotes para satisfacer las diversas necesidades de los usuarios de Milvus.
Los principios de diseño de Milvus 2.0
Como nuestra base de datos vectorial nativa de la nube de próxima generación, Milvus 2.0 se construye en torno a los siguientes tres principios.
Registro como datos
Un registro en una base de datos registra en serie todos los cambios realizados en los datos. Como se muestra en la siguiente figura, de izquierda a derecha están los "datos antiguos" y los "datos nuevos". Y los registros están en orden temporal. Milvus tiene un mecanismo de temporizador global que asigna una marca de tiempo global única y auto-incremental.
Registros
En Milvus 2.0, el corredor de registros sirve de columna vertebral del sistema: todas las operaciones de inserción y actualización de datos deben pasar por el corredor de registros, y los nodos trabajadores ejecutan las operaciones CRUD suscribiéndose a los registros y consumiéndolos.
Dualidad de tabla y registro
Tanto la tabla como el registro son datos, y no son más que dos formas diferentes. Las tablas son datos delimitados, mientras que los registros son ilimitados. Los registros pueden convertirse en tablas. En el caso de Milvus, agrega registros utilizando una ventana de procesamiento de TimeTick. Basándose en la secuencia del registro, se agregan múltiples registros en un pequeño archivo llamado instantánea del registro. A continuación, estas instantáneas de registro se combinan para formar un segmento, que puede utilizarse individualmente para el equilibrio de carga.
Persistencia de los registros
La persistencia de los registros es uno de los problemas más complicados a los que se enfrentan muchas bases de datos. El almacenamiento de registros en un sistema distribuido suele depender de algoritmos de replicación.
A diferencia de bases de datos como Aurora, HBase, Cockroach DB y TiDB, Milvus adopta un enfoque innovador e introduce un sistema de publicación y suscripción (pub/sub) para el almacenamiento y la persistencia de registros. Un sistema pub/sub es análogo a la cola de mensajes de Kafka o Pulsar. Todos los nodos del sistema pueden consumir los registros. En Milvus, este tipo de sistema se denomina log broker. Gracias al corredor de registros, los registros se desacoplan del servidor, lo que garantiza que Milvus sea en sí mismo apátrida y esté mejor posicionado para recuperarse rápidamente de un fallo del sistema.
Agente de registros
Creación de una base de datos vectorial para la búsqueda escalable de similitudes
Construido sobre bibliotecas populares de búsqueda vectorial, incluyendo Faiss, ANNOY, HNSW, y más, Milvus fue diseñado para la búsqueda de similitud en conjuntos de datos vectoriales densos que contienen millones, miles de millones, o incluso billones de vectores.
Independiente y en clúster
Milvus ofrece dos formas de despliegue: independiente o en clúster. En Milvus standalone, puesto que todos los nodos se despliegan juntos, podemos ver Milvus como un único proceso. Actualmente, Milvus standalone depende de MinIO y etcd para la persistencia de datos y el almacenamiento de metadatos. En futuras versiones, esperamos eliminar estas dos dependencias de terceros para garantizar la simplicidad del sistema Milvus. Milvus cluster incluye ocho componentes de microservicio y tres dependencias de terceros: MinIO, etcd y Pulsar. Pulsar actúa como intermediario de registros y proporciona servicios pub/sub de registros.
Independiente y clúster
Esqueleto básico de la arquitectura Milvus
Milvus separa el flujo de datos del flujo de control y se divide en cuatro capas que son independientes en términos de escalabilidad y recuperación de desastres.
Arquitectura Milvus
Capa de acceso
La capa de acceso actúa como la cara del sistema, exponiendo el punto final de la conexión del cliente al mundo exterior. Se encarga de procesar las conexiones de los clientes, realizar la verificación estática, las comprobaciones dinámicas básicas de las solicitudes de los usuarios, reenviar las solicitudes y recopilar y devolver los resultados al cliente. El proxy en sí no tiene estado y proporciona direcciones de acceso unificadas y servicios al mundo exterior a través de componentes de equilibrio de carga (Nginx, Kubernetess Ingress, NodePort y LVS). Milvus utiliza una arquitectura de procesamiento paralelo masivo (MPP), en la que los proxies devuelven los resultados recogidos de los nodos trabajadores tras la agregación global y el post-procesamiento.
Servicio de coordinación
El servicio coordinador es el cerebro del sistema, responsable de la gestión de los nodos de la topología del clúster, el equilibrio de carga, la generación de marcas de tiempo, la declaración de datos y la gestión de datos. Para una explicación detallada de la función de cada servicio coordinador, lea la documentación técnica de Milvus.
Nodos trabajadores
El nodo trabajador, o de ejecución, actúa como las extremidades del sistema, ejecutando las instrucciones emitidas por el servicio coordinador y los comandos del lenguaje de manipulación de datos (DML) iniciados por el proxy. Un nodo trabajador en Milvus es similar a un nodo de datos en Hadoop, o a un servidor de región en HBase. Cada tipo de nodo trabajador corresponde a un servicio de coordenadas. Para una explicación detallada de la función de cada nodo trabajador, lea la documentación técnica de Milvus.
Almacenamiento
El almacenamiento es la piedra angular de Milvus, responsable de la persistencia de los datos. La capa de almacenamiento se divide en tres partes:
- Metaalmacén: Responsable de almacenar instantáneas de metadatos como el esquema de recolección, el estado de los nodos, los puntos de control de consumo de mensajes, etc. Milvus depende de etcd para estas funciones y Etcd también asume la responsabilidad del registro de servicios y las comprobaciones de estado.
- Log broker: Un sistema pub/sub que soporta la reproducción y es responsable de la persistencia de datos en streaming, la ejecución de consultas asíncronas fiables, las notificaciones de eventos y la devolución de los resultados de las consultas. Cuando los nodos están realizando la recuperación del tiempo de inactividad, el log broker garantiza la integridad de los datos incrementales a través de la reproducción del log broker. El clúster Milvus utiliza Pulsar como corredor de registros, mientras que el modo autónomo utiliza RocksDB. Los servicios de almacenamiento en streaming como Kafka y Pravega también pueden utilizarse como corredores de registros.
- Almacenamiento de objetos: Almacena archivos de instantáneas de registros, archivos de índices escalares/vectoriales y resultados intermedios del procesamiento de consultas. Milvus es compatible con AWS S3 y Azure Blob, así como con MinIO, un servicio de almacenamiento de objetos ligero y de código abierto. Debido a la alta latencia de acceso y facturación por consulta de los servicios de almacenamiento de objetos, Milvus pronto soportará grupos de caché basados en memoria/SSD y separación de datos en caliente/frío para mejorar el rendimiento y reducir costes.
Modelo de datos
El modelo de datos organiza los datos en una base de datos. En Milvus, todos los datos se organizan por colección, fragmento, partición, segmento y entidad.
Modelo de datos 1
Colección
Una colección en Milvus puede compararse a una tabla en un sistema de almacenamiento relacional. La colección es la unidad de datos más grande de Milvus.
Fragmento
Para aprovechar al máximo la potencia de cálculo paralelo de los clusters al escribir datos, las colecciones en Milvus deben distribuir las operaciones de escritura de datos a diferentes nodos. Por defecto, una sola colección contiene dos fragmentos. Dependiendo del volumen de su conjunto de datos, puede tener más fragmentos en una colección. Milvus utiliza un método hash de clave maestra para la fragmentación.
Partición
También hay múltiples particiones en un fragmento. Una partición en Milvus se refiere a un conjunto de datos marcados con la misma etiqueta en una colección. Los métodos comunes de partición incluyen la partición por fecha, género, edad del usuario y más. La creación de particiones puede beneficiar el proceso de consulta, ya que los datos tremendos se pueden filtrar por etiqueta de partición.
En comparación, la fragmentación tiene más que ver con las capacidades de escalado cuando se escriben datos, mientras que el particionamiento tiene más que ver con la mejora del rendimiento del sistema cuando se leen datos.
Modelo de datos 2
Segmentos
Dentro de cada partición, hay múltiples segmentos pequeños. Un segmento es la unidad más pequeña para la programación del sistema en Milvus. Hay dos tipos de segmentos: crecientes y cerrados. Los segmentos crecientes son suscritos por nodos de consulta. El usuario de Milvus sigue escribiendo datos en segmentos crecientes. Cuando el tamaño de un segmento creciente alcanza un límite superior (512 MB por defecto), el sistema no permite escribir datos adicionales en este segmento creciente, por lo que se sella este segmento. Los índices se construyen sobre segmentos sellados.
Para acceder a los datos en tiempo real, el sistema lee los datos tanto en los segmentos crecientes como en los segmentos sellados.
Entidad
Cada segmento contiene una gran cantidad de entidades. Una entidad en Milvus equivale a una fila en una base de datos tradicional. Cada entidad tiene un campo de clave primaria único, que también puede generarse automáticamente. Las entidades también deben contener un sello de tiempo (ts), y un campo vectorial - el núcleo de Milvus.
Acerca de la serie Deep Dive
Con el anuncio oficial de la disponibilidad general de Milvus 2.0, hemos orquestado 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
- Los datos no estructurados requieren una pila de software básica completa
- Los principios de diseño de Milvus 2.0
- 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