🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
  • Home
  • Blog
  • Как уплотнить данные в Milvus?

Как уплотнить данные в Milvus?

  • Engineering
February 21, 2022
Bingyi Sun

Binlog Cover Image Изображение на обложке Binlog

Авторы Бинги Сун и Анжела Ни.

С официальным выпуском Milvus 2.0 GA появился список новых функций. Среди них уплотнение - одна из новых функций, которая поможет вам сэкономить место в хранилище.

Под уплотнением понимается процесс объединения мелких сегментов в крупные и очистка логически удаленных данных. Другими словами, уплотнение уменьшает использование дискового пространства за счет очистки удаленных или просроченных сущностей в бинлогах. Это фоновая задача, которая запускается data coord и выполняется data node в Milvus.

В этой статье рассматривается концепция и реализация уплотнения в Milvus.

Что такое уплотнение?

Прежде чем углубиться в детали реализации уплотнения в Milvus 2.0, важно понять, что такое уплотнение в Milvus.

Чаще всего, как пользователь Milvus, вы могли столкнуться с проблемой увеличения занимаемого места на жестком диске. Другая проблема заключается в том, что сегмент, содержащий менее 1024 строк, не индексируется и поддерживает только грубый поиск для обработки запросов. Маленькие сегменты, вызванные автопромывкой или вызванной пользователем промывкой, могут снижать эффективность запросов.

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

Такие базы данных, как LevelDB и RocksDB, добавляют данные в таблицы сортированных строк (SSTables). Среднее количество считываний с диска на запрос увеличивается с ростом числа SSTables, что приводит к неэффективным запросам. Чтобы уменьшить усиление чтения и освободить место на жестком диске, эти базы данных уплотняют SSTables в одну. Процессы уплотнения выполняются в фоновом режиме автоматически.

Аналогичным образом Milvus добавляет вставленные и удаленные данные в бинлоги. При увеличении количества бинлогов используется больше места на жестком диске. Чтобы освободить место на жестком диске, Milvus уплотняет бинлоги удаленных и вставленных данных. Если объект был вставлен, но затем удален, он больше не существует в бинлогах, которые записывают вставку или удаление данных после уплотнения. Кроме того, Milvus также уплотняет сегменты - файлы данных, автоматически создаваемые Milvus для хранения вставленных данных.

Как настроить уплотнение?

Конфигурация уплотнения в Milvus включает в себя два параметра: dataCoord.enableCompaction и common.retentionDuration.

dataCoord.enableCompaction определяет, нужно ли включать уплотнение. Его значение по умолчанию - true.

common.retentionDuration задает период, в течение которого уплотнение не выполняется. Единицей измерения является секунда. При уплотнении данных все удаленные сущности становятся недоступными для поиска с помощью Time Travel. Поэтому, если вы планируете осуществлять поиск с помощью Time Travel, необходимо указать период времени, в течение которого уплотнение не выполняется и не влияет на удаленные данные. Чтобы обеспечить точные результаты поиска с помощью Time Travel, Milvus сохраняет данные, работавшие в период, указанный на common.retentionDuration. То есть данные, работавшие в этот период, не будут уплотнены. Дополнительные сведения см. в разделе Поиск с путешествием во времени.

По умолчанию уплотнение данных в Milvus включено. Если вы отключили уплотнение, но позже хотите включить его вручную, выполните следующие действия:

  1. Вызовите метод collection.compact(), чтобы запустить процесс глобального уплотнения вручную. Однако имейте в виду, что эта операция может занять много времени.
  2. После вызова метода возвращается идентификатор уплотнения. Просмотреть статус уплотнения можно, вызвав метод collection.get_compaction_state().

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

Как реализовать уплотнение?

В Milvus вы можете реализовать уплотнение вручную или автоматически.

Ручное уплотнение бинлогов или сегментов не требует выполнения каких-либо условий запуска. Поэтому, если вы вручную вызываете уплотнение, бинлоги или сегменты будут уплотнены независимо от того, что произошло.

Однако если вы хотите включить автоматическое уплотнение, то для того, чтобы система уплотнила сегменты или бинлоги, должны быть выполнены определенные условия запуска уплотнения.

Вообще, в Milvus есть два типа объектов, которые можно уплотнять: бинлоги и сегменты.

Компактирование бинлогов

Бинлог - это двоичный журнал или меньшая единица сегмента, которая записывает и обрабатывает обновления и изменения данных в векторной базе данных Milvus. Данные из сегмента хранятся в нескольких бинлогах. В Milvus уплотнение бинлогов включает в себя два типа бинлогов: вставные бинлоги и дельта-бинлоги.

Дельта-бинлоги генерируются при удалении данных, а бинлоги вставки генерируются при следующих трех обстоятельствах.

  • При добавлении вставленных данных сегмент достигает верхнего предела размера и автоматически сбрасывается на диск.
  • DataCoord автоматически удаляет сегменты, которые остаются незапечатанными в течение длительного времени.
  • Некоторые API, такие как collection.num_entities, collection.load() и другие, автоматически вызывают flush для записи сегментов на диск.

Таким образом, уплотнение бинлогов, как следует из названия, означает уплотнение бинлогов в пределах сегмента. Более конкретно, во время уплотнения бинлога уплотняются все дельта-бэнлоги и бэнлоги вставки, которые не сохраняются.

Binlog compaction Уплотнение бинлогов

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

  1. Строки в дельта-бинлогах составляют более 20 % от общего количества строк.
  2. Размер дельта-бинлогов превышает 10 МБ.

Уплотнение сегментов

Сегмент - это файл данных, автоматически создаваемый Milvus для хранения вставленных данных. В Milvus существует два типа сегментов: растущий сегмент и закрытый сегмент.

Растущий сегмент продолжает получать новые вставленные данные, пока не будет запечатан. Запечатанный сегмент больше не получает новых данных и смывается в хранилище объектов, оставляя новые данные для вставки во вновь созданный растущий сегмент.

Таким образом, уплотнение сегмента означает уплотнение нескольких уплотненных сегментов. Более конкретно, во время уплотнения сегментов маленькие сегменты уплотняются в большие.

Segment compaction Уплотнение сегментов

Каждый сегмент, созданный после уплотнения, не может превышать верхний предел размера сегмента, который по умолчанию составляет 512 МБ. Как изменить верхний предел размера сегмента, читайте в конфигурации системы.

Когда сегмент сбрасывается на диск или когда Milvus запрашивает глобальное уплотнение, поскольку уплотнение не выполнялось в течение длительного времени, для запуска автоматического уплотнения должно быть выполнено следующее условие:

  • Сегменты меньше 0,5 * MaxSegmentSize больше 10.

Что дальше?

Что делать дальше после изучения основ уплотнения в Milvus? В настоящее время не все параметры для настройки уплотнения находятся в файле milvus.yaml, а стратегии генерации планов относительно просты. Приходите и вносите свой вклад в Milvus, проект с открытым исходным кодом, если вам это интересно!

Кроме того, в блоге серии новых функций 2.0 мы постарались объяснить дизайн новых функций. Читайте больше в этой серии блогов!

Об авторе

Биньи Сунь, старший инженер-программист проекта Milvus, получил степень магистра в области программной инженерии в Шанхайском университете Цзяо Тун. В основном он отвечает за разработку компонентов Milvus 2.0, связанных с хранением данных. Область его интересов - базы данных и распределенные системы. Он большой поклонник проектов с открытым исходным кодом и гурман, который в свободное время любит играть в видеоигры и читать.

Like the article? Spread the word

Продолжить чтение