Costruire un database vettoriale per una ricerca di similarità scalabile
Immagine di copertina
Questo articolo è stato scritto da Xiaofan Luan e trascritto da Angela Ni e Claire Yu.
Secondo le statistiche, circa l'80%-90% dei dati mondiali è non strutturato. Alimentata dalla rapida crescita di Internet, nei prossimi anni si prevede un'esplosione di dati non strutturati. Di conseguenza, le aziende hanno urgentemente bisogno di un database potente che le aiuti a gestire e comprendere meglio questo tipo di dati. Tuttavia, sviluppare un database è sempre più facile a dirsi che a farsi. Questo articolo si propone di condividere il processo di pensiero e i principi di progettazione della costruzione di Milvus, un database vettoriale open-source e cloud-native per la ricerca scalabile di similarità. Questo articolo spiega anche l'architettura di Milvus in dettaglio.
Vai a:
- I dati non strutturati richiedono uno stack software di base completo
- I principi di progettazione di Milvus 2.0
- Costruire un database vettoriale per la ricerca scalabile di similarità
I dati non strutturati richiedono uno stack di software di base completo
Con la crescita e l'evoluzione di Internet, i dati non strutturati sono diventati sempre più comuni: e-mail, documenti, dati dei sensori IoT, foto di Facebook, strutture proteiche e molto altro. Affinché i computer possano comprendere ed elaborare i dati non strutturati, questi vengono convertiti in vettori utilizzando tecniche di incorporazione.
Milvus memorizza e indicizza questi vettori e analizza la correlazione tra due vettori calcolandone la distanza di similarità. Se i due vettori di incorporazione sono molto simili, significa che anche le fonti di dati originali sono simili.
Il flusso di lavoro dell'elaborazione dei dati non strutturati.
Vettori e scalari
Uno scalare è una quantità che è descritta solo da una misura - la grandezza. Uno scalare può essere rappresentato come un numero. Per esempio, un'automobile viaggia alla velocità di 80 km/h. La velocità (80 km/h) è uno scalare. Un vettore, invece, è una grandezza descritta da almeno due misure: la grandezza e la direzione. Se un'auto viaggia verso ovest alla velocità di 80 km/h, la velocità (80 km/h ovest) è un vettore. L'immagine seguente è un esempio di scalari e vettori comuni.
Scalari e vettori
Poiché la maggior parte dei dati importanti ha più di un attributo, possiamo comprenderli meglio se li convertiamo in vettori. Un modo comune per manipolare i dati vettoriali è quello di calcolare la distanza tra i vettori utilizzando metriche come la distanza euclidea, il prodotto interno, la distanza di Tanimoto, la distanza di Hamming, ecc. Più la distanza è vicina, più i vettori sono simili. Per interrogare in modo efficiente un enorme set di dati vettoriali, possiamo organizzare i dati vettoriali costruendo indici su di essi. Una volta indicizzato il set di dati, le query possono essere indirizzate verso i cluster, o sottoinsiemi di dati, che hanno maggiori probabilità di contenere vettori simili alla query di input.
Per saperne di più sugli indici, consultare Vector Index.
Da motore di ricerca vettoriale a database vettoriale
Fin dall'inizio, Milvus 2.0 è stato progettato per servire non solo come motore di ricerca, ma soprattutto come potente database vettoriale.
Un modo per farvi capire la differenza è quello di fare un'analogia tra InnoDB e MySQL, o Lucene ed Elasticsearch.
Proprio come MySQL ed Elasticsearch, anche Milvus è costruito sulla base di librerie open-source come Faiss, HNSW, Annoy, che si concentrano sulla fornitura di funzionalità di ricerca e sulla garanzia di prestazioni di ricerca. Tuttavia, sarebbe ingiusto degradare Milvus a mero strato superiore a Faiss, poiché memorizza, recupera e analizza vettori e, proprio come qualsiasi altro database, fornisce anche un'interfaccia standard per le operazioni CRUD. Inoltre, Milvus vanta anche caratteristiche quali:
- Sharding e partizionamento
- Replica
- Recupero di emergenza
- Bilanciamento del carico
- Parser o ottimizzatore di query
Database vettoriale
Per una comprensione più completa di cosa sia un database vettoriale, leggete il blog qui.
Un approccio cloud-nativo
Approccio cloud-nativo
Dal nulla condiviso, allo storage condiviso, quindi al qualcosa condiviso
I database tradizionali adottavano un'architettura "shared nothing" in cui i nodi dei sistemi distribuiti sono indipendenti ma collegati in rete. La memoria o lo storage non sono condivisi tra i nodi. Tuttavia, Snowflake ha rivoluzionato il settore introducendo un'architettura "shared storage" in cui l'elaborazione (query processing) è separata dalla memorizzazione (database storage). Con un'architettura di storage condiviso, i database possono ottenere una maggiore disponibilità, scalabilità e riduzione della duplicazione dei dati. Ispirandosi a Snowflake, molte aziende hanno iniziato a sfruttare l'infrastruttura basata sul cloud per la persistenza dei dati, utilizzando lo storage locale per il caching. Questo tipo di architettura di database è chiamata "shared something" (qualcosa di condiviso) ed è diventata oggi l'architettura mainstream nella maggior parte delle applicazioni.
Oltre all'architettura "shared something", Milvus supporta la scalabilità flessibile di ogni componente utilizzando Kubernetes per gestire il motore di esecuzione e separando i servizi di lettura, scrittura e altri servizi con microservizi.
Database come servizio (DBaaS)
Il database as a service è una tendenza molto diffusa, poiché molti utenti non si preoccupano solo delle normali funzionalità del database, ma desiderano anche servizi più vari. Ciò significa che, oltre alle tradizionali operazioni CRUD, il nostro database deve arricchire il tipo di servizi che può fornire, come la gestione del database, il trasporto dei dati, il caricamento, la visualizzazione, ecc.
Sinergia con il più ampio ecosistema open-source
Un'altra tendenza nello sviluppo dei database è quella di sfruttare la sinergia tra il database e altre infrastrutture cloud-native. Nel caso di Milvus, esso si basa su alcuni sistemi open-source. Ad esempio, Milvus utilizza etcd per la memorizzazione dei metadati. Adotta anche la coda di messaggi, un tipo di comunicazione asincrona da servizio a servizio utilizzata nell'architettura a microservizi, che può aiutare a esportare dati incrementali.
In futuro, speriamo di costruire Milvus in cima a infrastrutture di AI come Spark o Tensorflow e di integrare Milvus con motori di streaming, in modo da poter supportare meglio l'elaborazione unificata di stream e batch per soddisfare le varie esigenze degli utenti di Milvus.
I principi di progettazione di Milvus 2.0
Come database vettoriale cloud-nativo di nuova generazione, Milvus 2.0 si basa sui tre principi seguenti.
Registro come dati
Un log in un database registra in serie tutte le modifiche apportate ai dati. Come mostrato nella figura seguente, da sinistra a destra ci sono i "vecchi dati" e i "nuovi dati". I registri sono in ordine temporale. Milvus ha un meccanismo di timer globale che assegna un timestamp unico a livello globale e autoincrementale.
I registri
In Milvus 2.0, il log broker funge da spina dorsale del sistema: tutte le operazioni di inserimento e aggiornamento dei dati devono passare attraverso il log broker, e i nodi worker eseguono le operazioni CRUD sottoscrivendo e consumando i log.
Dualità di tabella e log
Sia la tabella che il log sono dati e sono solo due forme diverse. Le tabelle sono dati vincolati, mentre i log non sono vincolati. I log possono essere convertiti in tabelle. Nel caso di Milvus, esso aggrega i registri utilizzando una finestra di elaborazione di TimeTick. In base alla sequenza dei registri, più registri vengono aggregati in un piccolo file chiamato snapshot di registro. Poi queste istantanee di log vengono combinate per formare un segmento, che può essere usato individualmente per il bilanciamento del carico.
Persistenza dei log
La persistenza dei registri è uno dei problemi più spinosi per molti database. L'archiviazione dei log in un sistema distribuito dipende solitamente da algoritmi di replica.
A differenza di database come Aurora, HBase, Cockroach DB e TiDB, Milvus adotta un approccio innovativo e introduce un sistema publish-subscribe (pub/sub) per l'archiviazione e la persistenza dei log. Un sistema pub/sub è analogo alla coda di messaggi di Kafka o Pulsar. Tutti i nodi del sistema possono consumare i log. In Milvus, questo tipo di sistema è chiamato log broker. Grazie al log broker, i log sono disaccoppiati dal server, assicurando che Milvus sia esso stesso stateless e meglio posizionato per recuperare rapidamente da un guasto del sistema.
Broker di log
Creazione di un database vettoriale per la ricerca di similarità scalabile
Costruito sulla base delle più diffuse librerie di ricerca vettoriale, tra cui Faiss, ANNOY, HNSW e altre, Milvus è stato progettato per la ricerca di similarità su insiemi di dati vettoriali densi, contenenti milioni, miliardi o addirittura trilioni di vettori.
Standalone e cluster
Milvus offre due modalità di implementazione: standalone o cluster. In Milvus standalone, poiché tutti i nodi sono distribuiti insieme, possiamo vedere Milvus come un unico processo. Attualmente, Milvus standalone si affida a MinIO ed etcd per la persistenza dei dati e la memorizzazione dei metadati. Nelle versioni future, speriamo di eliminare queste due dipendenze di terze parti per garantire la semplicità del sistema Milvus. Il cluster Milvus comprende otto componenti di microservizi e tre dipendenze di terze parti: MinIO, etcd e Pulsar. Pulsar funge da log broker e fornisce servizi di log pub/sub.
Standalone e cluster
Uno scheletro essenziale dell'architettura Milvus
Milvus separa il flusso di dati dal flusso di controllo ed è suddiviso in quattro livelli indipendenti in termini di scalabilità e disaster recovery.
Architettura Milvus
Livello di accesso
Il livello di accesso funge da facciata del sistema, esponendo il punto finale della connessione del cliente al mondo esterno. È responsabile dell'elaborazione delle connessioni client, dell'esecuzione di verifiche statiche, di controlli dinamici di base per le richieste degli utenti, dell'inoltro delle richieste e della raccolta e restituzione dei risultati al client. Il proxy stesso è stateless e fornisce indirizzi di accesso e servizi unificati al mondo esterno attraverso componenti di bilanciamento del carico (Nginx, Kubernetess Ingress, NodePort e LVS). Milvus utilizza un'architettura di elaborazione massicciamente parallela (MPP), in cui i proxy restituiscono i risultati raccolti dai nodi worker dopo l'aggregazione globale e la post-elaborazione.
Servizio coordinatore
Il servizio coordinatore è il cervello del sistema, responsabile della gestione dei nodi della topologia del cluster, del bilanciamento del carico, della generazione dei timestamp, della dichiarazione dei dati e della gestione dei dati. Per una spiegazione dettagliata della funzione di ciascun servizio di coordinamento, leggere la documentazione tecnica di Milvus.
Nodi worker
Il nodo worker, o di esecuzione, agisce come arti del sistema, eseguendo le istruzioni emesse dal servizio coordinatore e i comandi del linguaggio di manipolazione dei dati (DML) avviati dal proxy. Un nodo worker in Milvus è simile a un nodo dati in Hadoop o a un region server in HBase. Ogni tipo di nodo worker corrisponde a un servizio coord. Per una spiegazione dettagliata della funzione di ciascun nodo worker, leggere la documentazione tecnica di Milvus.
Archiviazione
Lo storage è la pietra angolare di Milvus, responsabile della persistenza dei dati. Il livello di archiviazione è diviso in tre parti:
- Meta store: Responsabile della memorizzazione di istantanee di meta-dati come lo schema di raccolta, lo stato dei nodi, i checkpoint di consumo dei messaggi, ecc. Milvus si affida a etcd per queste funzioni ed Etcd si assume anche la responsabilità della registrazione dei servizi e dei controlli di salute.
- Broker di log: Un sistema pub/sub che supporta la riproduzione ed è responsabile della persistenza dei dati in streaming, dell'esecuzione affidabile di query asincrone, delle notifiche di eventi e della restituzione dei risultati delle query. Quando i nodi eseguono il recupero dei tempi di inattività, il log broker assicura l'integrità dei dati incrementali attraverso la riproduzione del log broker. Il cluster Milvus utilizza Pulsar come log broker, mentre la modalità standalone utilizza RocksDB. Anche i servizi di archiviazione in streaming, come Kafka e Pravega, possono essere utilizzati come log broker.
- Storage a oggetti: Memorizza i file snapshot dei log, i file degli indici scalari/vettoriali e i risultati intermedi dell'elaborazione delle query. Milvus supporta AWS S3 e Azure Blob, oltre a MinIO, un servizio di archiviazione a oggetti leggero e open-source. A causa dell'elevata latenza di accesso e della fatturazione per query dei servizi di storage a oggetti, Milvus supporterà presto pool di cache basati su memoria/SSD e la separazione dei dati caldi/freddi per migliorare le prestazioni e ridurre i costi.
Modello dei dati
Il modello dei dati organizza i dati in un database. In Milvus, tutti i dati sono organizzati per collezione, shard, partizione, segmento ed entità.
Modello di dati 1
Raccolta
Una collezione in Milvus può essere paragonata a una tabella in un sistema di archiviazione relazionale. La collezione è l'unità di dati più grande in Milvus.
Shard
Per sfruttare appieno la potenza di calcolo parallelo dei cluster durante la scrittura dei dati, le collezioni in Milvus devono distribuire le operazioni di scrittura dei dati su diversi nodi. Per impostazione predefinita, una singola raccolta contiene due shard. A seconda del volume del dataset, è possibile avere più shard in una raccolta. Milvus utilizza un metodo di hashing a chiave master per lo sharding.
Partizione
In uno shard ci sono anche più partizioni. Una partizione in Milvus si riferisce a un insieme di dati contrassegnati dalla stessa etichetta in una raccolta. I metodi di partizionamento più comuni includono il partizionamento per data, sesso, età dell'utente e altro ancora. La creazione di partizioni può favorire il processo di interrogazione, in quanto i dati possono essere filtrati in base all'etichetta della partizione.
In confronto, lo sharding si occupa più che altro di scalare le capacità in fase di scrittura dei dati, mentre il partizionamento si occupa più che altro di migliorare le prestazioni del sistema in fase di lettura dei dati.
Modello di dati 2
Segmenti
All'interno di ogni partizione, ci sono più segmenti di piccole dimensioni. Un segmento è l'unità più piccola per la pianificazione del sistema in Milvus. Esistono due tipi di segmenti: quelli in crescita e quelli sigillati. I segmenti in crescita sono sottoscritti dai nodi di interrogazione. L'utente di Milvus continua a scrivere dati in segmenti crescenti. Quando la dimensione di un segmento in crescita raggiunge un limite superiore (512 MB per impostazione predefinita), il sistema non consente di scrivere altri dati in questo segmento in crescita, sigillandolo. Gli indici sono costruiti su segmenti sigillati.
Per accedere ai dati in tempo reale, il sistema legge i dati sia nei segmenti in crescita che nei segmenti sigillati.
Entità
Ogni segmento contiene una quantità enorme di entità. Un'entità in Milvus è equivalente a una riga in un database tradizionale. Ogni entità ha un campo chiave primario unico, che può anche essere generato automaticamente. Le entità devono anche contenere un timestamp (ts) e un campo vettoriale - il cuore di Milvus.
Informazioni sulla serie Deep Dive
Con l'annuncio ufficiale della disponibilità generale di Milvus 2.0, abbiamo organizzato questa serie di blog Milvus Deep Dive per fornire un'interpretazione approfondita dell'architettura e del codice sorgente di Milvus. Gli argomenti trattati in questa serie di blog includono:
- I dati non strutturati richiedono uno stack di software di base completo
- I principi di progettazione di Milvus 2.0
- Creazione di un database vettoriale per la ricerca di similarità scalabile
- Informazioni sulla 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