Traitement des données
Cet article fournit une description détaillée de la mise en œuvre de l'insertion de données, de la construction d'index et de l'interrogation de données dans Milvus.
Insertion de données
Vous pouvez spécifier un certain nombre de taches pour chaque collection dans Milvus, chaque tache correspondant à un canal virtuel(vchannel). Comme le montre la figure suivante, Milvus attribue à chaque canal virtuel du courtier en journaux un canal physique(pchannel). Toute demande d'insertion/suppression entrante est acheminée vers les unités de stockage en fonction de la valeur de hachage de la clé primaire.
La validation des demandes DML est transférée au proxy car Milvus n'a pas de transactions compliquées. Le proxy demande un horodatage pour chaque demande d'insertion/suppression à TSO (Timestamp Oracle), qui est le module d'horodatage hébergé par le coordinateur racine. L'ancien horodatage étant remplacé par le nouveau, les horodatages sont utilisés pour déterminer la séquence des demandes de données en cours de traitement. Le proxy récupère les informations par lots à partir de la coordonnée des données, y compris les segments des entités et les clés primaires, afin d'augmenter le débit global et d'éviter de surcharger le nœud central.
Canaux 1
Les opérations DML (langage de manipulation de données) et DDL (langage de définition de données) sont toutes deux écrites dans la séquence d'enregistrement, mais les opérations DDL ne se voient attribuer qu'un seul canal en raison de leur faible fréquence d'apparition.
Canaux 2
Lescanaux sont gérés dans les nœuds sous-jacents du courtier en journaux. Chaque canal est physiquement indivisible et disponible pour n'importe quel nœud, mais un seul. Lorsque le taux d'ingestion des données atteint un goulot d'étranglement, il faut tenir compte de deux éléments : D'une part, le nœud du log broker est surchargé et doit être redimensionné et, d'autre part, il y a suffisamment de shards pour assurer l'équilibre de la charge pour chaque nœud.
Séquence d'écriture du journal
Le diagramme ci-dessus présente les quatre composants impliqués dans le processus d'écriture d'une séquence de journaux : le proxy, le courtier en journaux, le nœud de données et le stockage d'objets. Le processus comprend quatre tâches : la validation des requêtes DML, la publication et l'abonnement de la séquence de journaux, la conversion du journal en continu en instantanés de journaux et la persistance des instantanés de journaux. Les quatre tâches sont découplées les unes des autres afin de s'assurer que chaque tâche est traitée par le type de nœud correspondant. Les nœuds de même type sont mis sur un pied d'égalité et peuvent être dimensionnés de manière élastique et indépendante pour s'adapter à différentes charges de données, en particulier les données en continu massives et très fluctuantes.
Construction de l'index
L'élaboration de l'index est effectuée par le nœud d'index. Pour éviter la création fréquente d'index lors des mises à jour de données, une collection dans Milvus est divisée en segments, chacun ayant son propre index.
Construction d'index
Milvus prend en charge la construction d'index pour chaque champ vectoriel, champ scalaire et champ primaire. L'entrée et la sortie de la construction d'index sont toutes deux liées au stockage d'objets : Le nœud d'indexation charge les instantanés de journal à indexer à partir d'un segment (qui se trouve dans le stockage d'objets) dans la mémoire, désérialise les données et métadonnées correspondantes pour construire l'index, sérialise l'index lorsque la construction de l'index est terminée et le réécrit dans le stockage d'objets.
La construction d'un index implique principalement des opérations sur les vecteurs et les matrices et nécessite donc beaucoup de calculs et de mémoire. Les vecteurs ne peuvent pas être indexés efficacement avec les index arborescents traditionnels en raison de leur nature hautement dimensionnelle, mais peuvent l'être avec des techniques plus abouties dans ce domaine, telles que les index basés sur les grappes ou les graphes. Quel que soit son type, la construction d'un index implique des calculs itératifs massifs pour les vecteurs à grande échelle, tels que Kmeans ou graph traverse.
Contrairement à l'indexation des données scalaires, la construction d'un index vectoriel doit tirer pleinement parti de l'accélération SIMD (instruction unique, données multiples). Milvus prend en charge de manière innée les jeux d'instructions SIMD, par exemple SSE, AVX2 et AVX512. Compte tenu de la nature "hoquetante" et gourmande en ressources de la construction d'index vectoriels, l'élasticité revêt une importance cruciale pour Milvus en termes économiques. Les prochaines versions de Milvus exploreront davantage l'informatique hétérogène et l'informatique sans serveur afin de réduire les coûts connexes.
En outre, Milvus prend également en charge le filtrage scalaire et l'interrogation de champs primaires. Il dispose d'index intégrés pour améliorer l'efficacité des requêtes, par exemple les index du filtre de Bloom, les index de hachage, les index arborescents et les index inversés, et prévoit d'introduire davantage d'index externes, par exemple les index bitmap et les index bruts.
Interrogation de données
L'interrogation de données est le processus de recherche, dans une collection donnée, du nombre k de vecteurs les plus proches d'un vecteur cible ou de tous les vecteurs situés dans une plage de distance donnée par rapport au vecteur. Les vecteurs sont renvoyés avec leur clé primaire et les champs correspondants.
Requête de données
Dans Milvus, une collection est divisée en plusieurs segments et les nœuds d'interrogation chargent les index par segment. Lorsqu'une demande de recherche arrive, elle est diffusée à tous les nœuds d'interrogation pour une recherche simultanée. Chaque nœud élague alors les segments locaux, recherche les vecteurs répondant aux critères, réduit et renvoie les résultats de la recherche.
Les nœuds d'interrogation sont indépendants les uns des autres dans une requête de données. Chaque nœud n'est responsable que de deux tâches : charger ou libérer des segments en suivant les instructions de la coordonnatrice de la requête ; effectuer une recherche dans les segments locaux. Le proxy est chargé de réduire les résultats de recherche de chaque nœud de requête et de renvoyer les résultats finaux au client.
Transfert
Il existe deux types de segments : les segments croissants (pour les données incrémentielles) et les segments scellés (pour les données historiques). Les nœuds d'interrogation s'abonnent à vchannel pour recevoir les mises à jour récentes (données incrémentielles) sous forme de segments croissants. Lorsqu'un segment croissant atteint un seuil prédéfini, la coordination des données le scelle et la construction de l'index commence. Ensuite, une opération de transfert initiée par la coordonnatrice des requêtes transforme les données incrémentales en données historiques. La coordination des requêtes répartit les segments scellés de manière égale entre tous les nœuds de requêtes en fonction de l'utilisation de la mémoire, de la charge de travail de l'unité centrale et du nombre de segments.
Prochaines étapes
- Découvrez comment utiliser la base de données vectorielle Milvus pour des requêtes en temps réel.
- En savoir plus sur l'insertion et la persistance des données dans Milvus.
- Apprendre comment les données sont traitées dans Milvus.