Compactación Force MergeCompatible with Milvus 3.0.x
Force Merge está diseñado para consolidar segmentos pequeños y fragmentados en menos segmentos y más grandes para mejorar el rendimiento de las consultas y la eficiencia del almacenamiento. En esta guía se explica cómo utilizar la compactación de fusión forzada.
Esta función se encuentra en fase de vista previa pública. No la utilice en entornos de producción.
Descripción general
La compactación estándar mantiene el tamaño de los segmentos cerca del configurado en maxSize mediante fusiones múltiples, pero puede dejar fragmentos de tamaño medio que no se pueden fusionar más sin superar los límites. Por ejemplo, como se ilustra a continuación, si una colección tiene cinco segmentos de 2 MB y maxSize es de 3 MB, la fusión de dos segmentos cualquiera superaría el límite, por lo que la compactación estándar no puede reducir más el recuento de segmentos y el diseño fragmentado permanece.
Forzar fusión añade un parámetro target_size y permite reorganizar los segmentos hacia el tamaño deseado dentro de una tolerancia ajustada siempre que sea posible. Como se ilustra a continuación, si el target_size especificado es de 4 MB, los cinco segmentos pequeños de 2 MB se pueden fusionar más en menos segmentos más grandes. Esto reduce el número excesivo de segmentos, admite objetivos mayores que la configuración predeterminada de maxSize y, cuando el objetivo es muy grande, permite al sistema elegir un tamaño de salida y un número de segmentos prácticos para el hardware y la topología de QueryNode actuales.
Para saber qué método de compactación utilizar, consulte las preguntas frecuentes.
R8eow3kaqhktokblcmocnvxmnee
La compactación de fusión forzada amplía la API Compaction API con un parámetro target_size. Es totalmente compatible con versiones anteriores: las llamadas de compactación existentes sin target_size siguen funcionando como antes.
La fusión forzada funciona de forma asíncrona. No bloquea las operaciones de búsqueda o consulta, aunque consume recursos de E/S y memoria durante la ejecución.
Uso de la compactación forzada
Requisitos previos
Milvus versión 3.0 o posterior
PyMilvus 3.0 o posterior
Configuración global
Los siguientes parámetros de configuración controlan el comportamiento de Force Merge. Establézcalos en el archivo de configuración de Milvus o mediante variables de entorno.
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 por defecto |
Descripción |
|---|---|---|
|
512 |
Tamaño máximo del segmento por defecto en MB. Se utiliza como destino cuando |
|
100 |
Umbral de recuento de segmentos para la selección del algoritmo. Cuando el número de segmentos supera este valor, Milvus utiliza un algoritmo codicioso más rápido para la planificación de la fusión.
|
|
4.0 |
La memoria DataNode se divide por este factor para calcular el tamaño de segmento más grande que el sistema puede permitir.
|
|
4.0 |
La memoria mínima del QueryNode se divide por este factor. Se utiliza durante el cálculo automático del tamaño (
|
Para aplicar los cambios anteriores a su cluster Milvus, por favor siga los pasos en Configurar Milvus con Helm y Configurar Milvus con Milvus Operators.
Activar la compactación Force Merge
Puede activar la compactación Force Merge llamando a compact() con el parámetro target_size. Para más detalles sobre el parámetro, véase Referencia de parámetros más abajo.
Existen tres modos de compactación por combinación forzada:
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 continuación se muestran ejemplos de cómo utilizar cada modo de compactación forzada.
Por defecto (compactación estándar)
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")
Tamaño objetivo 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 del tamaño
# Let Milvus determine the optimal segment size
max_int64 = (1 << 63) - 1
job_id = client.compact(
"target_collection",
target_size=max_int64
)
Referencia de parámetros
En la tabla siguiente se explican los parámetros.
Parámetro |
Tipo |
Descripción |
|---|---|---|
|
str |
Obligatorio. El nombre de la colección a compactar. |
|
int |
Opcional. El tamaño del segmento objetivo en MB. Hay 3 opciones de valor del parámetro:
|
Si el target_size especificado es menor que el dataCoord.segment.maxSize configurado, la solicitud se rechaza con un error.
Comprobar el progreso de la compactación
La compactación Force Merge se ejecuta de forma asíncrona. Utilice el ID de trabajo devuelto para comprobar el progreso:
# Check compaction state
state = client.get_compaction_state(job_id)
print(f"State: {state}")
Mejores prácticas
No utilice la compactación Force Merge en entornos de producción.
Utilice el modo de cálculo de tamaño automático para la mayoría de los casos. Configurar
target_sizeenmax_int64permite a Milvus analizar su distribución de segmentos y recursos de nodos para determinar el mejor tamaño. Este es el enfoque recomendado a menos que tenga requisitos específicos de tamaño.Considere la compensación de rendimiento. Forzar la compactación por fusión es una operación que consume muchos recursos. Lee, combina y reescribe datos de segmentos. Prográmela durante periodos de poco tráfico para minimizar el impacto en la latencia de la consulta.
Controle el recuento de segmentos antes y después. Utilice
get_compaction_state()ylist_persistent_segmentspara verificar que la compactación ha producido menos segmentos y más grandes de lo esperado.
PREGUNTAS FRECUENTES
¿En qué se diferencia Force Merge de la compactación estándar?
Estos dos tipos de operaciones de compactación tienen propósitos diferentes.
La compactación estándar (targetSize=0 u omitida) es una ruta de limpieza incremental de máximo esfuerzo.
La fusión forzada (targetSize>0) es una ruta de reempaquetado a nivel de colección para producir menos segmentos, más grandes y cercanos al objetivo.
La diferencia clave es la forma de la fusión: la compactación estándar es efectivamente m → 1 por tarea, mientras que la fusión forzada es m → n a través de entradas agrupadas. Esta es la razón por la que la fusión forzada puede resolver disposiciones de segmentos que la compactación estándar no puede. La siguiente tabla compara los dos tipos de operaciones.
Dimensión |
Compactación estándar (por defecto) |
Fusión forzada |
|---|---|---|
Activador API |
targetSize=0 (o no establecido), sin indicador Major/L0 |
targetSize>0 (MB) |
Objetivo principal |
Limpieza incremental de fragmentos obvios; mantenimiento rutinario |
Consolidación de toda la colección para búsqueda y equilibrio |
Origen del tamaño del segmento |
DataCoord.segment.maxSize fijo (configuración del servidor) |
TargetSize del usuario, luego limitado por maxSafeSize |
Validez de los parámetros |
Sin ajuste del tamaño del usuario |
User targetSize debe ser >= dataCoord.segment.maxSize; en caso contrario, se rechaza. |
Límite superior de seguridad |
Sólo límite de configuración |
maxSafeSize = min(QueryNode mem, DataNode mem) / memory_factor (autónomo sin agrupación: reducido a la mitad) |
Forma de fusión |
m → 1 por tarea, salida <= configMaxSize |
m → n, salidas cercanas a targetSize |
Comportamiento del segmento medio |
Puede atascarse permanentemente (por ejemplo, dos segmentos del 60% no pueden convertirse legalmente en un segmento del 120%) |
Reempaquetar + dividir funciona; no hay patrón "atascado en el 60% |
Capacidad de aplanamiento de la colección |
Limitada; las ejecuciones repetidas pueden dejar muchos segmentos medios. |
Fuerte; diseñado para reducir el número de segmentos y aumentar la plenitud |
Conocimiento de la topología |
Ninguna |
Sí; utiliza QueryNode/replica/disposición en fragmentos |
Ajuste del paralelismo de lectura |
Ninguno |
Ajusta el recuento de salida utilizando queryNodeCount / (replicas × shards) cuando es válido |
Caso de uso típico |
Limpieza diaria de alto volumen tras escrituras/borrados |
Preparación de pruebas, optimización de búsquedas, alineación de paralelismo de carga |
Alcance esperado |
No se espera un reempaquetado completo de la colección |
Destinado a resultados de reempaquetado a nivel de colección |
Guía de selección:
Elija la compactación estándar para una limpieza incremental de bajo riesgo.
Elija la fusión forzada cuando desee explícitamente remodelar la colección en menos segmentos de mayor tamaño alineados con el comportamiento de búsqueda y carga.
¿En qué se diferencia la fusión forzada de la compactación por agrupación?
Lacompactación por agrupación (is_clustering=True) reorganiza los datos dentro de los segmentos basándose en una clave de agrupación para mejorar la poda de búsqueda. La combinación forzada (target_size=N) optimiza el tamaño de los segmentos sin cambiar la distribución de los datos. Sirven para diferentes propósitos y pueden utilizarse conjuntamente: ejecute primero la compactación por agrupación para organizar los datos y, a continuación, Force Merge para consolidar los segmentos resultantes.
¿Puedo ejecutar Force Merge en una colección que se está consultando?
Sí. La combinación forzada se ejecuta de forma asíncrona y no bloquea las consultas. Sin embargo, consume recursos de DataNode y de E/S de disco, por lo que la latencia de las consultas puede aumentar durante la compactación. Para obtener mejores resultados, programe la Fusión forzada durante periodos de poco tráfico.
¿Qué ocurre si establezco un target_size inferior a maxSize?
La solicitud se rechaza con un error. El tamaño objetivo debe ser mayor o igual que el configurado en dataCoord.segment.maxSize.