🚀 Prova Zilliz Cloud, la versione completamente gestita di Milvus, gratuitamente—sperimenta prestazioni 10 volte più veloci! Prova Ora>>

milvus-logo
LFAI
  • Home
  • Blog
  • Evoluzione del database vettoriale scalabile in cloud Milvus

Evoluzione del database vettoriale scalabile in cloud Milvus

  • Engineering
December 21, 2021
Jun Gu

In questo articolo condivideremo il processo di progettazione della nuova architettura del cluster di database Milvus.

Obiettivi del database vettoriale Milvus

Quando ci è venuta in mente l'idea del database vettoriale Milvus, volevamo costruire un'infrastruttura di dati che potesse aiutare le persone ad accelerare l'adozione dell'IA nelle loro organizzazioni.

Per adempiere a questa missione, abbiamo fissato due obiettivi cruciali per il progetto Milvus.

Facilità d'uso

L'IA/ML è un'area emergente in cui si affacciano continuamente nuove tecnologie. La maggior parte degli sviluppatori non ha molta familiarità con le tecnologie e gli strumenti dell'IA in rapida crescita. Gli sviluppatori hanno già consumato la maggior parte delle loro energie per trovare, addestrare e mettere a punto i modelli. È difficile per loro spendere ulteriori sforzi per gestire le grandi quantità di vettori di incorporamento generati dai modelli. Senza contare che la manipolazione di un grande volume di dati è sempre un compito molto impegnativo.

Per questo motivo, la "facilità d'uso" ha una priorità molto alta, in quanto potrebbe ridurre significativamente i costi di sviluppo.

Bassi costi di gestione

Uno degli ostacoli principali dell'IA in produzione è giustificare il ritorno dell'investimento. Avremmo più opportunità di mettere in produzione le nostre applicazioni di IA con costi di gestione inferiori. E questo favorirebbe l'aumento del margine dei potenziali benefici.

Principi di progettazione di Milvus 2.0

Con Milvus 1.0 abbiamo iniziato a raggiungere questi obiettivi. Ma non è sufficiente, soprattutto per quanto riguarda la scalabilità e la disponibilità. Abbiamo quindi iniziato lo sviluppo di Milvus 2.0 per migliorare questi punti. I principi che abbiamo stabilito per questa nuova versione comprendono:

  • Puntare a un'elevata scalabilità e disponibilità
  • Basarsi su infrastrutture e pratiche cloud mature
  • compromissione minima delle prestazioni nel cloud

In altre parole, vogliamo rendere il cluster di database Milvus cloud-native.

L'evoluzione dei cluster di database

Il database vettoriale è una nuova specie di database, poiché gestisce nuovi tipi di dati (vettori). Ma condivide le stesse sfide degli altri database, con alcuni requisiti propri. Nel resto dell'articolo, mi concentrerò su ciò che abbiamo imparato dalle implementazioni dei cluster di database esistenti e sul processo di progettazione della nuova architettura del gruppo Milvus.

Se siete interessati ai dettagli dell'implementazione dei componenti del gruppo Milvus, vi invito a seguire la documentazione di Milvus. Pubblicheremo continuamente articoli tecnici nel repo GitHub di Milvus, nel sito web di Milvus e nel blog di Milvus.

Il cluster di database ideale

"Puntare su piccole cose, sbagliare su piccole cose".

Elenchiamo innanzitutto le funzionalità critiche che un cluster di database ideale dovrebbe avere.

  1. Concorrenza e assenza di un singolo punto di guasto: gli utenti collegati a diversi membri del gruppo possono accedere contemporaneamente in lettura/scrittura alla stessa porzione di dati.
  2. Coerenza: i diversi membri del gruppo devono vedere gli stessi dati.
  3. Scalabilità: possiamo aggiungere o rimuovere membri del gruppo in qualsiasi momento.

Onestamente, tutte queste funzionalità sono difficili da acquisire insieme. Nelle moderne implementazioni dei cluster di database, le persone devono scendere a compromessi su alcune di queste funzionalità. Le persone non si aspettano un cluster di database perfetto, purché si adatti agli scenari degli utenti. Tuttavia, un tempo il cluster shared-everything era molto vicino a un cluster di database ideale. Se vogliamo imparare qualcosa, dobbiamo partire da qui.

Le considerazioni chiave di un cluster di database

Il cluster shared-everything ha una storia più lunga rispetto ad altre implementazioni moderne. Il gruppo di condivisione dei dati Db2 e Oracle RAC sono tipici cluster di tipo shared-everything. Molti pensano che condividere tutto significhi condividere i dischi. È molto di più.

Un cluster shared-everything ha solo un tipo di database membro del gruppo. Gli utenti possono connettersi a uno qualsiasi di questi membri simmetrici per accedere a qualsiasi dato. Che cos'è "tutto" che deve essere condiviso per far funzionare questo sistema?

La sequenza degli eventi nel gruppo

In primo luogo, la sequenza degli eventi del gruppo è fondamentale per risolvere i potenziali conflitti causati dall'accesso simultaneo di diversi membri del gruppo. Di solito si usa il numero di sequenza del record di log del database per rappresentare la sequenza degli eventi. Allo stesso tempo, il numero di sequenza del record di log è generalmente generato dal timestamp.

Pertanto, il requisito della sequenza di eventi di gruppo equivale alla necessità di un timer globale. Se potessimo avere un orologio atomico per il gruppo, sarebbe fantastico. Tuttavia, Milvus è un progetto software open-source, il che significa che dovremmo affidarci a risorse comunemente disponibili. Ad oggi, un orologio atomico è ancora un'opzione premium per le grandi aziende.

Abbiamo implementato il componente di sincronizzazione dell'ora nel cluster di database Milvus 2.0. Il link è riportato nell'appendice.

Blocco globale

Il database dispone di un meccanismo di blocco per risolvere i conflitti di accesso simultanei, sia che si tratti di blocchi ottimistici che pessimistici. Allo stesso modo, abbiamo bisogno di un blocco globale per risolvere i conflitti di accesso simultanei tra i diversi membri del gruppo.

Il blocco globale significa che i diversi membri del gruppo devono parlare tra loro per negoziare le richieste di blocco. L'efficienza di questo processo di negoziazione del blocco globale è influenzata da diversi fattori vitali:

  • La velocità delle connessioni intersistema
  • Il numero di membri del gruppo che devono partecipare al processo di negoziazione.
  • La frequenza dei conflitti di gruppo

La dimensione tipica di un gruppo non supera le 100 unità. Ad esempio, Db2 DSG è 32; Oracle RAC è 100. I membri del gruppo saranno collocati in una sala server collegata con fibra ottica per ridurre al minimo la latenza di trasferimento. Ecco perché a volte viene chiamato cluster centralizzato. A causa della limitazione delle dimensioni del gruppo, si scelgono server di fascia alta (mainframe o minicomputer, che hanno molta più capacità in termini di CPU, memoria, canali di I/O e così via) per costituire i cluster condivisi.

Questa presunzione hardware è cambiata drasticamente nel moderno ambiente cloud. Oggi i data center cloud comprendono sale server ad alta densità piene di (migliaia di) server X86 di base con connessioni TCP/IP. Se ci affidiamo a questi server X86 per costruire il cluster di database, le dimensioni del gruppo dovrebbero aumentare fino a centinaia (anche migliaia) di macchine. E in alcuni scenari aziendali, vorremmo che queste centinaia di macchine X86 fossero distribuite in diverse regioni. Pertanto, l'implementazione del blocco globale potrebbe non valere più la pena, poiché le prestazioni del blocco globale non saranno sufficientemente buone.

In Milvus 2.0 non implementeremo la funzione di blocco globale. Da un lato, non è possibile aggiornare i dati vettoriali. (Non dobbiamo quindi preoccuparci dei conflitti tra più scrittori sullo stesso pezzo di dati nel gruppo Milvus con disposizione sharding. Nel frattempo, potremmo usare MVCC (multi-version concurrency control, un metodo di controllo della concorrenza che evita i blocchi) per risolvere i conflitti lettore-scrittore.

D'altra parte, l'elaborazione di dati vettoriali consuma un'impronta di memoria molto più elevata rispetto all'elaborazione di dati strutturati. Si cerca una scalabilità molto più elevata nei database vettoriali.

Cache di dati in-memory condivisa

Possiamo dividere brevemente un motore di database in due parti: il motore di archiviazione e il motore di elaborazione. Il motore di memorizzazione è responsabile di due compiti fondamentali:

  • Scrivere i dati nell'archivio permanente per garantire la durata.
  • Caricare i dati dalla memoria permanente alla cache dei dati in-memory (alias buffer pool); questo è l'unico posto in cui il motore di elaborazione accede ai dati.

Nello scenario del cluster di database, cosa succede se il membro A ha aggiornato i dati memorizzati nella cache del membro B? Come fa il membro B a sapere che i suoi dati in memoria sono scaduti? Il cluster classico shared-everything prevede un meccanismo di buffer cross invalidation per risolvere questo problema. Il meccanismo di invalidazione incrociata del buffer funziona in modo simile al blocco globale se si mantiene una forte coerenza tra i membri del gruppo. Come già detto, questo non è pratico nel moderno ambiente cloud. Per questo motivo abbiamo deciso di abbassare il livello di coerenza nel gruppo Milvus scalabile in cloud a una modalità di coerenza eventuale. In questo modo, il meccanismo di invalidazione del buffer cross in Milvus 2.0 può essere un processo asincrono.

Archiviazione condivisa

Lo storage condiviso è probabilmente la prima cosa a cui si pensa quando si parla di un cluster di database.

Anche le opzioni di archiviazione sono cambiate in modo significativo negli ultimi anni di evoluzione del cloud storage. La rete SAN (Storage Attached Network) era (ed è tuttora) il fondamento dello storage per il gruppo shared-everything. Ma nell'ambiente cloud non esiste una SAN. Il database deve utilizzare il disco locale collegato alle macchine virtuali del cloud. L'uso del disco locale introduce il problema della coerenza dei dati tra i membri del gruppo. Inoltre, dobbiamo preoccuparci dell'alta disponibilità dei membri del gruppo.

Poi Snowflake ha creato un grande modello di ruolo per i database nel cloud utilizzando lo storage condiviso nel cloud (storage S3). Questo modello ispira anche Milvus 2.0. Come già detto, intendiamo affidarci a un'infrastruttura cloud matura. Ma prima di poter utilizzare il cloud storage condiviso, dobbiamo pensare a un paio di cose.

In primo luogo, lo storage S3 è economico e affidabile, ma non è progettato per un accesso istantaneo R/W come negli scenari dei database. Dobbiamo creare i componenti di dati (che in Milvus 2.0 chiamiamo nodi di dati) per fare da ponte tra la memoria/disco locale e lo storage S3. Ci sono alcuni esempi (come Alluxio, JuiceFS, ecc.) che potremmo imparare. Il motivo per cui non possiamo integrare direttamente questi progetti è che ci concentriamo su una granularità di dati diversa. Alluxio e JuiceFS sono progettati per insiemi di dati o file POSIX, mentre noi ci concentriamo sul livello dei record di dati (vettori).

Quando i dati vettoriali vengono archiviati su S3, la risposta per i metadati è semplice: archiviarli in ETCD. E i dati di log? Nelle implementazioni classiche, anche l'archivio dei log è basato su SAN. I file di log di un membro del gruppo di database sono condivisi all'interno del cluster di database per scopi di ripristino dei guasti. Quindi questo non era un problema fino a quando non siamo entrati nell'ambiente cloud.

Nel documento di Spanner, Google ha illustrato come ha implementato il database (gruppo) distribuito a livello globale con l'algoritmo di consenso Paxos. È necessario programmare il cluster di database come un gruppo di repliche di macchine a stati. Il redo log è solitamente lo "stato" che verrà replicato nel gruppo.

La replica del redo log mediante algoritmi di consenso è uno strumento potente e presenta notevoli vantaggi in alcuni scenari aziendali. Ma per il database vettoriale Milvus non troviamo sufficienti incentivi per la creazione di un gruppo di replica della macchina di stato nel suo complesso. Abbiamo deciso di utilizzare la coda/piattaforma di messaggistica cloud (Apache Pulsar, Apache Kafka, ecc.) come archivio condiviso cloud alternativo per il log store. Delegando l'archivio dei registri alla piattaforma di messaggistica, abbiamo ottenuto i seguenti vantaggi.

  • Il gruppo è più orientato agli eventi, il che significa che molti processi possono essere asincroni. Migliora la scalabilità.
  • I componenti sono più accoppiati in modo lasco, il che rende molto più facile l'esecuzione di aggiornamenti online. Migliora la disponibilità e l'operatività.

Riprenderemo questo argomento nella sezione successiva.

Finora abbiamo concluso le considerazioni cruciali sul cluster di database. Prima di passare alla discussione sull'architettura di Milvus 2.0, vorrei spiegare come gestiamo i vettori in Milvus.

Gestione dei dati e prevedibilità delle prestazioni

Milvus memorizza i vettori in collezioni. La "collezione" è un concetto logico, equivalente a una "tabella" nei database SQL. Una "collezione" può avere più file fisici per conservare i vettori. Un file fisico è un "segmento". Il "segmento" è un concetto fisico, come un file tablespace nei database SQL. Quando il volume dei dati è piccolo, possiamo salvare tutto in un singolo segmento/file fisico. Al giorno d'oggi, però, ci troviamo costantemente di fronte a dati di grandi dimensioni. Quando ci sono più segmenti/file fisici, come possiamo distribuire i dati in diverse partizioni?

Anche se i dati vengono prima degli indici, dobbiamo memorizzare i dati nel modo preferito dall'algoritmo dell'indice per rendere efficiente l'accesso ai dati nella maggior parte dei casi. Una strategia frequentemente utilizzata nei database SQL è la partizione in base all'intervallo di valori della chiave di partizione. Di solito si crea un indice clusterizzato per applicare la chiave di partizione. Nel complesso, si tratta di un approccio corretto per i database SQL. I dati vengono memorizzati in buona forma, ottimizzati per l'I/O (prefetch). Ma ci sono ancora dei difetti.

  • Skew dei dati. Alcune partizioni possono contenere molti più dati di altre. La distribuzione dei dati del mondo reale non è semplice come l'intervallo numerico.
  • Hotspot di accesso. Il carico di lavoro potrebbe essere maggiore per alcune partizioni di dati.

Immaginate che un carico di lavoro maggiore vada alle partizioni con più dati. È necessario riequilibrare i dati tra le partizioni quando si verificano queste situazioni. (Questa è la noiosa vita quotidiana di un DBA).

The Clustered index for vectors L'indice clusterizzato per i vettori

Possiamo anche creare un indice cluster per i vettori (un indice a lista invertita). Ma questo non è lo stesso caso dei database SQL. Una volta costruito l'indice nei database SQL, è molto efficiente accedere ai dati attraverso l'indice, con meno calcoli e meno operazioni di I/O. Ma per i dati vettoriali, ci sarà un'alta concentrazione di dati. Per i dati vettoriali, invece, le operazioni di calcolo e di I/O sono molto più numerose anche con un indice. Pertanto, i difetti menzionati in precedenza avranno un impatto più grave sui cluster di database vettoriali. Inoltre, il costo del ribilanciamento dei vettori tra i diversi segmenti è molto elevato a causa del volume dei dati e della complessità di calcolo.

In Milvus, utilizziamo la strategia della partizione per crescita. Quando iniettiamo dati in una collezione di vettori, Milvus aggiunge i nuovi vettori all'ultimo segmento della collezione. Milvus chiude il segmento quando la sua dimensione è sufficientemente grande (la soglia è configurabile) e costruisce l'indice per il segmento chiuso. Nel frattempo, viene creato un nuovo segmento per memorizzare i dati in arrivo. Questa semplice strategia è più equilibrata per l'elaborazione vettoriale.

La query vettoriale è un processo di ricerca dei candidati più simili nella collezione di vettori. È una procedura tipica di MapReduce. Ad esempio, vogliamo cercare i primi 20 risultati simili da una collezione di vettori con dieci segmenti. Possiamo cercare i primi 20 su ciascuno dei segmenti e poi unire i 20 * 10 risultati nei 20 risultati finali. Poiché ogni segmento ha la stessa quantità di vettori e un indice simile, il tempo di elaborazione su ogni segmento è quasi identico. Questo ci offre il vantaggio della prevedibilità delle prestazioni, che è essenziale quando si pianifica la scala dei cluster del database.

Nuovi paradigmi in Milvus 2.0

In Milvus 1.0 abbiamo implementato un gruppo di sharding con suddivisione in lettura/scrittura come la maggior parte dei database SQL. Era un buon tentativo di scalare il cluster di database Milvus. Ma i problemi sono abbastanza evidenti.

Milvus database 1.0 Database Milvus 1.0

In Milvus 1.0, il nodo R/W deve occuparsi completamente dell'ultimo segmento, compresa l'aggiunta di vettori, la ricerca in questo segmento non indicizzato, la costruzione dell'indice, ecc. Poiché ogni collezione ha un solo scrittore, quest'ultimo è molto occupato se i dati vengono inviati continuamente al sistema. Anche le prestazioni della condivisione dei dati tra il nodo R/W e i nodi di lettura rappresentano un problema. Inoltre, per l'archiviazione condivisa dei dati dobbiamo affidarci a NFS (non stabile) o a un cloud storage premium (troppo costoso).

Questi problemi esistenti sono difficili da affrontare con l'architettura Milvus 1.0. Pertanto, abbiamo introdotto nuovi paradigmi nel progetto di Milvus 2.0 per risolvere questi problemi.

Milvus architecture Architettura di Milvus

Modello ad attori

Esistono due modelli per programmare sistemi di calcolo concorrente.

  • Memoria condivisa, che significa controllo della concorrenza (locking) ed elaborazione sincrona.
  • Il modello ad attori (AKA message passing) significa elaborazione guidata dai messaggi e asincrona.

Questi due modelli possono essere applicati anche ai cluster di database distribuiti.

Come detto in precedenza, la maggior parte dei database distribuiti di alto profilo utilizza lo stesso metodo: la replica dei redo-log tramite algoritmi di consenso. Si tratta di un'elaborazione sincrona che utilizza algoritmi di consenso per costruire una memoria condivisa distribuita per i record di redo-log. Diverse aziende e venture capital hanno investito miliardi di dollari in questa tecnologia. Non ho voluto commentare questo aspetto fino a quando non abbiamo iniziato a lavorare su Milvus 2.0. Molti considerano questa tecnologia come l'unico modo per realizzare sistemi di database distribuiti. Questo è fastidioso. Se non dico qualcosa, la gente potrebbe fraintendere che siamo stati avventati nella progettazione di database distribuiti.

Negli ultimi anni, la replica di Redo-log mediante algoritmi di consenso è stata la tecnologia di database più sopravvalutata. I problemi principali sono due.

  • La presunzione che la replica dei redo-log sia migliore è fragile.
  • I venditori ingannano le aspettative sulle capacità degli algoritmi di consenso.

Supponiamo di avere due nodi di database, il nodo sorgente e il nodo di destinazione. All'inizio hanno la copia esatta dei dati. Abbiamo alcune operazioni di modifica (istruzioni SQL I/U/D) sul nodo sorgente e vogliamo mantenere aggiornato il nodo di destinazione. Che cosa dobbiamo fare? Il modo più semplice è riprodurre le operazioni sul nodo di destinazione. Ma questo non è il modo più efficiente.

Pensando al costo di esecuzione di un'istruzione I/U/D, possiamo dividerlo in una parte di preparazione all'esecuzione e in una parte di lavoro fisico. La parte di preparazione all'esecuzione comprende il lavoro del parser SQL, dell'ottimizzatore SQL e così via. Indipendentemente dal numero di record di dati interessati, si tratta di un costo fisso. Il costo della parte di lavoro fisico dipende dal numero di record di dati interessati; è un costo variabile. L'idea alla base della replica del redo-log è di risparmiare il costo fisso sul nodo di destinazione; si riproduce solo il redo-log (il lavoro fisico) sul nodo di destinazione.

La percentuale di risparmio è il reciproco del numero di record del redo-log. Se un'operazione ha effetto su un solo record, dovrei vedere un risparmio significativo dalla replica del redo-log. E se si tratta di 10.000 record? Allora dovremmo preoccuparci dell'affidabilità della rete. Quale dei due è più affidabile, l'invio di una sola operazione o quello di 10.000 record di redo-log? E se si trattasse di un milione di record? La replica dei redo-log è super in scenari come i sistemi di pagamento, i sistemi di metadati, ecc. In questi scenari, ogni operazione I/U/D del database riguarda solo un numero ridotto di record (1 o 2). Ma è difficile lavorare con carichi di lavoro ad alta intensità di I/O come i lavori batch.

I venditori affermano sempre che gli algoritmi di consenso possono fornire una forte coerenza ai cluster di database. Ma le persone usano gli algoritmi di consenso solo per replicare i record del redo-log. I record di redo-log sono coerenti su nodi diversi, ma questo non significa che anche le viste dei dati su altri nodi siano coerenti. Dobbiamo unire i record del redo-log ai record della tabella reale. Quindi, anche con l'elaborazione sincrona, si può ottenere solo una consistenza finale delle viste dei dati.

Dovremmo utilizzare la replica dei redo-log tramite algoritmi di consenso nei punti appropriati. Il sistema di metadati (ETCD) e la piattaforma di messaggistica (ad esempio, Apache Pulsar) utilizzati in Milvus 2.0 hanno implementato algoritmi di consenso. Ma, come ho detto prima, "per il database vettoriale di Milvus, non troviamo sufficienti incentivi per essere un gruppo di replicazione di macchine a stati nel suo complesso".

In Milvus 2.0, utilizziamo il modello ad attori per organizzare i nodi lavoratori. I nodi lavoratori sono solitari. Parlano solo con la piattaforma di messaggistica, ricevendo comandi e inviando risultati. Sembra noioso.

"Qual è il nostro motto?" "La noia è sempre la cosa migliore" - The Hitman's Bodyguard (2017)

Il modello ad attori è asincrono. È adatto alla scalabilità e alla disponibilità. Poiché i nodi worker non si conoscono tra loro, non c'è alcun impatto sugli altri nodi worker se alcuni di essi si uniscono o vengono rimossi.

Separazione di disponibilità e durata

In Milvus 2.0, facciamo l'operation replay piuttosto che il log replay, perché nel database vettoriale non c'è molta differenza tra operation replay e log replay. Non abbiamo la funzione Update né la funzione Insert with Select. Inoltre, è molto più semplice eseguire il replay delle operazioni con il modello ad attori.

Quindi più nodi worker possono eseguire la stessa operazione dalla piattaforma di messaggistica in base alla loro responsabilità. Ho già detto che abbiamo deciso di utilizzare il cloud storage S3 come livello di storage condiviso del cluster di database Milvus. Lo storage S3 è molto affidabile. È quindi necessario che diversi nodi worker scrivano gli stessi dati sullo storage condiviso?

Abbiamo quindi progettato tre ruoli per i nodi worker.

  • Il nodo di interrogazione mantiene una vista dei dati in memoria in base all'assegnazione. Il lavoro del nodo di interrogazione comprende la ricerca vettoriale e l'aggiornamento dei dati in memoria. Ma non ha bisogno di scrivere nulla sullo storage S3. È il nodo più sensibile alla memoria del gruppo.
  • Il nodo dati è responsabile della scrittura dei nuovi dati nello storage S3. Il nodo dati non ha bisogno di mantenere la vista dei dati in memoria, quindi la configurazione hardware del nodo dati è molto diversa da quella del nodo query.
  • Il nodo indice costruisce indici per i segmenti chiusi dal nodo dati quando la dimensione dei segmenti raggiunge la soglia. Si tratta del lavoro più impegnativo per la CPU del gruppo.

Questi tre tipi di nodi rappresentano diversi tipi di carico di lavoro. Possono scalare in modo indipendente. La chiamiamo separazione di disponibilità e durabilità, imparata dal database cloud Microsoft Socrates.

La fine, ma anche l'inizio

Questo articolo ha passato in rassegna diverse decisioni progettuali del database vettoriale Milvus 2.0. Riassumiamo rapidamente questi punti.

  • Abbiamo scelto la consistenza finale di Milvus cluster 2.0.
  • Abbiamo integrato il più possibile i componenti cloud maturi in Milvus 2.0. Abbiamo controllato i nuovi componenti introdotti da Milvus 2.0 negli ambienti di produzione degli utenti.
  • Seguendo il modello ad attori e la separazione tra disponibilità e durata, Milvus 2.0 è facile da scalare nell'ambiente cloud.

Finora abbiamo formato la spina dorsale del database Milvus 2.0 scalabile in cloud, ma il nostro backlog contiene molti requisiti della comunità Milvus che devono essere soddisfatti. Se anche voi avete la stessa missione ("Costruire più software infrastrutturale open-source per accelerare la trasformazione dell'intelligenza artificiale"), vi invitiamo a unirvi alla comunità di Milvus.

Milvus è un progetto di laurea della fondazione LF AI & Data. Non è necessario firmare alcun CLA per Milvus!

Appendice

Documento di progettazione di Milvus

https://github.com/milvus-io/milvus/tree/master/docs/design_docs

Implementazione di Raft in C++

Se siete ancora interessati all'algoritmo di consenso, vi suggerisco di controllare il progetto open-source Gringofts di eBay. Si tratta di un'implementazione in C++ dell'algoritmo di consenso Raft (una variante della famiglia Paxos). Il mio amico Jacky ed Elvis (miei ex colleghi alla Morgan Stanley) lo hanno realizzato per il sistema di pagamento online di eBay, che è proprio uno degli scenari più adatti a questa tecnologia.

Try Managed Milvus for Free

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

Get Started

Like the article? Spread the word

Continua a Leggere