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

milvus-logo
LFAI
  • Home
  • Blog
  • Garanzia di qualità del software open source (OSS) - Un caso di studio di Milvus

Garanzia di qualità del software open source (OSS) - Un caso di studio di Milvus

  • Engineering
April 25, 2022
Wenxing Zhu

Cover image Immagine di copertina

Questo articolo è stato scritto da Wenxing Zhu e trascritto da Angela Ni.

L'assicurazione della qualità (AQ) è un processo sistematico per determinare se un prodotto o un servizio soddisfa determinati requisiti. Un sistema di AQ è una parte indispensabile del processo di R&S perché, come suggerisce il nome, assicura la qualità del prodotto.

Questo post introduce il quadro di riferimento per l'AQ adottato nello sviluppo del database vettoriale Milvus, con l'obiettivo di fornire una linea guida per gli sviluppatori e gli utenti che contribuiscono al processo. Verranno inoltre illustrati i principali moduli di test di Milvus, nonché i metodi e gli strumenti che possono essere utilizzati per migliorare l'efficienza dei test QA.

Vai a:

Introduzione generale al sistema QA di Milvus

L'architettura del sistema è fondamentale per condurre i test QA. Più un ingegnere QA conosce il sistema, più è probabile che riesca a elaborare un piano di test ragionevole ed efficiente.

Milvus architecture Architettura di Milvus

Milvus 2.0 adotta un'architettura cloud-native, distribuita e stratificata, con l'SDK come ingresso principale per il flusso dei dati in Milvus. Gli utenti di Milvus utilizzano l'SDK molto spesso, quindi i test funzionali sul lato SDK sono molto necessari. Inoltre, i test funzionali sull'SDK possono aiutare a rilevare i problemi interni che potrebbero esistere nel sistema Milvus. Oltre ai test funzionali, verranno condotti anche altri tipi di test sul database vettoriale, tra cui test unitari, test di distribuzione, test di affidabilità, test di stabilità e test di prestazioni.

Un'architettura cloud-native e distribuita comporta sia vantaggi che sfide per i test QA. A differenza dei sistemi distribuiti ed eseguiti localmente, un'istanza di Milvus distribuita ed eseguita su un cluster Kubernetes può garantire che i test del software vengano eseguiti nelle stesse circostanze dello sviluppo del software. Tuttavia, l'aspetto negativo è che la complessità dell'architettura distribuita comporta maggiori incertezze che possono rendere il test QA del sistema ancora più difficile e faticoso. Ad esempio, Milvus 2.0 utilizza microservizi di diversi componenti, il che comporta un numero maggiore di servizi e nodi e una maggiore possibilità di errore del sistema. Di conseguenza, è necessario un piano di AQ più sofisticato e completo per migliorare l'efficienza dei test.

Test QA e gestione dei problemi

La QA in Milvus comprende sia la conduzione di test che la gestione dei problemi emersi durante lo sviluppo del software.

Test QA

Milvus conduce diversi tipi di test QA in base alle caratteristiche di Milvus e alle esigenze degli utenti, in ordine di priorità, come mostrato nell'immagine seguente.

QA testing priority Priorità dei test QA

In Milvus i test QA sono condotti sui seguenti aspetti in base alla seguente priorità:

  1. Funzione: Verifica se le funzioni e le caratteristiche funzionano come progettato originariamente.
  2. Distribuzione: Verificare se l'utente può distribuire, reinstallare e aggiornare sia la versione standalone di Mivus che il cluster Milvus con metodi diversi (Docker Compose, Helm, APT o YUM, ecc.).
  3. Prestazioni: Verifica delle prestazioni dell'inserimento dei dati, dell'indicizzazione, della ricerca vettoriale e dell'interrogazione in Milvus.
  4. Stabilità: Verificare se Milvus può funzionare in modo stabile per 5-10 giorni con un carico di lavoro normale.
  5. Affidabilità: Verificare se Milvus può continuare a funzionare parzialmente in caso di errori di sistema.
  6. Configurazione: Verificare se Milvus funziona come previsto con determinate configurazioni.
  7. Compatibilità: Verifica se Milvus è compatibile con diversi tipi di hardware o software.

Gestione dei problemi

Durante lo sviluppo del software possono emergere molti problemi. Gli autori dei problemi possono essere gli stessi ingegneri QA o gli utenti di Milvus della comunità open-source. Il team QA è responsabile della risoluzione dei problemi.

Issue management workflow Flusso di lavoro della gestione dei problemi

Quando viene creato un problema, questo viene prima sottoposto al triage. Durante il triage, i nuovi problemi vengono esaminati per assicurarsi che siano forniti dettagli sufficienti. Se il problema è confermato, verrà accettato dagli sviluppatori che cercheranno di risolverlo. Una volta terminato lo sviluppo, l'autore del problema deve verificare se è stato risolto. In caso affermativo, il problema verrà chiuso.

Quando è necessaria la QA?

Un'idea sbagliata comune è che QA e sviluppo siano indipendenti l'uno dall'altro. In realtà, per garantire la qualità del sistema, sono necessari gli sforzi sia degli sviluppatori che degli ingegneri QA. Pertanto, l'AQ deve essere coinvolta durante l'intero ciclo di vita.

QA lifecycle Ciclo di vita della QA

Come mostrato nella figura precedente, un ciclo di vita completo di ricerca e sviluppo del software comprende tre fasi.

Durante la fase iniziale, gli sviluppatori pubblicano la documentazione di progettazione, mentre gli ingegneri QA elaborano piani di test, definiscono i criteri di rilascio e assegnano i compiti QA. Gli sviluppatori e gli ingegneri QA devono avere familiarità con il documento di progettazione e con il piano di test, in modo che i due team condividano l'obiettivo del rilascio (in termini di funzionalità, prestazioni, stabilità, convergenza dei bug, ecc.

Durante la fase di R&S, i test di sviluppo e di AQ interagiscono frequentemente per sviluppare e verificare le caratteristiche e le funzioni e per risolvere i bug e i problemi segnalati dalla comunità open-source.

Nella fase finale, se i criteri di rilascio sono soddisfatti, viene rilasciata una nuova immagine Docker della nuova versione di Milvus. Per il rilascio ufficiale è necessaria una nota di rilascio incentrata sulle nuove funzionalità e sui bug risolti e un tag di rilascio. Il team QA pubblicherà anche un rapporto di test su questo rilascio.

Moduli di test in Milvus

Ci sono diversi moduli di test in Milvus e questa sezione spiegherà ogni modulo in dettaglio.

Test unitario

Unit test Test unitario

I test delle unità possono aiutare a identificare i bug del software in una fase iniziale e fornire un criterio di verifica per la ristrutturazione del codice. Secondo i criteri di accettazione delle richieste di pull (PR) di Milvus, la copertura dei test unitari del codice dovrebbe essere dell'80%.

Test di funzione

I test di funzionamento in Milvus sono organizzati principalmente intorno a PyMilvus e agli SDK. Lo scopo principale dei test di funzionamento è verificare se le interfacce possono funzionare come progettato. I test di funzionamento hanno due aspetti:

  • Verificare se gli SDK possono restituire i risultati attesi quando vengono passati i parametri corretti.
  • Verificare se gli SDK sono in grado di gestire gli errori e di restituire messaggi di errore ragionevoli quando vengono passati parametri errati.

La figura seguente illustra l'attuale struttura per i test di funzione, basata sul framework mainstream pytest. Questo framework aggiunge un wrapper a PyMilvus e potenzia i test con un'interfaccia di test automatizzata.

Function test Test delle funzioni

Considerando che è necessario un metodo di test condiviso e che alcune funzioni devono essere riutilizzate, viene adottato il framework di test di cui sopra, piuttosto che utilizzare direttamente l'interfaccia di PyMilvus. Il framework include anche un modulo "check" per rendere più agevole la verifica dei valori attesi e reali.

Nella directory tests/python_client/testcases sono stati inseriti ben 2.700 casi di test funzionali, che coprono quasi tutte le interfacce di PyMilvus. Questi test funzionali controllano rigorosamente la qualità di ogni PR.

Test di distribuzione

Milvus è disponibile in due modalità: standalone e cluster. Esistono due modi principali per distribuire Milvus: utilizzando Docker Compose o Helm. Dopo aver distribuito Milvus, gli utenti possono anche riavviare o aggiornare il servizio Milvus. Esistono due categorie principali di test di distribuzione: test di riavvio e test di aggiornamento.

Il test di riavvio si riferisce al processo di verifica della persistenza dei dati, cioè se i dati sono ancora disponibili dopo un riavvio. Il test di aggiornamento si riferisce al processo di verifica della compatibilità dei dati per evitare che vengano inseriti in Milvus formati di dati incompatibili. Entrambi i tipi di test di distribuzione condividono lo stesso flusso di lavoro, come illustrato nell'immagine seguente.

Deployment test Test di distribuzione

In un test di riavvio, le due distribuzioni utilizzano la stessa immagine docker. In un test di aggiornamento, invece, il primo deployment utilizza un'immagine docker di una versione precedente, mentre il secondo deployment utilizza un'immagine docker di una versione successiva. I risultati e i dati del test vengono salvati nel file Volumes o nel persistent volume claim (PVC).

Durante l'esecuzione del primo test, vengono create più raccolte e vengono eseguite diverse operazioni su ciascuna raccolta. Quando si esegue il secondo test, l'obiettivo principale è verificare se le raccolte create sono ancora disponibili per le operazioni CRUD e se è possibile creare nuove raccolte.

Test di affidabilità

I test sull'affidabilità di un sistema distribuito cloud-native adottano solitamente un metodo di ingegneria del caos, il cui scopo è quello di bloccare sul nascere gli errori e i guasti del sistema. In altre parole, in un test di ingegneria del caos, creiamo di proposito guasti del sistema per identificare i problemi nei test di pressione e risolvere i guasti del sistema prima che inizino davvero a creare pericoli. Durante un test sul caos in Milvus, scegliamo Chaos Mesh come strumento per creare il caos. Ci sono diversi tipi di guasti da creare:

  • Pod kill: una simulazione dello scenario in cui i nodi sono fuori uso.
  • Fallimento del pod: Verifica se uno dei pod dei nodi worker si guasta e se l'intero sistema può continuare a funzionare.
  • Memory stress: simulazione di un forte consumo di risorse di memoria e CPU da parte dei nodi di lavoro.
  • Partizione di rete: Poiché Milvus separa l'archiviazione dall'elaborazione, il sistema si basa molto sulla comunicazione tra i vari componenti. Per verificare l'interdipendenza dei diversi componenti di Milvus, è necessaria una simulazione dello scenario in cui la comunicazione tra i diversi pod è partizionata.

Reliability test Test di affidabilità

La figura precedente mostra il framework di test di affidabilità di Milvus che può automatizzare i test di caos. Il flusso di lavoro di un test di affidabilità è il seguente:

  1. Inizializzare un cluster Milvus leggendo le configurazioni di distribuzione.
  2. Quando il cluster è pronto, si esegue test_e2e.py per verificare se le funzionalità di Milvus sono disponibili.
  3. Eseguire hello_milvus.py per verificare la persistenza dei dati. Creare una collezione chiamata "hello_milvus" per l'inserimento dei dati, il flush, la costruzione dell'indice, la ricerca vettoriale e l'interrogazione. Questa collezione non verrà rilasciata o abbandonata durante il test.
  4. Creare un oggetto di monitoraggio che avvii sei thread che eseguano le operazioni di creazione, inserimento, lavaggio, indicizzazione, ricerca e interrogazione.
checkers = {
    Op.create: CreateChecker(),
    Op.insert: InsertFlushChecker(),
    Op.flush: InsertFlushChecker(flush=True),
    Op.index: IndexChecker(),
    Op.search: SearchChecker(),
    Op.query: QueryChecker()
}
  1. Eseguire la prima asserzione: tutte le operazioni hanno successo come previsto.
  2. Introdurre un errore di sistema in Milvus utilizzando Chaos Mesh per analizzare il file yaml che definisce l'errore. Un guasto può essere, ad esempio, l'uccisione del nodo di interrogazione ogni cinque secondi.
  3. Fare la seconda affermazione durante l'introduzione di un errore di sistema: giudicare se i risultati restituiti dalle operazioni in Milvus durante un errore di sistema corrispondono alle aspettative.
  4. Eliminare il guasto tramite Chaos Mesh.
  5. Quando il servizio Milvus viene ripristinato (cioè tutti i pod sono pronti), fare la terza asserzione: tutte le operazioni hanno avuto successo come previsto.
  6. Eseguire test_e2e.py per verificare se le funzionalità di Milvus sono disponibili. Alcune operazioni durante il caos potrebbero essere bloccate a causa della terza asserzione. E anche dopo che il caos è stato eliminato, alcune operazioni potrebbero continuare a essere bloccate, impedendo alla terza asserzione di avere successo come previsto. Questo passo ha lo scopo di facilitare la terza asserzione e serve come standard per verificare se il servizio Milvus si è ripreso.
  7. Eseguire hello_milvus.py, caricare la raccolta creata ed eseguire operazioni CRUP sulla raccolta. Quindi, verificare se i dati esistenti prima del guasto del sistema sono ancora disponibili dopo il ripristino del guasto.
  8. Raccogliere i log.

Test di stabilità e prestazioni

La figura seguente descrive gli scopi, gli scenari di test e le metriche dei test di stabilità e prestazioni.

Test di stabilitàTest delle prestazioni
Scopi- Assicurarsi che Milvus possa funzionare senza problemi per un periodo di tempo determinato con un carico di lavoro normale.
- Assicurarsi che le risorse vengano consumate in modo stabile all'avvio del servizio Milvus.
- Testare le prestazioni di tutte le interfacce di Milvus.
- Trovare la configurazione ottimale con l'aiuto dei test di prestazione.
- Servono come benchmark per le versioni future.
- Individuare i colli di bottiglia che ostacolano il miglioramento delle prestazioni.
Scenari- Scenario offline ad alta intensità di lettura, in cui i dati sono appena aggiornati dopo l'inserimento e la percentuale di elaborazione di ciascun tipo di richiesta è: richiesta di ricerca 90%, richiesta di inserimento 5%, altri 5%.
- Scenario online ad alta intensità di scrittura, in cui i dati vengono inseriti e ricercati simultaneamente e la percentuale di elaborazione di ciascun tipo di richiesta è: richiesta di inserimento 50%, richiesta di ricerca 40%, altre 10%.
- Inserimento dei dati
- Costruzione dell'indice
- Ricerca vettoriale
Metriche- Utilizzo della memoria
- Consumo di CPU
- Latenza IO
- Stato dei pod Milvus
- Tempo di risposta del servizio Milvus
ecc.
- Il throughput dei dati durante l'inserimento dei dati
- Il tempo necessario per costruire un indice
- Tempo di risposta durante una ricerca vettoriale
- Interrogazione al secondo (QPS)
- Richiesta al secondo
- Tasso di richiamo
ecc.

Sia il test di stabilità che il test delle prestazioni condividono lo stesso flusso di lavoro:

Stability and performance test Test di stabilità e prestazioni

  1. Analizzare e aggiornare le configurazioni e definire le metriche. server-configmap corrisponde alla configurazione di Milvus standalone o cluster, mentre client-configmap corrisponde alle configurazioni dei casi di test.
  2. Configurare il server e il client.
  3. Preparazione dei dati
  4. Richiesta di interazione tra il server e il client.
  5. Report e visualizzazione delle metriche.

Strumenti e metodi per una migliore efficienza della QA

Dalla sezione dedicata ai test dei moduli, si può notare che la procedura per la maggior parte dei test è in realtà quasi la stessa, e comporta principalmente la modifica delle configurazioni del server e del client Milvus e il passaggio dei parametri API. Quando ci sono più configurazioni, più varia è la combinazione delle diverse configurazioni, più numerosi sono gli scenari di prova che questi esperimenti e test possono coprire. Di conseguenza, il riutilizzo di codici e procedure è ancora più importante per migliorare l'efficienza dei test.

Struttura di test SDK

SDK test framework Struttura di test SDK

Per accelerare il processo di test, possiamo aggiungere un wrapper API_request al framework di test originale e impostarlo come qualcosa di simile a un gateway API. Questo gateway API si occuperà di raccogliere tutte le richieste API e di passarle a Milvus per ricevere collettivamente le risposte. Queste risposte saranno poi ritrasmesse al cliente. Questa struttura rende molto più semplice la cattura di alcune informazioni di log, come i parametri e i risultati restituiti. Inoltre, il componente checker del framework di test SDK può verificare ed esaminare i risultati di Milvus. Tutti i metodi di verifica possono essere definiti all'interno di questo componente checker.

Con il framework di test SDK, alcuni processi di inizializzazione cruciali possono essere racchiusi in un'unica funzione. In questo modo, è possibile eliminare grandi porzioni di codice noioso.

È inoltre da notare che ogni singolo caso di test è collegato a una collezione unica per garantire l'isolamento dei dati.

Durante l'esecuzione dei casi di test,pytest-xdist, l'estensione di pytest, può essere sfruttata per eseguire tutti i singoli casi di test in parallelo, aumentando notevolmente l'efficienza.

Azione GitHub

GitHub action Azione GitHub

AncheGitHub Action viene adottato per migliorare l'efficienza della QA per le sue caratteristiche:

  • È uno strumento CI/CD nativo profondamente integrato con GitHub.
  • Viene fornito con un ambiente macchina uniformemente configurato e con strumenti di sviluppo software comuni preinstallati, tra cui Docker, Docker Compose, ecc.
  • Supporta diversi sistemi operativi e versioni, tra cui Ubuntu, MacOs, Windows-server, ecc.
  • Ha un marketplace che offre ricche estensioni e funzioni out-of-box.
  • La sua matrice supporta lavori simultanei e il riutilizzo dello stesso flusso di test per migliorare l'efficienza.

Oltre alle caratteristiche di cui sopra, un altro motivo per adottare GitHub Action è che i test di distribuzione e di affidabilità richiedono un ambiente indipendente e isolato. E GitHub Action è ideale per i controlli quotidiani su insiemi di dati di piccole dimensioni.

Strumenti per i test di benchmark

Per rendere più efficienti i test QA, si utilizzano diversi strumenti.

QA tools Strumenti QA

  • Argo: un insieme di strumenti open-source per Kubernetes per l'esecuzione di flussi di lavoro e la gestione di cluster mediante la pianificazione di attività. Può anche consentire l'esecuzione di più attività in parallelo.
  • Kubernetes dashboard: interfaccia utente di Kubernetes basata sul web per la visualizzazione di server-configmap e client-configmap.
  • NAS: Network attached storage (NAS) è un server di archiviazione dati a livello di file per conservare i comuni set di dati di benchmark ANN.
  • InfluxDB e MongoDB: database per il salvataggio dei risultati dei test di benchmark.
  • Grafana: Una soluzione open-source di analisi e monitoraggio per il controllo delle metriche delle risorse del server e delle prestazioni del client.
  • Redash: Un servizio che aiuta a visualizzare i dati e a creare grafici per i test di benchmark.

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:

Like the article? Spread the word

Continua a Leggere