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

milvus-logo
LFAI

Como compactar dados no Milvus?

  • Engineering
February 21, 2022
Bingyi Sun

Binlog Cover Image Imagem de capa do Binlog

Por Bingyi Sun e Angela Ni.

Com o lançamento oficial do Milvus 2.0 GA, uma lista de novos recursos é suportada. Entre elas, a compactação é uma das novas funcionalidades que pode ajudar a poupar espaço de armazenamento.

A compactação refere-se ao processo de juntar pequenos segmentos em grandes segmentos e limpar dados logicamente eliminados. Por outras palavras, a compactação reduz a utilização de espaço em disco, eliminando as entidades eliminadas ou expiradas nos registos. É uma tarefa em segundo plano que é acionada pela coordenação de dados e executada pelo nó de dados em Milvus.

Este artigo disseca o conceito e a implementação da compactação no Milvus.

O que é a compactação?

Antes de nos aprofundarmos nos detalhes de como implementar a compactação no Milvus 2.0, é fundamental perceber o que é a compactação no Milvus.

Na maior parte das vezes, como utilizador do Milvus, pode ter sido incomodado pelo aumento da utilização de espaço no disco rígido. Outro problema é que um segmento com menos de 1.024 linhas não é indexado e apenas suporta a pesquisa de força bruta para processar consultas. Segmentos pequenos causados por auto-flush ou flush invocado pelo utilizador podem prejudicar a eficiência da consulta.

Assim, para resolver os dois problemas acima mencionados e ajudar a reduzir a utilização do disco e melhorar a eficiência das consultas, o Milvus suporta a compactação.

Bases de dados como o LevelDB e o RocksDB anexam dados a tabelas de cadeias ordenadas (SSTables). A média de leituras em disco por consulta aumenta com o número de SSTables, levando a consultas ineficientes. Para reduzir a amplificação da leitura e libertar espaço no disco rígido, estas bases de dados compactam as SSTables numa só. Os processos de compactação são executados automaticamente em segundo plano.

Da mesma forma, o Milvus anexa dados inseridos e eliminados aos binlogs. À medida que o número de binlogs aumenta, é utilizado mais espaço no disco rígido. Para libertar espaço no disco rígido, o Milvus compacta os binlogs de dados inseridos e eliminados. Se uma entidade for inserida mas posteriormente eliminada, deixa de existir nos binlogs que registam a inserção ou eliminação de dados depois de compactados. Além disso, o Milvus também compacta segmentos - ficheiros de dados criados automaticamente pelo Milvus para guardar dados inseridos.

Como configurar a compactação?

A configuração da compactação no Milvus envolve principalmente dois parâmetros: dataCoord.enableCompaction e common.retentionDuration.

dataCoord.enableCompaction especifica se a compactação deve ser activada. O seu valor predefinido é true.

common.retentionDuration especifica um período em que a compactação não é executada. A sua unidade é o segundo. Quando compacta dados, todas as entidades eliminadas ficam indisponíveis para pesquisa com a Viagem no tempo. Portanto, se planeia pesquisar com a Viagem no tempo, tem de especificar um período de tempo durante o qual a compactação não é executada e não afecta os dados eliminados. Para garantir resultados precisos das pesquisas com Viagem no Tempo, o Milvus retém os dados operados num período especificado por common.retentionDuration. Ou seja, os dados operados neste período não serão compactados. Para mais detalhes, consulte Pesquisa com viagem no tempo.

A compactação é activada no Milvus por defeito. Se desactivou a compactação mas mais tarde pretende activá-la manualmente, pode seguir os passos abaixo:

  1. Chamar o método collection.compact() para ativar manualmente um processo de compactação global. No entanto, tenha em atenção que esta operação pode demorar muito tempo.
  2. Depois de chamar o método, é devolvido um ID de compactação. Veja o estado da compactação chamando o método collection.get_compaction_state().

Depois de activada, a compactação é executada automaticamente em segundo plano. Uma vez que o processo de compactação pode demorar muito tempo, os pedidos de compactação são processados de forma assíncrona para poupar tempo.

Como implementar a compactação?

No Milvus, é possível implementar a compactação manual ou automaticamente.

A compactação manual de binlogs ou segmentos não requer o cumprimento de quaisquer condições de ativação. Portanto, se invocar manualmente a compactação, os binlogs ou segmentos serão compactados independentemente de qualquer coisa.

Entretanto, se o usuário desejar ativar a compactação automática, certas condições de acionamento da compactação precisam ser atendidas para que o sistema compacte os segmentos ou binlogs.

Geralmente, existem dois tipos de objetos que podem ser compactados no Milvus: binglogs e segmentos.

Compactação de binlogs

Um binlog é um registo binário, ou uma unidade mais pequena em segmento, que regista e trata as actualizações e alterações feitas aos dados na base de dados vetorial Milvus. Os dados de um segmento são mantidos em vários binlogs. A compactação de binlogs envolve dois tipos de binlogs no Milvus: binlogs de inserção e binlogs delta.

Os binlogs delta são gerados quando os dados são eliminados, enquanto os binlogs de inserção são gerados nas três circunstâncias seguintes.

  • Enquanto os dados inseridos estão a ser anexados, o segmento atinge o limite superior de tamanho e é automaticamente descarregado para o disco.
  • O DataCoord descarrega automaticamente os segmentos que permanecem sem selar durante muito tempo.
  • Algumas APIs como collection.num_entities, collection.load(), e outras invocam automaticamente o flush para escrever segmentos no disco.

Portanto, a compactação de binlogs, como o próprio nome sugere, refere-se à compactação de binlogs dentro de um segmento. Mais especificamente, durante a compactação do binlog, todos os binlogs delta e binlogs de inserção que não são retidos são compactados.

Binlog compaction Compactação de binlogs

Quando um segmento é descarregado no disco, ou quando o Milvus solicita a compactação global porque a compactação não foi executada por um longo período, pelo menos uma das duas condições a seguir precisa ser atendida para acionar a compactação automática:

  1. As linhas nos delta binlogs são mais de 20% do total de linhas.
  2. O tamanho dos delta binlogs excede 10 MB.

Compactação de segmento

Um segmento é um ficheiro de dados criado automaticamente pelo Milvus para guardar dados inseridos. Existem dois tipos de segmentos no Milvus: segmento crescente e segmento selado.

Um segmento em crescimento continua a receber os novos dados inseridos até ser selado. Um segmento selado deixa de receber novos dados e será descarregado para o armazenamento de objectos, deixando novos dados para serem inseridos num segmento crescente recém-criado.

Portanto, a compactação de segmento refere-se à compactação de múltiplos segmentos selados. Mais especificamente, durante a compactação de segmentos, pequenos segmentos são compactados em segmentos maiores.

Segment compaction Compactação de segmento

Cada segmento gerado após a compactação não pode exceder o limite superior de um tamanho de segmento, que é 512 MB por padrão. Leia as configurações do sistema para saber como modificar o limite superior do tamanho de um segmento.

Quando um segmento é descarregado no disco, ou quando o Milvus solicita compactação global porque a compactação não foi executada por um longo período, a seguinte condição precisa ser atendida para acionar a compactação automática:

  • Segmentos menores que 0.5 * MaxSegmentSize é maior que 10.

O que se segue?

O que se segue depois de aprender as noções básicas de compactação no Milvus? Atualmente, nem todos os parâmetros para configurar a compactação estão no ficheiro milvus.yaml, e as estratégias de geração de planos são relativamente básicas. Se estiver interessado, contribua para o Milvus, o projeto de código aberto!

Além disso, no blogue da série de novas funcionalidades 2.0, o nosso objetivo é explicar a conceção das novas funcionalidades. Leia mais nesta série de blogues!

Sobre o autor

Bingyi Sun, Engenheiro de Software Sénior do projeto Milvus, obteve o seu Mestrado em Engenharia de Software na Universidade de Shanghai Jiao Tong. Ele é o principal responsável pelo desenvolvimento de componentes relacionados ao armazenamento no Milvus 2.0. A sua área de interesse são as bases de dados e os sistemas distribuídos. É um grande fã de projectos de código aberto e um gourmet que gosta de jogar videojogos e ler no seu tempo livre.

Like the article? Spread the word

Continue Lendo