Compactação do Force MergeCompatible with Milvus 3.0.x
O Force Merge foi projetado para consolidar segmentos pequenos e fragmentados em segmentos menores e maiores para melhorar o desempenho da consulta e a eficiência do armazenamento. Este guia explica como usar a compactação de mesclagem forçada.
Esse recurso está em visualização pública. Não o utilize em ambientes de produção.
Visão geral
A compactação padrão mantém os tamanhos de segmento próximos aos configurados maxSize por meio de mesclagens de muitos para um, mas ainda pode deixar fragmentos de tamanho médio que não podem ser mesclados ainda mais sem exceder os limites. Por exemplo, conforme ilustrado abaixo, se uma coleção tiver cinco segmentos de 2 MB e maxSize for de 3 MB, a mesclagem de quaisquer dois segmentos excederia o limite, de modo que a compactação padrão não pode reduzir ainda mais a contagem de segmentos e o layout fragmentado permanece.
Forçar mesclagem adiciona um parâmetro target_size e suporta a reorganização dos segmentos em direção ao tamanho desejado dentro de uma tolerância estreita quando possível. Conforme ilustrado abaixo, se o target_size especificado for 4 MB, os cinco segmentos pequenos de 2 MB poderão ser mesclados em menos segmentos maiores. Isso reduz o excesso de contagens de segmentos, suporta destinos maiores do que as configurações padrão do maxSize e, quando o destino é muito grande, permite que o sistema escolha um tamanho de saída prático e uma contagem de segmentos para o hardware atual e a topologia do QueryNode.
Para entender qual método de compactação deve ser usado, consulte FAQ.
R8eow3kaqhktokblcmocnvxmnee
A compactação de mesclagem forçada estende a API Compaction API existente com um parâmetro target_size. É totalmente compatível com as versões anteriores: as chamadas de compactação existentes sem target_size continuam a funcionar como antes.
A compactação forçada funciona de forma assíncrona. Não bloqueia as operações de pesquisa ou consulta, embora consuma recursos de E/S e memória durante a execução.
Usar a compactação Force Merge
Pré-requisitos
Milvus versão 3.0 ou posterior
PyMilvus 3.0 ou posterior
Configuração global
Os seguintes parâmetros de configuração controlam o comportamento do Force Merge. Defina-os no arquivo de configuração do Milvus ou através de variáveis de ambiente.
dataCoord:
segment:
maxSize: 512 # Default segment max size (MB).
# Used when target_size is 0 or omitted.
compaction:
maxFullSegmentThreshold: 100
# When segment count exceeds this threshold,
# a faster greedy algorithm is used instead
# of the standard merge algorithm.
forceMerge:
datanodeMemoryFactor: 4.0
# DataNode memory divided by this factor
# determines the the largest segment
# size the system can allow.
querynodeMemoryFactor: 4.0
# Minimum QueryNode memory divided by this
# factor. Used in automatic size calculation
# to ensure merged segments can be loaded.
Parâmetro |
Valor Padrão |
Descrição |
|---|---|---|
|
512 |
Tamanho máximo do segmento padrão em MB. Utilizado como alvo quando |
|
100 |
Limite de contagem de segmentos para a seleção do algoritmo. Quando o número de segmentos excede este valor, o Milvus utiliza um algoritmo guloso mais rápido para o planeamento da fusão.
|
|
4.0 |
A memória do DataNode é dividida por esse fator para calcular o maior tamanho de segmento que o sistema pode permitir.
|
|
4.0 |
A memória mínima do QueryNode é dividida por esse fator. Usado durante o cálculo automático de tamanho (
|
Para aplicar as alterações acima ao seu cluster Milvus, siga as etapas em Configure Milvus with Helm e Configure Milvus with Milvus Operators.
Acionar a compactação Force Merge
Você aciona a compactação Force Merge chamando compact() com o parâmetro target_size. Para obter detalhes sobre o parâmetro, consulte Referência do parâmetro abaixo.
Estão disponíveis três modos de compactação Force Merge:
compact("my_collection", target_size=?)
│
├─ Mode 1: target_size = 0 (or omitted)
│ Uses config maxSize (default 512 MB)
│ Equivalent to standard compaction
│
├─ Mode 2: target_size = 2048
│ Merges segments to ~2 GB each
│ Must be >= config maxSize
│
└─ Mode 3: target_size = max_int64
Auto-calculates optimal size based on
segment distribution and node memory
A seguir estão exemplos que mostram como usar cada modo de compactação de mesclagem forçada.
Padrão (compactação padrão)
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
# Standard compaction — uses config maxSize (default 512 MB)
job_id = client.compact("target_collection")
Tamanho alvo explícito
# Merge segments to approximately 2 GB each
job_id = client.compact(
"target_collection",
target_size="2048" # The unit is MB
)
Cálculo automático do tamanho
# Let Milvus determine the optimal segment size
max_int64 = (1 << 63) - 1
job_id = client.compact(
"target_collection",
target_size=max_int64
)
Referência dos parâmetros
A tabela seguinte explica os parâmetros.
Parâmetro |
Tipo de parâmetro |
Descrição |
|---|---|---|
|
str |
Obrigatório. O nome da coleção a compactar. |
|
int |
Opcional. O tamanho do segmento de destino em MB. Há 3 opções para o valor do parâmetro:
|
Se o target_size especificado for menor que o dataCoord.segment.maxSize configurado, a solicitação será rejeitada com um erro.
Verificar o progresso da compactação
A compactação do Force Merge é executada de forma assíncrona. Use a ID do trabalho retornada para verificar o progresso:
# Check compaction state
state = client.get_compaction_state(job_id)
print(f"State: {state}")
Práticas recomendadas
Não use a compactação de mesclagem forçada em ambientes de produção.
Use o modo de cálculo automático de tamanho para a maioria dos casos. Definir
target_sizecomomax_int64permite que o Milvus analise a distribuição do segmento e os recursos do nó para determinar o melhor tamanho. Essa é a abordagem recomendada, a menos que você tenha requisitos de tamanho específicos.Considere a troca de desempenho. A compactação Force Merge é uma operação que consome muitos recursos. Ela lê, mescla e reescreve os dados do segmento. Programe-a durante períodos de baixo tráfego para minimizar o impacto na latência da consulta.
Monitore a contagem de segmentos antes e depois. Use
get_compaction_state()elist_persistent_segmentspara verificar se a compactação produziu menos segmentos maiores, conforme esperado.
PERGUNTAS FREQUENTES
Qual é a diferença entre Force Merge e compactação padrão?
Esses dois tipos de operações de compactação têm finalidades diferentes.
A compactação padrão (targetSize=0 ou omitida) é um caminho de limpeza incremental e de melhor esforço.
Force merge (targetSize>0) é um caminho de reempacotamento no nível da coleção para produzir menos segmentos, maiores e próximos ao alvo.
A diferença chave é a forma da mesclagem: a compactação padrão é efetivamente m → 1 por tarefa, enquanto a mesclagem forçada é m → n através de entradas agrupadas. É por isso que o force merge pode resolver layouts de segmentos que a compactação padrão não pode. A tabela a seguir compara os dois tipos de operações.
Dimensão |
Compactação padrão (padrão) |
Forçar mesclagem |
|---|---|---|
Acionador de API |
targetSize=0 (ou não definido), sem sinalizador Major/L0 |
targetSize>0 (MB) |
Objetivo principal |
Limpeza incremental de fragmentos óbvios; manutenção de rotina |
Consolidação de toda a coleção para pesquisa e equilíbrio |
Fonte do tamanho do segmento |
DataCoord.segment.maxSize fixo (configuração do servidor) |
TargetSize do utilizador, depois fixado com segurança por maxSafeSize |
Validade do parâmetro |
Sem ajuste de tamanho do utilizador |
User targetSize deve ser >= dataCoord.segment.maxSize; caso contrário, rejeitado |
Limite superior de segurança |
Apenas limite de configuração |
maxSafeSize = min(QueryNode mem, DataNode mem) / memory_factor (standalone non-pooling: mais metade) |
Forma da fusão |
m → 1 por tarefa, saída <= configMaxSize |
m → n, saídas próximas a targetSize |
Comportamento do segmento médio |
Pode ficar preso permanentemente (por exemplo, dois segmentos de 60% não podem legalmente se tornar um segmento de 120%) |
Reempacotar + dividir funciona; nenhum padrão "preso em 60%" |
Capacidade de achatamento da coleção |
Limitada; execuções repetidas podem ainda deixar muitos segmentos médios |
Forte; concebido para reduzir a contagem de segmentos e aumentar a plenitude |
Conhecimento da topologia |
Nenhum |
Sim; utiliza QueryNode/replica/shard layout |
Ajuste do paralelismo do caminho de leitura |
Nenhum |
Ajusta a contagem de saída usando queryNodeCount / (réplicas × shards) quando válido |
Caso de utilização típico |
Limpeza diária de alta rotatividade após gravações/exclusões |
Preparação de benchmark, otimização de pesquisa, alinhamento de paralelismo de carga |
Expectativa de alcance |
Não se espera um reempacotamento da coleção completa |
Destinado a resultados de reempacotamento ao nível da coleção |
Orientação de seleção:
Escolha a compactação padrão para uma limpeza incremental e de baixo risco.
Escolha a compactação forçada quando desejar explicitamente remodelar a coleção em segmentos menores e maiores, alinhados com o comportamento de pesquisa e carregamento.
Qual é a diferença entre o Force Merge e a compactação de clustering?
A compactaçãode clustering (is_clustering=True) reorganiza os dados dentro dos segmentos com base em uma chave de clustering para melhorar a poda de pesquisa. O Force Merge (target_size=N) optimiza os tamanhos dos segmentos sem alterar a distribuição dos dados. Eles têm finalidades diferentes e podem ser usados juntos - execute a compactação de clustering primeiro para organizar os dados e, em seguida, Force Merge para consolidar os segmentos resultantes.
Posso executar o Force Merge em uma coleção que está sendo consultada?
Sim. O Force Merge é executado de forma assíncrona e não bloqueia as consultas. No entanto, ele consome recursos de E/S do DataNode e do disco, de modo que a latência da consulta pode aumentar durante a compactação. Programe o Force Merge durante períodos de baixo tráfego para obter melhores resultados.
O que acontece se eu definir um target_size menor que maxSize?
A solicitação é rejeitada com um erro. O tamanho de destino deve ser maior ou igual ao tamanho configurado dataCoord.segment.maxSize.