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

milvus-logo
LFAI
Главная
  • Концепции
  • Home
  • Docs
  • Концепции

  • Архитектура

  • Обработка данных

Обработка данных

Эта статья содержит подробное описание реализации в Milvus вставки данных, построения индексов и запросов к данным.

Вставка данных

Для каждой коллекции в Milvus можно указать количество шардов, каждый из которых соответствует виртуальному каналу(vchannel). Как показано на следующем рисунке, Milvus назначает каждому vchannel в брокере журналов физический канал(pchannel). Любой входящий запрос на вставку/удаление направляется на шарды на основе хэш-значения первичного ключа.

Валидация DML-запросов переносится на прокси, поскольку в Milvus нет сложных транзакций. Прокси запрашивает временную метку для каждого запроса на вставку/удаление у TSO (Timestamp Oracle), который является модулем синхронизации, расположенным в корневом координаторе. Поскольку старая временная метка перезаписывается новой, временные метки используются для определения последовательности обрабатываемых запросов данных. Proxy получает информацию из data coord партиями, включая сегменты сущностей и первичные ключи, чтобы увеличить общую пропускную способность и избежать перегрузки центрального узла.

Channels 1 Каналы 1

В журнал записываются как операции DML (язык манипулирования данными), так и операции DDL (язык определения данных), но операциям DDL назначается только один канал из-за их низкой частоты появления.

Channels 2 Каналы 2

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

Write log sequence Последовательность записи журнала

На приведенной выше схеме показаны четыре компонента, участвующие в процессе записи последовательности журналов: прокси, брокер журналов, узел данных и хранилище объектов. Процесс включает в себя четыре задачи: проверку DML-запросов, публикацию-подписку последовательности журналов, преобразование потокового журнала в снимки журналов и сохранение снимков журналов. Эти четыре задачи отделены друг от друга, чтобы убедиться, что каждая из них выполняется узлом соответствующего типа. Узлы одного и того же типа являются равноправными и могут эластично и независимо масштабироваться для работы с различными нагрузками данных, в частности с массивными и сильно колеблющимися потоковыми данными.

Построение индекса

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

Index building Построение индекса

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

Построение индекса в основном включает в себя операции с векторами и матрицами и, следовательно, требует больших затрат вычислений и памяти. Векторы не могут быть эффективно проиндексированы традиционными древовидными индексами из-за их высокой размерности, но могут быть проиндексированы методами, которые более развиты в этой области, такими как кластерные или графовые индексы. Независимо от типа, построение индекса предполагает массивные итерационные вычисления для крупномасштабных векторов, такие как Kmeans или graph traverse.

В отличие от индексирования скалярных данных, построение векторного индекса должно в полной мере использовать преимущества ускорения SIMD (single instruction, multiple data). Milvus имеет встроенную поддержку наборов инструкций SIMD, например, SSE, AVX2 и AVX512. Учитывая "заминки" и ресурсоемкость построения векторных индексов, эластичность приобретает для Milvus решающее значение с экономической точки зрения. В будущих релизах Milvus будут продолжены исследования в области гетерогенных вычислений и бессерверных вычислений для снижения соответствующих затрат.

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

Запрос данных

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

Data query Запрос данных

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

При запросе данных узлы запроса независимы друг от друга. Каждый узел отвечает только за две задачи: Загружать или освобождать сегменты, следуя инструкциям коорд запроса; проводить поиск в локальных сегментах. А прокси отвечает за сокращение результатов поиска от каждого узла запроса и возврат окончательных результатов клиенту.

Handoff Передача

Существует два типа сегментов: растущие сегменты (для инкрементных данных) и закрытые сегменты (для исторических данных). Узлы запросов подписываются на vchannel, чтобы получать последние обновления (инкрементные данные) в виде растущих сегментов. Когда растущий сегмент достигает заданного порога, координатор данных запечатывает его и начинается построение индекса. Затем операция передачи, инициированная координатором запросов, превращает инкрементные данные в исторические. Координатор запросов равномерно распределяет запечатанные сегменты между всеми узлами запросов в соответствии с использованием памяти, нагрузкой на процессор и количеством сегментов.

Что дальше

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?