Уплотнение Force MergeCompatible with Milvus 3.0.x
Функция Force Merge предназначена для объединения мелких и фрагментированных сегментов в более мелкие и крупные для повышения производительности запросов и эффективности хранения данных. В этом руководстве объясняется, как использовать уплотнение принудительного слияния.
Эта функция находится в стадии публичного предварительного просмотра. Не используйте ее в производственных средах.
Обзор
Стандартное уплотнение позволяет поддерживать размеры сегментов на уровне, близком к настроенному maxSize, благодаря слиянию "многие к одному", но при этом могут оставаться фрагменты среднего размера, которые нельзя объединить дальше без превышения лимитов. Например, как показано ниже, если коллекция состоит из пяти сегментов по 2 МБ, а maxSize составляет 3 МБ, объединение любых двух сегментов превысит лимит, поэтому стандартное уплотнение не сможет еще больше уменьшить количество сегментов и останется фрагментированный макет.
Принудительное слияние добавляет параметр target_size и поддерживает реорганизацию сегментов в направлении желаемого размера в пределах жесткого допуска, когда это возможно. Как показано ниже, если указанный target_size составляет 4 МБ, пять небольших сегментов по 2 МБ могут быть объединены в меньшее количество больших сегментов. Это уменьшает избыточное количество сегментов, поддерживает цели большего размера, чем настройки по умолчанию maxSize, и, если цель очень большая, позволяет системе выбрать практичный размер выходного файла и количество сегментов для текущего оборудования и топологии QueryNode.
Чтобы понять, какой метод уплотнения использовать, смотрите раздел FAQ.
R8eow3kaqhktokblcmocnvxmnee
Принудительное уплотнение слияния расширяет существующий Compaction API с помощью параметра target_size. Он полностью совместим с обратным развитием: существующие вызовы уплотнения без target_size продолжают работать как прежде.
Force merge работает асинхронно. Оно не блокирует операции поиска или запроса, хотя во время выполнения потребляет ресурсы ввода-вывода и памяти.
Использование уплотнения принудительного слияния
Необходимые условия
Milvus версии 3.0 или более поздней
PyMilvus 3.0 или более поздняя версия
Глобальная конфигурация
Следующие параметры конфигурации управляют поведением Force Merge. Задайте их в конфигурационном файле Milvus или с помощью переменных окружения.
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.
Параметр |
Значение по умолчанию |
Описание |
|---|---|---|
|
512 |
Максимальный размер сегмента по умолчанию в МБ. Используется в качестве целевого значения, когда |
|
100 |
Пороговое значение количества сегментов для выбора алгоритма. Когда количество сегментов превышает это значение, Milvus использует более быстрый жадный алгоритм для планирования слияния.
|
|
4.0 |
Память DataNode делится на этот коэффициент, чтобы вычислить наибольший размер сегмента, который может позволить система.
|
|
4.0 |
Минимальная память QueryNode делится на этот коэффициент. Используется при автоматическом расчете размера (
|
Чтобы применить вышеуказанные изменения к кластеру Milvus, выполните действия, описанные в разделах Настройка Milvus с помощью Helm и Настройка Milvus с помощью Milvus Operators.
Запуск уплотнения Force Merge
Вы запускаете уплотнение Force Merge, вызывая compact() с параметром target_size. Подробные сведения о параметре см. в разделе Ссылка на параметр ниже.
Доступны три режима уплотнения принудительного слияния:
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
Ниже приведены примеры использования каждого режима принудительного уплотнения.
По умолчанию (стандартное уплотнение)
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")
Явный целевой размер
# Merge segments to approximately 2 GB each
job_id = client.compact(
"target_collection",
target_size="2048" # The unit is MB
)
Автоматический расчет размера
# Let Milvus determine the optimal segment size
max_int64 = (1 << 63) - 1
job_id = client.compact(
"target_collection",
target_size=max_int64
)
Ссылка на параметры
В следующей таблице приведены пояснения к параметрам.
Параметр |
Тип |
Описание |
|---|---|---|
|
str |
Требуется. Имя коллекции для уплотнения. |
|
int |
Необязательно. Размер целевого сегмента в МБ. Существует 3 варианта значения параметра:
|
Если указанный target_size меньше сконфигурированного dataCoord.segment.maxSize, запрос отклоняется с ошибкой.
Проверка хода уплотнения
Уплотнение Force Merge выполняется асинхронно. Для проверки хода выполнения используйте возвращаемый идентификатор задания:
# Check compaction state
state = client.get_compaction_state(job_id)
print(f"State: {state}")
Лучшие практики
Не используйте принудительное уплотнение в производственных средах.
В большинстве случаев используйте режим автоматического расчета размера. Установка
target_sizeнаmax_int64позволяет Milvus анализировать распределение сегментов и ресурсы узлов для определения оптимального размера. Это рекомендуемый подход, если у вас нет особых требований к размеру.Учитывайте компромисс производительности. Уплотнение с принудительным слиянием - ресурсоемкая операция. Она считывает, объединяет и перезаписывает данные сегмента. Запланируйте ее на периоды с низким трафиком, чтобы минимизировать влияние на задержку запросов.
Следите за количеством сегментов до и после операции. Используйте
get_compaction_state()иlist_persistent_segments, чтобы убедиться, что в результате уплотнения сегментов стало меньше и они стали больше, как и ожидалось.
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
Чем Force Merge отличается от стандартного уплотнения?
Эти два типа операций уплотнения служат разным целям.
Стандартное уплотнение (targetSize=0 или опущено) - это наилучший путь инкрементной очистки.
Принудительное слияние (targetSize>0) - это путь переупаковки на уровне коллекции для получения меньшего количества больших сегментов, близких к целевым.
Ключевое различие заключается в форме слияния: стандартное уплотнение эффективно m → 1 на задачу, в то время как принудительное слияние - m → n на сгруппированные входы. Именно поэтому принудительное слияние может решать задачи компоновки сегментов, которые стандартное уплотнение решить не может. В следующей таблице приведено сравнение двух типов операций.
Размерность |
Стандартное уплотнение (по умолчанию) |
Принудительное объединение |
|---|---|---|
API-триггер |
targetSize=0 (или не установлен), флаг Major/L0 отсутствует |
targetSize>0 (МБ) |
Основная цель |
Инкрементная очистка очевидных фрагментов; рутинное обслуживание |
Консолидация всей коллекции для поиска и баланса |
Источник размера сегмента |
Фиксированный dataCoord.segment.maxSize (конфигурация сервера) |
Пользовательский целевой размер (targetSize), затем безопасный размер (maxSafeSize) |
Действие параметра |
Нет настройки размера пользователя |
Пользовательский targetSize должен быть >= dataCoord.segment.maxSize; в противном случае отклоняется |
Верхняя граница безопасности |
Только ограничение конфигурации |
maxSafeSize = min(QueryNode mem, DataNode mem) / memory_factor (автономная работа без пулинга: дополнительно уменьшается вдвое) |
Форма слияния |
m → 1 на задачу, выход <= configMaxSize |
m → n, выходы близки к targetSize |
Поведение среднего сегмента |
Может застрять надолго (например, два 60% сегмента не могут законно стать одним 120% сегментом) |
Переупаковка + разбиение работает; нет шаблона "застрял на 60%" |
Возможность сплющивания коллекции |
Ограниченная; при повторных запусках может остаться много средних сегментов |
Сильная; предназначена для уменьшения количества сегментов и увеличения полноты |
Осознание топологии |
Нет |
Да; используется QueryNode/replica/shard layout |
Настройка параллелизма на пути чтения |
Нет |
Корректирует количество выходов, используя queryNodeCount / (реплики × шарды), если это действительно так. |
Типичный случай использования |
Высокопроизводительная ежедневная очистка после записи/удаления |
Подготовка бенчмарков, оптимизация поиска, выравнивание параллелизма нагрузки |
Ожидаемый объем |
Не ожидайте полного репака коллекции |
Предназначен для репака на уровне коллекции |
Рекомендации по выбору:
Выбирайте стандартное уплотнение для инкрементной очистки с низким риском.
Выбирайте принудительное слияние, если вы явно хотите изменить форму коллекции, разбив ее на меньшее количество больших сегментов в соответствии с поведением при поиске и загрузке.
Чем Force Merge отличается от кластерного уплотнения?
Clustering compaction (is_clustering=True) реорганизует данные в сегментах на основе ключа кластеризации, чтобы улучшить обрезку поиска. Force Merge (target_size=N) оптимизирует размеры сегментов без изменения распределения данных. Они служат разным целям и могут использоваться вместе - сначала запустите уплотнение кластеризации для упорядочивания данных, а затем Force Merge для консолидации полученных сегментов.
Можно ли запустить Force Merge на коллекции, к которой выполняется запрос?
Да. Force Merge выполняется асинхронно и не блокирует запросы. Однако она потребляет ресурсы DataNode и дискового ввода-вывода, поэтому во время уплотнения может увеличиться задержка запросов. Для достижения наилучших результатов планируйте Force Merge на периоды с низким трафиком.
Что произойдет, если я задам target_size меньше maxSize?
Запрос будет отклонен с ошибкой. Целевой размер должен быть больше или равен настроенному dataCoord.segment.maxSize.