Elaborazione dei dati
Questo articolo fornisce una descrizione dettagliata dell'implementazione dell'inserimento dei dati, della costruzione degli indici e dell'interrogazione dei dati in Milvus.
Inserimento dei dati
È possibile scegliere il numero di shard utilizzati da una collezione in Milvus: ogni shard corrisponde a un canale virtuale(vchannel). Come illustrato di seguito, Milvus assegna ogni vchannel a un canale fisico(pchannel) e ogni pchannel è legato a uno specifico Streaming Node.
Canale v Canale p e nodo di streaming
Dopo la verifica dei dati, il proxy divide il messaggio scritto in vari pacchetti di dati di shard secondo le regole di instradamento degli shard specificate.
Canali 1
Quindi i dati scritti di uno shard(vchannel) vengono inviati al corrispondente Streaming Node di pchannel.
flusso di scrittura
Il nodo di streaming assegna un Timestamp Oracle (TSO) a ogni pacchetto di dati per stabilire un ordine totale delle operazioni. Esegue controlli di coerenza sul payload prima di scriverlo nel log di scrittura (WAL) sottostante. Una volta che i dati sono impegnati in modo duraturo nel WAL, è garantito che non vadano persi: anche in caso di crash, lo Streaming Node può riprodurre il WAL per recuperare completamente tutte le operazioni in sospeso.
Nel frattempo, lo StreamingNode taglia in modo asincrono le voci del WAL impegnate in segmenti discreti. Esistono due tipi di segmento:
- Segmento in crescita: tutti i dati che non sono stati inseriti nell'object storage.
- Segmento sigillato: tutti i dati sono stati inseriti nella memoria degli oggetti; i dati del segmento sigillato sono immutabili.
La transizione di un segmento in crescita in un segmento sigillato è chiamata flush. Il nodo di streaming attiva un flush non appena ha ingerito e scritto tutte le voci WAL disponibili per quel segmento, ossia quando non ci sono più record in sospeso nel log di scrittura sottostante; a questo punto il segmento viene finalizzato e reso ottimizzato per la lettura.
Creazione dell'indice
La costruzione dell'indice viene eseguita dal nodo dati. Per evitare la creazione frequente di indici per gli aggiornamenti dei dati, una raccolta in Milvus è ulteriormente suddivisa in segmenti, ciascuno con il proprio indice.
Costruzione dell'indice
Milvus supporta la costruzione di indici per ogni campo vettoriale, scalare e primario. Sia l'input che l'output della costruzione dell'indice sono collegati alla memorizzazione degli oggetti: Il nodo dati carica le istantanee del registro da indicizzare da un segmento (che si trova nella memoria degli oggetti) alla memoria, deserializza i dati e i metadati corrispondenti per costruire l'indice, serializza l'indice al termine della costruzione e lo scrive nuovamente nella memoria degli oggetti.
La costruzione dell'indice coinvolge principalmente operazioni vettoriali e matriciali e quindi richiede molto calcolo e memoria. I vettori non possono essere indicizzati in modo efficiente con i tradizionali indici ad albero, a causa della loro natura altamente dimensionale, ma possono essere indicizzati con tecniche più mature in questo campo, come gli indici a grafo o a cluster. Indipendentemente dal tipo, la costruzione di un indice comporta calcoli iterativi massicci per vettori di grandi dimensioni, come Kmeans o graph traverse.
A differenza dell'indicizzazione per i dati scalari, la costruzione di indici vettoriali deve sfruttare appieno l'accelerazione SIMD (istruzione singola, dati multipli). Milvus ha un supporto innato per i set di istruzioni SIMD, ad esempio SSE, AVX2 e AVX512. Data la natura "a singhiozzo" e ad alta intensità di risorse della creazione di indici vettoriali, l'elasticità diventa fondamentale per Milvus in termini economici. Le future versioni di Milvus esploreranno ulteriormente l'elaborazione eterogenea e il calcolo senza server per ridurre i relativi costi.
Inoltre, Milvus supporta anche il filtraggio scalare e l'interrogazione di campi primari. Ha indici incorporati per migliorare l'efficienza delle query, come gli indici del filtro Bloom, gli indici hash, gli indici ad albero e gli indici invertiti, e prevede di introdurre altri indici esterni, come gli indici bitmap e gli indici grezzi.
Interrogazione dei dati
L'interrogazione dei dati si riferisce al processo di ricerca in una collezione specifica del numero k di vettori più vicini a un vettore di destinazione o di tutti i vettori entro un intervallo di distanza specificato dal vettore. I vettori vengono restituiti insieme alla loro chiave primaria e ai campi corrispondenti.
Interrogazione dei dati
Una collezione in Milvus è suddivisa in più segmenti; lo Streaming Node carica segmenti crescenti e mantiene i dati in tempo reale, mentre i Query Nodes caricano segmenti sigillati.
Quando arriva una richiesta di interrogazione/ricerca, il proxy la trasmette a tutti gli Streaming Node responsabili dei relativi shard per una ricerca simultanea.
Quando arriva una richiesta di interrogazione, il proxy richiede simultaneamente ai nodi di streaming che detengono gli shard corrispondenti di eseguire la ricerca.
Ciascun nodo di streaming genera un piano di interrogazione, ricerca i propri dati locali in crescita e contatta simultaneamente i nodi di interrogazione remoti per recuperare i risultati storici, quindi li aggrega in un unico risultato dello shard.
Infine, il proxy raccoglie tutti i risultati degli shard, li unisce nel risultato finale e lo restituisce al cliente.
Handoff
Quando il segmento in crescita su un nodo di streaming viene scaricato in un segmento sigillato o quando un nodo dati completa una compattazione, il coordinatore avvia un'operazione di handoff per convertire i dati in crescita in dati storici. Il coordinatore distribuisce quindi in modo uniforme i segmenti sigillati su tutti i nodi di query, bilanciando l'uso della memoria, il sovraccarico della CPU e il numero di segmenti, e rilascia qualsiasi segmento ridondante.
Cosa succede dopo
- Scoprire come utilizzare il database vettoriale Milvus per le interrogazioni in tempo reale.
- Conoscere l'inserimento e la persistenza dei dati in Milvus.
- Imparare come vengono elaborati i dati in Milvus.