Уплотнение Force MergeCompatible with Milvus 3.0.x

Функция Force Merge предназначена для объединения мелких и фрагментированных сегментов в более мелкие и крупные для повышения производительности запросов и эффективности хранения данных. В этом руководстве объясняется, как использовать уплотнение принудительного слияния.

Эта функция находится в стадии публичного предварительного просмотра. Не используйте ее в производственных средах.

Обзор

Стандартное уплотнение позволяет поддерживать размеры сегментов на уровне, близком к настроенному maxSize, благодаря слиянию "многие к одному", но при этом могут оставаться фрагменты среднего размера, которые нельзя объединить дальше без превышения лимитов. Например, как показано ниже, если коллекция состоит из пяти сегментов по 2 МБ, а maxSize составляет 3 МБ, объединение любых двух сегментов превысит лимит, поэтому стандартное уплотнение не сможет еще больше уменьшить количество сегментов и останется фрагментированный макет.

Принудительное слияние добавляет параметр target_size и поддерживает реорганизацию сегментов в направлении желаемого размера в пределах жесткого допуска, когда это возможно. Как показано ниже, если указанный target_size составляет 4 МБ, пять небольших сегментов по 2 МБ могут быть объединены в меньшее количество больших сегментов. Это уменьшает избыточное количество сегментов, поддерживает цели большего размера, чем настройки по умолчанию maxSize, и, если цель очень большая, позволяет системе выбрать практичный размер выходного файла и количество сегментов для текущего оборудования и топологии QueryNode.

Чтобы понять, какой метод уплотнения использовать, смотрите раздел FAQ.

R8eow3kaqhktokblcmocnvxmnee 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.

Параметр

Значение по умолчанию

Описание

dataCoord.segment.maxSize

512

Максимальный размер сегмента по умолчанию в МБ. Используется в качестве целевого значения, когда target_size равен 0 или опущен. Также служит минимально допустимым значением для явного target_size.

dataCoord.compaction.maxFullSegmentThreshold

100

Пороговое значение количества сегментов для выбора алгоритма. Когда количество сегментов превышает это значение, Milvus использует более быстрый жадный алгоритм для планирования слияния.

  • Стандартный алгоритм (используется, когда количество сегментов <= dataCoord.compaction.maxFullSegmentThreshold): дает более оптимальные результаты слияния, но требует больше времени на вычисление.

  • Жадный алгоритм (используется, когда количество сегментов > dataCoord.compaction.maxFullSegmentThreshold): завершает планирование гораздо быстрее за счет чуть менее оптимальной группировки сегментов.

dataCoord.compaction.forceMerge.datanodeMemoryFactor

4.0

Память DataNode делится на этот коэффициент, чтобы вычислить наибольший размер сегмента, который может позволить система.

  • При большем значении на слияние выделяется меньше памяти, но больше остается для других операций DataNode, что повышает стабильность узла.

  • Меньшее значение позволяет объединять большие сегменты, но увеличивает нагрузку на память.

  • Например, при значении коэффициента по умолчанию 4.0 и узле DataNode с 16 ГБ памяти бюджет слияния составляет 4 ГБ. Это означает, что общий размер сегментов, объединяемых за одну операцию, не может превышать 4 ГБ.

dataCoord.compaction.forceMerge.querynodeMemoryFactor

4.0

Минимальная память QueryNode делится на этот коэффициент. Используется при автоматическом расчете размера (target_size=max_int64), чтобы гарантировать, что объединенные сегменты могут быть загружены узлами QueryNode.

  • При большем значении получаются меньшие сегменты, которые легче загружать узлам запроса.

  • Меньшее значение позволяет получить более крупные сегменты, но может привести к сбоям при загрузке на узлах QueryNodes с ограниченным объемом памяти.

  • Например, при значении коэффициента по умолчанию 4.0 и самом маленьком узле QueryNode с памятью 16 ГБ, автоматически вычисляемый целевой размер не будет превышать 4 ГБ. Это не позволит Force Merge создавать настолько большие сегменты, что узлы QueryNodes не смогут их загрузить.

Чтобы применить вышеуказанные изменения к кластеру 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
)

Ссылка на параметры

В следующей таблице приведены пояснения к параметрам.

Параметр

Тип

Описание

collection_name

str

Требуется. Имя коллекции для уплотнения.

target_size

int

Необязательно. Размер целевого сегмента в МБ. Существует 3 варианта значения параметра:

  • 0 или опущено: Используется настроенный dataCoord.segment.maxSize (по умолчанию: 512 МБ). Эквивалентно стандартному уплотнению.

  • Явное значение: Объединяет сегменты примерно до указанного размера в МБ (например, 2048). Должно быть больше или равно настроенному dataCoord.segment.maxSize.

  • max_int64 ((1 << 63) - 1): Автоматически вычисляет оптимальный размер на основе текущего распределения сегментов и доступных ресурсов узла.

Если указанный 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.