🚀 Experimente o Zilliz Cloud, o Milvus totalmente gerenciado, gratuitamente—experimente um desempenho 10x mais rápido! Experimente Agora>>

milvus-logo
LFAI
  • Home
  • Blog
  • Garantia de qualidade do software de código aberto (OSS) - Um estudo de caso da Milvus

Garantia de qualidade do software de código aberto (OSS) - Um estudo de caso da Milvus

  • Engineering
April 25, 2022
Wenxing Zhu

Cover image Imagem da capa

Este artigo foi escrito por Wenxing Zhu e transcrito por Angela Ni.

A garantia de qualidade (GQ) é um processo sistemático de determinar se um produto ou serviço cumpre determinados requisitos. Um sistema de GQ é uma parte indispensável do processo de I&D porque, como o nome sugere, assegura a qualidade do produto.

Esta publicação apresenta o quadro de GQ adotado no desenvolvimento da base de dados vetorial Milvus, com o objetivo de fornecer uma orientação para os programadores e utilizadores que contribuem para o processo. Também abordará os principais módulos de teste do Milvus, bem como métodos e ferramentas que podem ser utilizados para melhorar a eficiência dos testes de GQ.

Saltar para:

Uma introdução geral ao sistema Milvus QA

A arquitetura do sistema é fundamental para a realização de testes de GQ. Quanto mais um engenheiro de GQ estiver familiarizado com o sistema, maior será a probabilidade de elaborar um plano de testes razoável e eficiente.

Milvus architecture Arquitetura do Milvus

O Milvus 2.0 adopta uma arquitetura nativa da nuvem, distribuída e em camadas, sendo o SDK a principal entrada para o fluxo de dados no Milvus. Os utilizadores do Milvus utilizam o SDK com muita frequência, pelo que os testes funcionais do SDK são muito necessários. Além disso, os testes de funcionamento do SDK podem ajudar a detetar os problemas internos que possam existir no sistema Milvus. Para além dos testes de funcionamento, serão também realizados outros tipos de testes na base de dados vetorial, incluindo testes unitários, testes de implantação, testes de fiabilidade, testes de estabilidade e testes de desempenho.

Uma arquitetura distribuída e nativa da nuvem traz conveniência e desafios aos testes de garantia de qualidade. Ao contrário dos sistemas que são implantados e executados localmente, uma instância do Milvus implantada e executada em um cluster Kubernetes pode garantir que o teste de software seja realizado nas mesmas circunstâncias que o desenvolvimento de software. No entanto, a desvantagem é que a complexidade da arquitetura distribuída traz mais incertezas que podem tornar o teste de QA do sistema ainda mais difícil e extenuante. Por exemplo, o Milvus 2.0 utiliza microsserviços de diferentes componentes, o que leva a um aumento do número de serviços e nós e a uma maior possibilidade de erro do sistema. Consequentemente, é necessário um plano de garantia de qualidade mais sofisticado e abrangente para melhorar a eficiência dos testes.

Testes de GQ e gestão de problemas

A GQ no Milvus envolve tanto a realização de testes como a gestão de problemas que surgem durante o desenvolvimento do software.

Testes de GQ

A Milvus realiza diferentes tipos de testes de GQ de acordo com as caraterísticas do Milvus e as necessidades dos utilizadores, por ordem de prioridade, como mostra a imagem abaixo.

QA testing priority Prioridade dos testes de GQ

No Milvus, os testes de GQ são efectuados nos seguintes aspectos e com a seguinte prioridade

  1. Função: Verificar se as funções e as caraterísticas funcionam como inicialmente concebidas.
  2. Implementação: Verificar se um utilizador pode implementar, reinstalar e atualizar tanto a versão autónoma do Mivus como o cluster do Milvus com diferentes métodos (Docker Compose, Helm, APT ou YUM, etc.).
  3. Desempenho: Testar o desempenho da inserção de dados, indexação, pesquisa vetorial e consulta em Milvus.
  4. Estabilidade: Verificar se o Milvus pode funcionar de forma estável durante 5-10 dias com um nível normal de carga de trabalho.
  5. Fiabilidade: Testar se o Milvus ainda pode funcionar parcialmente se ocorrer um determinado erro do sistema.
  6. Configuração: Verificar se o Milvus funciona como esperado numa determinada configuração.
  7. Compatibilidade: Testar se o Milvus é compatível com diferentes tipos de hardware ou software.

Gestão de problemas

Podem surgir muitos problemas durante o desenvolvimento do software. Os autores dos problemas podem ser os próprios engenheiros de QA ou utilizadores do Milvus da comunidade open-source. A equipa de QA é responsável por resolver os problemas.

Issue management workflow Fluxo de trabalho da gestão de problemas

Quando um problema é criado, passa primeiro pela triagem. Durante a triagem, as novas questões serão examinadas para garantir que são fornecidos detalhes suficientes sobre as questões. Se o problema for confirmado, será aceite pelos programadores e estes tentarão resolver os problemas. Uma vez terminado o desenvolvimento, o autor do problema tem de verificar se este foi corrigido. Em caso afirmativo, o problema será encerrado.

Quando é que a garantia de qualidade é necessária?

Um equívoco comum é que a garantia de qualidade e o desenvolvimento são independentes um do outro. No entanto, a verdade é que, para garantir a qualidade do sistema, são necessários esforços tanto dos programadores como dos engenheiros de GQ. Por conseguinte, a GQ deve estar envolvida em todo o ciclo de vida.

QA lifecycle Ciclo de vida da GQ

Como mostra a figura acima, um ciclo de vida completo de I&D de software inclui três fases.

Durante a fase inicial, os programadores publicam a documentação de conceção, enquanto os engenheiros de garantia de qualidade elaboram planos de teste, definem critérios de lançamento e atribuem tarefas de garantia de qualidade. Os programadores e os engenheiros de garantia de qualidade têm de estar familiarizados com a documentação de conceção e com o plano de testes, para que haja uma compreensão mútua do objetivo do lançamento (em termos de funcionalidades, desempenho, estabilidade, convergência de erros, etc.) entre as duas equipas.

Durante a I&D, os testes de desenvolvimento e de garantia de qualidade interagem frequentemente para desenvolver e verificar caraterísticas e funções, bem como para corrigir erros e problemas comunicados pela comunidade de código aberto.

Durante a fase final, se os critérios de lançamento forem cumpridos, será lançada uma nova imagem Docker da nova versão do Milvus. Para o lançamento oficial, é necessária uma nota de lançamento centrada nas novas funcionalidades e nos erros corrigidos, bem como uma etiqueta de lançamento. Em seguida, a equipa de garantia de qualidade publicará também um relatório de testes sobre esta versão.

Módulos de teste no Milvus

Existem vários módulos de teste no Milvus e esta secção explica cada módulo em pormenor.

Teste unitário

Unit test Teste unitário

Os testes unitários podem ajudar a identificar erros de software numa fase inicial e fornecer um critério de verificação para a reestruturação do código. De acordo com os critérios de aceitação dos pull requests (PR) do Milvus, a cobertura dos testes unitários do código deve ser de 80%.

Testes de função

Os testes de função em Milvus são organizados principalmente em torno do PyMilvus e dos SDKs. O principal objetivo dos testes de função é verificar se as interfaces podem funcionar como concebidas. Os testes de função têm duas facetas:

  • Testar se os SDKs podem retornar os resultados esperados quando os parâmetros corretos são passados.
  • Testar se os SDK podem tratar erros e devolver mensagens de erro razoáveis quando são passados parâmetros incorrectos.

A figura abaixo mostra a estrutura atual para testes de funções, que se baseia na estrutura principal pytest. Esta estrutura adiciona um invólucro ao PyMilvus e permite efetuar testes com uma interface de testes automatizada.

Function test Teste de funções

Considerando que é necessário um método de teste partilhado e que algumas funções têm de ser reutilizadas, é adoptada a estrutura de teste acima referida, em vez de utilizar diretamente a interface PyMilvus. Um módulo de "verificação" é também incluído na estrutura para facilitar a verificação dos valores esperados e reais.

No diretório tests/python_client/testcases estão incorporados 2.700 casos de teste de funções, cobrindo na totalidade quase todas as interfaces do PyMilvus. Estes testes de função supervisionam rigorosamente a qualidade de cada PR.

Teste de implementação

O Milvus está disponível em dois modos: autónomo e em cluster. E há duas formas principais de implementar o Milvus: usando o Docker Compose ou o Helm. E depois de implementar o Milvus, os utilizadores podem também reiniciar ou atualizar o serviço Milvus. Existem duas categorias principais de teste de implantação: teste de reinicialização e teste de atualização.

O teste de reinício refere-se ao processo de testar a persistência dos dados, ou seja, se os dados continuam disponíveis após um reinício. O teste de atualização refere-se ao processo de testar a compatibilidade dos dados para evitar situações em que formatos incompatíveis de dados são inseridos no Milvus. Ambos os tipos de testes de implementação partilham o mesmo fluxo de trabalho, como ilustrado na imagem abaixo.

Deployment test Teste de implementação

Num teste de reinício, as duas implementações utilizam a mesma imagem docker. No entanto, num teste de atualização, a primeira implantação utiliza uma imagem de doca de uma versão anterior, enquanto a segunda implantação utiliza uma imagem de doca de uma versão posterior. Os resultados e dados do teste são salvos no arquivo Volumes ou na declaração de volume persistente (PVC).

Ao executar o primeiro teste, são criadas várias colecções e são efectuadas operações diferentes em cada uma das colecções. Ao executar o segundo teste, o foco principal será verificar se as colecções criadas ainda estão disponíveis para operações CRUD e se podem ser criadas novas colecções.

Teste de fiabilidade

Os testes sobre a fiabilidade do sistema distribuído nativo da nuvem adoptam geralmente um método de engenharia do caos cujo objetivo é eliminar os erros e as falhas do sistema pela raiz. Por outras palavras, num teste de engenharia do caos, criamos propositadamente falhas no sistema para identificar problemas em testes de pressão e corrigimos as falhas do sistema antes que comecem realmente a causar danos. Durante um teste de caos em Milvus, escolhemos a Chaos Mesh como a ferramenta para criar o caos. Há vários tipos de falhas que precisam de ser criadas:

  • Pod kill: uma simulação do cenário em que os nós estão em baixo.
  • Pod failure: Teste se um dos pods do nó de trabalho falhar, se todo o sistema ainda pode continuar a funcionar.
  • Estresse de memória: uma simulação de consumo intenso de memória e recursos de CPU dos nós de trabalho.
  • Partição de rede: Uma vez que o Milvus separa o armazenamento da computação, o sistema depende fortemente da comunicação entre os vários componentes. É necessária uma simulação do cenário em que a comunicação entre diferentes pods é particionada para testar a interdependência dos diferentes componentes do Milvus.

Reliability test Teste de fiabilidade

A figura acima demonstra a estrutura de teste de fiabilidade do Milvus que pode automatizar os testes de caos. O fluxo de trabalho de um teste de fiabilidade é o seguinte:

  1. Inicializar um cluster Milvus através da leitura das configurações de implementação.
  2. Quando o cluster estiver pronto, execute test_e2e.py para testar se os recursos do Milvus estão disponíveis.
  3. Executar hello_milvus.py para testar a persistência dos dados. Crie uma coleção com o nome "hello_milvus" para inserção de dados, descarga, criação de índices, pesquisa vetorial e consulta. Essa coleção não será liberada ou descartada durante o teste.
  4. Crie um objeto de monitorização que iniciará seis threads que executam as operações de criação, inserção, descarga, índice, pesquisa e consulta.
checkers = {
    Op.create: CreateChecker(),
    Op.insert: InsertFlushChecker(),
    Op.flush: InsertFlushChecker(flush=True),
    Op.index: IndexChecker(),
    Op.search: SearchChecker(),
    Op.query: QueryChecker()
}
  1. Faça a primeira afirmação - todas as operações são bem sucedidas como esperado.
  2. Introduza uma falha de sistema no Milvus usando o Chaos Mesh para analisar o arquivo yaml que define a falha. Uma falha pode ser matar o nó de consulta a cada cinco segundos, por exemplo.
  3. Fazer a segunda afirmação ao introduzir uma falha no sistema - Julgar se os resultados retornados das operações em Milvus durante uma falha no sistema correspondem à expetativa.
  4. Eliminar a falha através do Chaos Mesh.
  5. Quando o serviço Milvus é recuperado (o que significa que todos os pods estão prontos), faça a terceira afirmação - todas as operações são bem sucedidas como esperado.
  6. Execute test_e2e.py para testar se os recursos do Milvus estão disponíveis. Algumas das operações durante o caos podem estar bloqueadas devido à terceira asserção. E mesmo depois de o caos ter sido eliminado, algumas operações podem continuar bloqueadas, impedindo que a terceira afirmação seja bem sucedida como esperado. Este passo tem como objetivo facilitar a terceira asserção e serve de padrão para verificar se o serviço Milvus recuperou.
  7. Execute hello_milvus.py, carregue a coleção criada e realize operações CRUP na coleção. Em seguida, verifique se os dados existentes antes da falha do sistema ainda estão disponíveis após a recuperação da falha.
  8. Recolha os registos.

Teste de estabilidade e desempenho

A figura abaixo descreve os objectivos, cenários de teste e métricas do teste de estabilidade e desempenho.

Teste de estabilidadeTeste de desempenho
Objectivos- Assegurar que o Milvus pode funcionar sem problemas durante um período de tempo fixo com uma carga de trabalho normal.
- Assegurar que os recursos são consumidos de forma estável quando o serviço Milvus é iniciado.
- Testar o desempenho de todas as interfaces do Milvus.
- Encontrar a configuração ideal com a ajuda dos testes de desempenho.
- Servir de referência para futuras versões.
- Encontrar o ponto de estrangulamento que impede um melhor desempenho.
Cenários- Cenário de leitura intensiva offline em que os dados são pouco actualizados após a inserção e a percentagem de processamento de cada tipo de pedido é: pedido de pesquisa 90%, pedido de inserção 5%, outros 5%.
- Cenário online de escrita intensiva em que os dados são inseridos e pesquisados simultaneamente e a percentagem de processamento de cada tipo de pedido é: pedido de inserção 50%, pedido de pesquisa 40%, outros 10%.
- Inserção de dados
- Construção de índices
- Pesquisa vetorial
Métricas- Utilização de memória
- Consumo de CPU
- Latência de IO
- O estado dos pods do Milvus
- Tempo de resposta do serviço Milvus
etc.
- Taxa de transferência de dados durante a inserção de dados
- O tempo necessário para construir um índice
- Tempo de resposta durante uma pesquisa vetorial
- Consulta por segundo (QPS)
- Pedidos por segundo
- Taxa de recuperação
etc.

Tanto o teste de estabilidade como o teste de desempenho partilham o mesmo conjunto de fluxo de trabalho:

Stability and performance test Teste de estabilidade e de desempenho

  1. Analisar e atualizar as configurações e definir as métricas. O server-configmap corresponde à configuração do Milvus autónomo ou do cluster, enquanto o client-configmap corresponde às configurações dos casos de teste.
  2. Configurar o servidor e o cliente.
  3. Preparação dos dados
  4. Solicitar a interação entre o servidor e o cliente.
  5. Relatório e visualização de métricas.

Ferramentas e métodos para uma melhor eficácia do controlo de qualidade

A partir da secção de testes de módulos, podemos ver que o procedimento para a maioria dos testes é de facto quase o mesmo, envolvendo principalmente a modificação das configurações do servidor e do cliente Milvus e a passagem de parâmetros API. Quando existem várias configurações, quanto mais variada for a combinação das diferentes configurações, mais cenários de teste estas experiências e testes podem cobrir. Por conseguinte, a reutilização de códigos e procedimentos é ainda mais crítica para o processo de aumento da eficiência dos testes.

Estrutura de teste do SDK

SDK test framework Estrutura de teste do SDK

Para acelerar o processo de teste, podemos adicionar um wrapper API_request à estrutura de teste original e configurá-lo como algo semelhante ao gateway de API. Este gateway de API será responsável por recolher todos os pedidos de API e depois passá-los ao Milvus para receber coletivamente as respostas. Essas respostas serão passadas de volta para o cliente depois. Esta conceção facilita muito a captura de certas informações de registo, como parâmetros e resultados devolvidos. Para além disso, o componente de verificação na estrutura de testes do SDK pode verificar e examinar os resultados do Milvus. E todos os métodos de verificação podem ser definidos dentro deste componente de verificação.

Com a estrutura de teste do SDK, alguns processos de inicialização cruciais podem ser agrupados em uma única função. Ao fazer isso, grandes pedaços de códigos tediosos podem ser eliminados.

É também de salientar que cada caso de teste individual está relacionado com a sua coleção única para garantir o isolamento dos dados.

Ao executar casos de teste,pytest-xdist, a extensão pytest, pode ser aproveitada para executar todos os casos de teste individuais em paralelo, aumentando consideravelmente a eficiência.

Ação GitHub

GitHub action Ação GitHub

O GitHub Action também é adotado para melhorar a eficiência do controlo de qualidade pelas suas caraterísticas seguintes:

  • É uma ferramenta nativa de CI/CD profundamente integrada ao GitHub.
  • É fornecido com um ambiente de máquina configurado de forma uniforme e ferramentas de desenvolvimento de software comuns pré-instaladas, incluindo Docker, Docker Compose, etc.
  • Suporta vários sistemas operativos e versões, incluindo Ubuntu, MacOs, Windows-server, etc.
  • Possui um mercado que oferece extensões ricas e funções prontas para uso.
  • A sua matriz suporta trabalhos simultâneos e a reutilização do mesmo fluxo de teste para melhorar a eficiência

Além das caraterísticas acima, outra razão para adotar o GitHub action é que testes de implantação e testes de confiabilidade requerem ambiente independente e isolado. E o GitHub Action é ideal para verificações de inspeção diárias em conjuntos de dados de pequena escala.

Ferramentas para testes de referência

Para tornar os testes de controlo de qualidade mais eficientes, são utilizadas várias ferramentas.

QA tools Ferramentas de GQ

  • Argo: um conjunto de ferramentas de código aberto para Kubernetes para executar fluxos de trabalho e gerir clusters através do agendamento de tarefas. Também pode permitir a execução de várias tarefas em paralelo.
  • Painel de controlo do Kubernetes: uma interface de utilizador do Kubernetes baseada na Web para visualizar server-configmap e client-configmap.
  • NAS: O armazenamento ligado à rede (NAS) é um servidor de armazenamento de dados informáticos ao nível dos ficheiros para manter conjuntos de dados de referência ANN comuns.
  • InfluxDB e MongoDB: bancos de dados para salvar resultados de testes de benchmark.
  • Grafana: Uma solução de análise e monitoramento de código aberto para monitorar métricas de recursos do servidor e métricas de desempenho do cliente.
  • Redash: Um serviço que ajuda a visualizar seus dados e criar gráficos para testes de benchmark.

Sobre a série Deep Dive

Com o anúncio oficial da disponibilidade geral do Milvus 2.0, orquestrámos esta série de blogues Milvus Deep Dive para fornecer uma interpretação aprofundada da arquitetura e do código-fonte do Milvus. Os tópicos abordados nesta série de blogues incluem:

Like the article? Spread the word

Continue Lendo