Вставка и сохранение данных в векторной базе данных
Изображение на обложке
Эта статья написана Биньи Сун и переработана Анжелой Ни.
В предыдущей статье из серии "Глубокое погружение" мы рассказали о том, как обрабатываются данные в Milvus, самой передовой в мире векторной базе данных. В этой статье мы продолжим рассматривать компоненты, участвующие во вставке данных, подробно проиллюстрируем модель данных и объясним, как в Milvus достигается сохранение данных.
Перейти к:
- Обзор архитектуры Milvus
- Портал запросов на вставку данных
- Корд данных и узел данных
- Корневая координата и временной тик
- Организация данных: коллекция, раздел, осколок (канал), сегмент
- Распределение данных: когда и как
- Структура файлов Binlog и сохранение данных
Обзор архитектуры Milvus
Архитектура Milvus.
SDK отправляет запросы данных на прокси, портал, через балансировщик нагрузки. Затем прокси взаимодействует с сервисом-координатором для записи запросов DDL (язык определения данных) и DML (язык манипулирования данными) в хранилище сообщений.
Рабочие узлы, включая узел запросов, узел данных и индексный узел, потребляют запросы из хранилища сообщений. В частности, узел запросов отвечает за запрос данных, узел данных - за вставку и сохранение данных, а индексный узел в основном занимается построением индексов и ускорением запросов.
Нижний уровень - это объектное хранилище, которое в основном использует MinIO, S3 и AzureBlob для хранения журналов, дельта-бинлогов и индексных файлов.
Портал запросов на вставку данных
Прокси в Milvus.
Прокси служит порталом запросов на вставку данных.
- Изначально прокси принимает запросы на вставку данных от SDK и распределяет их на несколько бакетов с помощью хэш-алгоритма.
- Затем прокси запрашивает data coord для назначения сегментов, наименьшей единицы в Milvus для хранения данных.
- После этого прокси вставляет информацию о запрошенных сегментах в хранилище сообщений, чтобы эти данные не были потеряны.
Координатор данных и узел данных
Основная функция data coord - управление распределением каналов и сегментов, а основная функция data node - потребление и сохранение вставленных данных.
Коорд данных и узел данных в Milvus.
Функция
Data coord выполняет следующие функции:
Выделение сегментного пространстваData coord выделяет прокси пространство в растущих сегментах, чтобы прокси мог использовать свободное пространство в сегментах для вставки данных.
Запись распределения сегмента и времени истечения срока действия выделенного пространства в сегментеПространство в каждом сегменте, выделенное data coord, не является постоянным, поэтому data coord также должен вести запись времени истечения срока действия каждого выделенного сегмента.
Автоматическая промывка данных сегментаЕсли сегмент заполнен, координатор данных автоматически запускает промывку данных.
Распределение каналов для узлов данныхКоллекция может иметь несколько vchannels. Data coord определяет, какие vchannels потребляются узлами данных.
Узел данных выполняет следующие функции:
Потребление данныхУзел данных потребляет данные из каналов, выделенных data coord, и создает последовательность для этих данных.
Сохранение данныхКэширование вставленных данных в памяти и автоматическая очистка вставленных данных на диск, когда объем данных достигает определенного порога.
Рабочий процесс
Один канал vchannel может быть назначен только одному узлу данных.
Как показано на рисунке выше, коллекция имеет четыре канала (V1, V2, V3 и V4) и два узла данных. Вполне вероятно, что data coord назначит один узел данных для потребления данных из V1 и V2, а другой узел данных - из V3 и V4. Один канал vchannel не может быть назначен нескольким узлам данных, и это делается для предотвращения повторного потребления данных, что в противном случае приведет к повторной вставке одной и той же порции данных в один и тот же сегмент.
Root coord и Time Tick
Root coord управляет TSO (timestamp Oracle) и публикует сообщения о временных отметках в глобальном масштабе. Каждый запрос на вставку данных имеет временную метку, назначенную корневым коордом. Time Tick - это краеугольный камень Milvus, который действует как часы в Milvus и указывает, в какой момент времени находится система Milvus.
Когда данные записываются в Milvus, каждый запрос на вставку данных содержит временную метку. Во время потребления данных каждый узел временных данных потребляет данные, временные метки которых находятся в определенном диапазоне.
Пример вставки и потребления данных на основе временной метки.
На рисунке выше показан процесс вставки данных. Значения временных меток представлены числами 1,2,6,5,7,8. Данные записываются в систему двумя прокси-серверами: p1 и p2. Во время потребления данных, если текущее время Time Tick равно 5, узлы данных могут считывать только данные 1 и 2. Затем во время второго чтения, если текущее время Time Tick становится 9, данные 6,7,8 могут быть прочитаны узлом данных.
Организация данных: коллекция, раздел, осколок (канал), сегмент
Организация данных в Milvus.
Прочитайте эту статью, чтобы понять модель данных в Milvus и понятия коллекции, раздела и сегмента.
В целом, самой крупной единицей данных в Milvus является коллекция, которую можно сравнить с таблицей в реляционной базе данных. Коллекция может иметь несколько осколков (каждый из которых соответствует каналу) и несколько разделов внутри каждого осколка. Как показано на рисунке выше, каналы (шарды) - это вертикальные полосы, а разделы - горизонтальные. На каждом пересечении находится понятие сегмента, наименьшей единицы для распределения данных. В Milvus индексы строятся на основе сегментов. Во время выполнения запроса система Milvus также балансирует нагрузку на различные узлы запроса, и этот процесс происходит на основе единицы сегментов. Сегменты содержат несколько бинлогов, и когда данные сегмента расходуются, генерируется файл бинлога.
Сегмент
В Milvus существует три типа сегментов с различным статусом: растущий, запечатанный и промытый сегмент.
Растущий сегмент
Растущий сегмент - это вновь созданный сегмент, который может быть выделен прокси-серверу для вставки данных. Внутреннее пространство сегмента может быть использовано, выделено или свободно.
Три состояния растущего сегмента
- Используется: эта часть пространства растущего сегмента была использована узлом данных.
- Выделено: эта часть пространства растущего сегмента была запрошена прокси и выделена узлом данных. Выделенное пространство истечет через определенное время.
- Свободно: эта часть пространства растущего сегмента не была использована. Значение свободного пространства равно общему пространству сегмента, вычтенному из значений использованного и выделенного пространства. Таким образом, свободное пространство сегмента увеличивается по мере истечения выделенного пространства.
Герметичный сегмент
Запечатанный сегмент - это закрытый сегмент, который больше не может быть выделен прокси-серверу для вставки данных.
Запечатанный сегмент в Milvus
Растущий сегмент запечатывается в следующих случаях:
- Если используемое пространство в растущем сегменте достигает 75 % от общего пространства, сегмент будет запечатан.
- Flush() вызывается вручную пользователем Milvus, чтобы сохранить все данные в коллекции.
- Растущие сегменты, которые не запечатываются после длительного периода времени, будут запечатаны, так как слишком большое количество растущих сегментов приводит к перерасходу памяти узлами данных.
Промытый сегмент
Промытый сегмент - это сегмент, который уже был записан на диск. Промывка означает сохранение данных сегмента в объектном хранилище для обеспечения сохранности данных. Сегмент можно прошить только после того, как закончится выделенное место в запечатанном сегменте. При промывке запечатанный сегмент превращается в промытый.
Промытый сегмент в Milvus
Канал
Канал выделяется :
- Когда узел данных запускается или выключается; или
- Когда выделенное сегментное пространство запрашивается прокси.
Существует несколько стратегий выделения канала. Milvus поддерживает 2 из них:
- Последовательное хэширование
Последовательное хеширование в Milvus
Стратегия по умолчанию в Milvus. Эта стратегия использует технику хэширования для назначения каждому каналу позиции в кольце, а затем выполняет поиск в направлении по часовой стрелке, чтобы найти ближайший к каналу узел данных. Так, на иллюстрации выше канал 1 назначен узлу данных 2, а канал 2 - узлу данных 3.
Однако одна из проблем этой стратегии заключается в том, что увеличение или уменьшение числа узлов данных (например, запуск нового узла данных или внезапное отключение узла данных) может повлиять на процесс распределения каналов. Чтобы решить эту проблему, data coord отслеживает статус узлов данных через etcd, так что data coord может быть немедленно уведомлен о любых изменениях в статусе узлов данных. Затем data coord определяет, какому узлу данных правильно распределить каналы.
- Балансировка нагрузки
Вторая стратегия заключается в распределении каналов одной и той же коллекции между различными узлами данных, обеспечивая равномерное распределение каналов. Цель этой стратегии - добиться баланса нагрузки.
Распределение данных: когда и как
Процесс распределения данных в Milvus
Процесс распределения данных начинается с клиента. Сначала он отправляет запросы на вставку данных с временной меткой t1
на прокси-сервер. Затем прокси отправляет запрос в data coord на выделение сегмента.
Получив запрос на выделение сегмента, data coord проверяет статус сегмента и выделяет его. Если текущее пространство созданных сегментов достаточно для новых вставленных строк данных, коорд данных выделяет эти созданные сегменты. Однако если места в текущих сегментах недостаточно, коорд данных выделит новый сегмент. Координатор данных может возвращать один или несколько сегментов при каждом запросе. При этом коорд данных также сохраняет выделенный сегмент в метасервере для сохранения данных.
Затем координатор данных возвращает информацию о выделенном сегменте (включая идентификатор сегмента, количество строк, время истечения t2
, и т.д.) прокси-серверу. Прокси отправляет информацию о выделенном сегменте в хранилище сообщений, чтобы эта информация была правильно записана. Обратите внимание, что значение t1
должно быть меньше, чем значение t2
. По умолчанию значение t2
равно 2 000 миллисекунд, и его можно изменить, настроив параметр segment.assignmentExpiration
в файле data_coord.yaml
.
Структура файла Binlog и сохранение данных
Промывка узла данных
Узел данных подписывается на хранилище сообщений, потому что запросы на вставку данных хранятся в хранилище сообщений, и узлы данных могут таким образом потреблять сообщения на вставку. Сначала узлы данных помещают запросы на вставку в буфер вставки, и по мере накопления запросов они будут сбрасываться в хранилище объектов по достижении порогового значения.
Структура файла Binlog
Структура файла binlog.
Структура файла binlog в Milvus похожа на структуру файла в MySQL. Binlog используется для выполнения двух функций: восстановления данных и построения индексов.
Бинлог содержит множество событий. Каждое событие имеет заголовок и данные о событии.
Метаданные, включая время создания бинлога, идентификатор узла записи, длину события, NextPosition (смещение следующего события) и т. д., записываются в заголовке события.
Данные события можно разделить на две части: фиксированную и переменную.
Файловая структура события вставки.
Фиксированная часть в данных события INSERT_EVENT
содержит StartTimestamp
, EndTimestamp
и reserved
.
Переменная часть фактически хранит вставляемые данные. Данные вставки упорядочиваются в формат parquet и хранятся в этом файле.
Сохранение данных
Если в схеме есть несколько столбцов, Milvus будет хранить бинлоги в столбцах.
Сохранение данных бинлога.
Как показано на рисунке выше, первый столбец - это первичный ключ binlog. Второй - столбец временной метки. Остальные столбцы определены в схеме. Путь к файлам бинлогов в MinIO также указан на изображении выше.
О серии "Глубокое погружение
После официального объявления об общей доступности Milvus 2.0 мы организовали эту серию блогов Milvus Deep Dive, чтобы дать глубокую интерпретацию архитектуры и исходного кода Milvus. В этой серии блогов рассматриваются следующие темы:
- Обзор архитектуры Milvus
- Портал запросов на вставку данных
- Координатор данных и узел данных
- Root coord и Time Tick
- Организация данных: коллекция, раздел, осколок (канал), сегмент
- Распределение данных: когда и как
- Структура файла Binlog и сохранение данных
- О серии "Глубокое погружение
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word