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 choisir le nombre d'unités de stockage qu'une collection utilise dans Milvus - chaque unité de stockage correspond à un canal virtuel(vchannel). Comme illustré ci-dessous, Milvus affecte ensuite chaque vchannel à un canal physique(pchannel), et chaque pchannel est lié à un nœud de streaming spécifique.

VChannel PChannel and StreamingNode VChannel PChannel et StreamingNode

Après la vérification des données, le proxy divise le message écrit en plusieurs paquets de données (shards) conformément aux règles d'acheminement des shards spécifiées.

Channels 1 Canaux 1

Les données écrites d'un groupe(vchannel) sont ensuite envoyées au nœud de diffusion correspondant de pchannel.

write flow flux d'écriture

Le nœud de diffusion en continu attribue un Oracle d'horodatage (TSO) à chaque paquet de données afin d'établir un ordre total des opérations. Il effectue des contrôles de cohérence sur la charge utile avant de l'écrire dans le journal d'écriture (WAL) sous-jacent. Même en cas de panne, le nœud de streaming peut rejouer le WAL pour récupérer toutes les opérations en attente.

Pendant ce temps, le nœud de streaming découpe également de manière asynchrone les entrées WAL validées en segments distincts. Il existe deux types de segments :

  • segment croissant: toutes les données qui n'ont pas encore été transférées dans le stockage d'objets.
  • Segment scellé: toutes les données ont été persistées dans le stockage d'objets, les données du segment scellé sont immuables.

La transition d'un segment croissant à un segment scellé est appelée "flush". Le nœud de streaming déclenche un flush dès qu'il a ingéré et écrit toutes les entrées WAL disponibles pour ce segment, c'est-à-dire lorsqu'il n'y a plus d'enregistrements en attente dans le journal d'écriture sous-jacent, ce qui permet de finaliser le segment et d'en optimiser la lecture.

Construction de l'index

La construction de l'index est effectuée par le nœud de données. 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.

Index building 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 s'engagent avec le stockage d'objets : Le nœud de données 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.

Data query Requête de données

Dans Milvus, une collection est divisée en plusieurs segments ; le nœud de diffusion en continu charge les segments croissants et conserve les données en temps réel, tandis que les nœuds d'interrogation chargent les segments scellés.

Lorsqu'une demande de requête/recherche arrive, le proxy la diffuse à tous les nœuds de diffusion en continu responsables des segments correspondants pour une recherche simultanée.

Lorsqu'une demande de recherche arrive, le proxy demande simultanément aux nœuds de diffusion en continu qui détiennent les fichiers correspondants d'exécuter la recherche.

Chaque nœud de diffusion génère un plan d'interrogation, recherche ses données croissantes locales et contacte simultanément les nœuds d'interrogation distants pour récupérer les résultats historiques, puis les agrège en un seul résultat.

Enfin, le proxy recueille tous les résultats des nuées, les fusionne en un résultat final et le renvoie au client.

Handoff Transfert

Lorsque le segment croissant d'un nœud de streaming est transféré dans un segment scellé, ou lorsqu'un nœud de données achève un compactage, le coordinateur lance une opération de transfert pour convertir ces données croissantes en données historiques. Le coordinateur répartit ensuite uniformément les segments scellés entre tous les nœuds de requête, en équilibrant l'utilisation de la mémoire, les frais généraux de l'unité centrale et le nombre de segments, et libère tout segment redondant.

Et maintenant ?

Try Managed Milvus for Free

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

Get Started
Feedback

Cette page a-t - elle été utile ?