Создание базы данных векторов для масштабируемого поиска сходства
Изображение на обложке
Эта статья написана Сяофань Луань и переработана Анжелой Ни и Клэр Ю.
Согласно статистике, около 80-90 % всех данных в мире являются неструктурированными. Благодаря стремительному росту Интернета в ближайшие годы ожидается взрывное увеличение объема неструктурированных данных. Следовательно, компании остро нуждаются в мощной базе данных, которая поможет им лучше обрабатывать и понимать такие данные. Однако разработать базу данных всегда легче сказать, чем сделать. Цель этой статьи - рассказать о процессе мышления и принципах проектирования при создании Milvus, облачной векторной базы данных с открытым исходным кодом для масштабируемого поиска по сходству. В статье также подробно описывается архитектура Milvus.
Перейти к:
- Неструктурированные данные требуют полного стека базового программного обеспечения
- Принципы проектирования Milvus 2.0
- Построение векторной базы данных для масштабируемого поиска по сходству
Неструктурированные данные требуют полного стека базового программного обеспечения
По мере роста и развития Интернета неструктурированные данные становились все более распространенными, включая электронные письма, документы, данные датчиков IoT, фотографии из Facebook, структуры белков и многое другое. Чтобы компьютеры могли понимать и обрабатывать неструктурированные данные, они преобразуются в векторы с помощью методов встраивания.
Milvus хранит и индексирует эти векторы, а также анализирует корреляцию между двумя векторами, вычисляя расстояние их сходства. Если два вектора встраивания очень похожи, это означает, что и исходные источники данных тоже похожи.
Рабочий процесс обработки неструктурированных данных.
Векторы и скаляры
Скаляр - это величина, которая описывается только одним измерением - величиной. Скаляр можно представить в виде числа. Например, автомобиль движется со скоростью 80 км/ч. Здесь скорость (80 км/ч) - это скаляр. Вектор же - это величина, которая описывается как минимум двумя измерениями - величиной и направлением. Если автомобиль движется на запад со скоростью 80 км/ч, то скорость (80 км/ч на запад) - это вектор. На рисунке ниже приведен пример общих скаляров и векторов.
Скаляры против векторов
Поскольку большинство важных данных имеют более одного атрибута, мы можем лучше понять эти данные, если преобразуем их в векторы. Один из распространенных способов манипулирования векторными данными - вычисление расстояния между векторами с помощью таких метрик, как евклидово расстояние, внутреннее произведение, расстояние Танимото, расстояние Хэмминга и т. д. Чем ближе расстояние, тем более похожи векторы. Чтобы эффективно запрашивать массивные векторные данные, мы можем упорядочить векторные данные, создав для них индексы. После того как набор данных проиндексирован, запросы можно направлять в кластеры или подмножества данных, которые с наибольшей вероятностью содержат векторы, схожие с входным запросом.
Чтобы узнать больше об индексах, обратитесь к разделу Векторный индекс.
От векторной поисковой системы к векторной базе данных
С самого начала Milvus 2.0 был задуман не только как поисковая система, но и, что более важно, как мощная база данных векторов.
Чтобы помочь вам понять разницу, можно провести аналогию между InnoDB и MySQL, или Lucene и Elasticsearch.
Подобно MySQL и Elasticsearch, Milvus также построен на базе библиотек с открытым исходным кодом, таких как Faiss, HNSW, Annoy, которые нацелены на предоставление поисковых функций и обеспечение производительности поиска. Однако было бы несправедливо сводить Milvus лишь к слою поверх Faiss, поскольку он хранит, извлекает, анализирует векторы и, как и любая другая база данных, предоставляет стандартный интерфейс для CRUD-операций. Кроме того, Milvus может похвастаться такими возможностями, как:
- шардинг и разделение
- Репликация
- Аварийное восстановление
- Баланс нагрузки
- Парсер или оптимизатор запросов
Векторная база данных
Чтобы получить более полное представление о том, что такое векторная база данных, читайте блог здесь.
Первый облачно-нативный подход
Нативный подход
От общего ничего, к общему хранилищу, затем к общему чему-то
Традиционные базы данных используют архитектуру "общего ничего", при которой узлы распределенных систем независимы, но связаны сетью. Память и хранилище не разделяются между узлами. Однако Snowflake произвела революцию в отрасли, представив архитектуру "общего хранения", в которой вычисления (обработка запросов) отделены от хранения (хранение базы данных). Архитектура с общим хранилищем позволяет базам данных достичь большей доступности, масштабируемости и уменьшить дублирование данных. Под влиянием Snowflake многие компании начали использовать облачную инфраструктуру для хранения данных, а локальное хранилище - для кэширования. Такая архитектура баз данных называется "общее что-то" и сегодня стала основной в большинстве приложений.
Помимо архитектуры "общее что-то", Milvus поддерживает гибкое масштабирование каждого компонента за счет использования Kubernetes для управления механизмом исполнения и разделения сервисов чтения, записи и других сервисов с помощью микросервисов.
База данных как услуга (DBaaS)
База данных как услуга - горячая тенденция, поскольку многие пользователи не только заботятся об обычном функционале базы данных, но и жаждут более разнообразных услуг. Это означает, что помимо традиционных CRUD-операций наша база данных должна расширять спектр услуг, которые она может предоставлять, например управление базой данных, транспортировка данных, начисление, визуализация и т. д.
Синергия с более широкой экосистемой открытых исходных кодов
Еще одна тенденция в разработке баз данных - использование синергии между базой данных и другими облачными инфраструктурами. В случае с Milvus она опирается на некоторые системы с открытым исходным кодом. Например, Milvus использует etcd для хранения метаданных. В нем также используется очередь сообщений - тип асинхронного взаимодействия между сервисами, используемый в архитектуре микросервисов, который может помочь экспортировать инкрементные данные.
В будущем мы надеемся создать Milvus на базе инфраструктур искусственного интеллекта, таких как Spark или Tensorflow, и интегрировать Milvus с потоковыми движками, чтобы лучше поддерживать унифицированную потоковую и пакетную обработку для удовлетворения различных потребностей пользователей Milvus.
Принципы проектирования Milvus 2.0
Milvus 2.0, как наша облачная нативная векторная база данных нового поколения, построена на следующих трех принципах.
Журнал как данные
Журнал в базе данных последовательно записывает все изменения, внесенные в данные. Как показано на рисунке ниже, слева направо расположены "старые данные" и "новые данные". Журналы располагаются в порядке возрастания времени. В Milvus есть механизм глобального таймера, назначающего одну глобально уникальную и автоинкрементную временную метку.
Журналы
В Milvus 2.0 брокер журналов служит основой системы: все операции по вставке и обновлению данных должны проходить через брокер журналов, а рабочие узлы выполняют CRUD-операции, подписываясь на журналы и потребляя их.
Двойственность таблицы и журнала
И таблица, и журнал - это данные, и это всего лишь две разные формы. Таблицы - это ограниченные данные, а журналы - неограниченные. Журналы можно преобразовать в таблицы. В случае с Milvus он агрегирует журналы с помощью окна обработки из TimeTick. На основе последовательности журналов несколько журналов объединяются в один небольшой файл, называемый снимком журнала. Затем эти снимки журнала объединяются в сегмент, который можно использовать по отдельности для балансировки нагрузки.
Постоянство журнала
Постоянство журналов - одна из сложных проблем, с которой сталкиваются многие базы данных. Хранение журналов в распределенной системе обычно зависит от алгоритмов репликации.
В отличие от таких баз данных, как Aurora, HBase, Cockroach DB и TiDB, Milvus использует новаторский подход и представляет систему публикации-подписки (pub/sub) для хранения и персистентности журналов. Система pub/sub аналогична очереди сообщений в Kafka или Pulsar. Все узлы в системе могут использовать журналы. В Milvus такая система называется брокером журналов. Благодаря лог-брокеру журналы отделены от сервера, что обеспечивает отсутствие статичности в Milvus и возможность быстрого восстановления после сбоя системы.
Брокер журналов
Создание базы данных векторов для масштабируемого поиска по сходству
Построенная на базе популярных библиотек векторного поиска, включая Faiss, ANNOY, HNSW и другие, Milvus была разработана для поиска сходства в плотных векторных наборах данных, содержащих миллионы, миллиарды и даже триллионы векторов.
Автономный и кластерный
Milvus предлагает два способа развертывания - автономный или кластерный. В автономном Milvus, поскольку все узлы развернуты вместе, мы можем рассматривать Milvus как единый процесс. В настоящее время Milvus standalone полагается на MinIO и etcd для сохранения данных и хранения метаданных. В будущих релизах мы надеемся отказаться от этих двух сторонних зависимостей, чтобы обеспечить простоту системы Milvus. Кластер Milvus включает в себя восемь компонентов микросервисов и три сторонних зависимости: MinIO, etcd и Pulsar. Pulsar служит брокером журналов и обеспечивает сервисы pub/sub журналов.
Автономный и кластерный
Голый скелет архитектуры Milvus
Milvus отделяет поток данных от потока управления и разделен на четыре уровня, которые независимы с точки зрения масштабируемости и аварийного восстановления.
Архитектура Milvus
Уровень доступа
Уровень доступа выступает в качестве лица системы, открывая конечную точку клиентского соединения внешнему миру. Он отвечает за обработку клиентских соединений, статическую проверку, базовые динамические проверки пользовательских запросов, перенаправление запросов, сбор и возврат результатов клиенту. Сам прокси не имеет статической проверки и предоставляет единые адреса доступа и сервисы во внешний мир через компоненты балансировки нагрузки (Nginx, Kubernetess Ingress, NodePort и LVS). Milvus использует архитектуру массивно-параллельной обработки (MPP), где прокси возвращают результаты, собранные с рабочих узлов после глобальной агрегации и постобработки.
Служба координатора
Служба координаторов - это "мозг" системы, отвечающий за управление узлами топологии кластера, балансировку нагрузки, генерацию временных меток, объявление данных и управление ими. Для подробного объяснения функций каждого сервиса-координатора читайте техническую документацию Milvus.
Рабочие узлы
Рабочий узел, или узел выполнения, действует как конечный узел системы, выполняя инструкции, выданные службой координатора, и команды языка манипулирования данными (DML), инициированные прокси. Рабочий узел в Milvus аналогичен узлу данных в Hadoop или региональному серверу в HBase. Каждому типу рабочего узла соответствует свой коорд-сервис. Для подробного объяснения функций каждого рабочего узла читайте техническую документацию Milvus.
Хранилище
Хранилище - это краеугольный камень Milvus, отвечающий за сохранение данных. Слой хранения делится на три части:
- Метахранилище: Отвечает за хранение снимков метаданных, таких как схема коллекции, статус узла, контрольные точки потребления сообщений и т. д. Milvus полагается на etcd для этих функций, а Etcd также берет на себя ответственность за регистрацию и проверку работоспособности сервисов.
- Брокер журналов: Система pub/sub, поддерживающая воспроизведение и отвечающая за сохранение потоковых данных, надежное асинхронное выполнение запросов, уведомления о событиях и возврат результатов запросов. Когда узлы выполняют восстановление после простоя, брокер журналов обеспечивает целостность инкрементных данных с помощью воспроизведения брокером журналов. В кластере Milvus в качестве лог-брокера используется Pulsar, а в автономном режиме - RocksDB. В качестве лог-брокеров также могут использоваться сервисы потокового хранения данных, такие как Kafka и Pravega.
- Объектное хранилище: Хранит файлы моментальных снимков журналов, файлы скалярных/векторных индексов и промежуточные результаты обработки запросов. Milvus поддерживает AWS S3 и Azure Blob, а также MinIO, легкий сервис хранения объектов с открытым исходным кодом. В связи с высокой задержкой доступа и тарификацией запросов в сервисах объектного хранения Milvus вскоре будет поддерживать кэш-пулы на базе памяти/SSD и разделение данных на "горячие" и "холодные" для повышения производительности и снижения затрат.
Модель данных
Модель данных организует данные в базе данных. В Milvus все данные организованы по коллекциям, осколкам, разделам, сегментам и сущностям.
Модель данных 1
Коллекция
Коллекцию в Milvus можно сравнить с таблицей в реляционной системе хранения данных. Коллекция - это самая большая единица данных в Milvus.
Осколок
Чтобы в полной мере использовать возможности параллельных вычислений кластеров при записи данных, коллекции в Milvus должны распределять операции записи данных по разным узлам. По умолчанию одна коллекция содержит два шарда. В зависимости от объема набора данных в коллекции может быть больше шардов. В Milvus используется метод хэширования мастер-ключа для разделения на шарды.
Раздел
В одном шарде также может быть несколько разделов. Под разделом в Milvus понимается набор данных, помеченных одной и той же меткой в коллекции. Распространенные методы разделения включают разделение по дате, полу, возрасту пользователя и т. д. Создание разделов может принести пользу процессу запроса, поскольку огромные данные можно отфильтровать по метке раздела.
В сравнении, шардинг больше направлен на масштабирование возможностей при записи данных, а разделение - на повышение производительности системы при чтении данных.
Модель данных 2
Сегменты
Внутри каждого раздела существует множество небольших сегментов. Сегмент - это наименьшая единица для планирования системы в Milvus. Существует два типа сегментов: растущие и закрытые. Растущие сегменты подписываются узлами запросов. Пользователь Milvus продолжает записывать данные в растущие сегменты. Когда размер растущего сегмента достигает верхнего предела (по умолчанию 512 МБ), система не позволяет записывать дополнительные данные в этот растущий сегмент, таким образом, сегмент запечатывается. На запечатанных сегментах строятся индексы.
Для доступа к данным в реальном времени система считывает данные как в растущих сегментах, так и в запечатанных.
Сущности
Каждый сегмент содержит огромное количество сущностей. Сущность в Milvus эквивалентна строке в традиционной базе данных. Каждая сущность имеет уникальное поле первичного ключа, которое также может быть сгенерировано автоматически. Сущности также должны содержать временную метку (ts) и векторное поле - ядро Milvus.
О серии глубоких погружений
После официального объявления об общей доступности Milvus 2.0 мы организовали эту серию блогов Milvus Deep Dive, чтобы предоставить углубленную интерпретацию архитектуры и исходного кода Milvus. В этой серии блогов рассматриваются следующие темы:
- Неструктурированные данные требуют полного стека базового программного обеспечения
- Принципы проектирования Milvus 2.0
- Создание базы данных векторов для масштабируемого поиска по сходству
- О серии глубоких погружений
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