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

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

  • Синхронизация времени

Синхронизация времени

В этой теме описывается механизм синхронизации времени в Milvus.

Обзор

События в Milvus можно разделить на два типа:

  • События языка определения данных (DDL): создание/удаление коллекции, создание/удаление раздела и т. д.

  • События языка манипулирования данными (DML): вставка, поиск и т. д.

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

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

Временная меткаПользователь 1Пользователь 2
t0Создал коллекцию с именем C0./
t2/Выполнили поиск по коллекции C0.
t5Вставил данные A1 в коллекцию C0./
t7/Выполнен поиск по коллекции C0.
t10Вставил данные A2 в коллекцию C0./
t12/Выполнил поиск по коллекции C0
t15Удалены данные A1 из коллекции C0./
t17/Выполнен поиск по коллекции C0

В идеале пользователь 2 должен видеть:

  • Пустую коллекцию C0 по адресу t2.

  • Данные A1 на t7.

  • Оба данных A1 и A2 на t12.

  • Только данные A2 по адресу t17 (поскольку данные A1 были удалены из коллекции до этого момента).

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

  1. В приведенном примере для двух пользователей, находящихся на разных узлах, часы времени отличаются. Например, если пользователь 2 отстает от пользователя 1 на 24 часа, все операции пользователя 1 будут видны пользователю 2 только на следующий день.

  2. Может существовать сетевая задержка. Если пользователь 2 выполняет поиск в коллекции C0 по адресу t17, Milvus должен гарантировать, что все операции до t17 будут успешно обработаны и завершены. Если операция удаления на t15 задерживается из-за сетевых задержек, велика вероятность того, что пользователь 2 все еще может увидеть предположительно удаленные данные A1 при поиске на t17.

Поэтому для решения этих проблем в Milvus используется система синхронизации времени (timetick).

Оракул временных меток (TSO)

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

Служба TSO предоставляется корневым координатором в Milvus. Клиенты могут выделять одну или несколько временных меток в одном запросе на выделение временной метки.

Временная метка TSO - это тип значения uint64, состоящий из физической и логической частей. На рисунке ниже показан формат временной метки.

TSO_Timestamp TSO_Timestamp.

Как показано на рисунке, 46 бит в начале - это физическая часть, а именно время UTC в миллисекундах. Последние 18 бит - это логическая часть.

Система синхронизации времени (timetick)

В этом разделе на примере операции вставки данных объясняется механизм синхронизации времени в Milvus.

Когда прокси получает запрос на вставку данных от SDK, он делит сообщения вставки на различные потоки сообщений (MsgStream) в соответствии с хэш-значением первичных ключей.

Каждому сообщению вставки (InsertMsg) присваивается временная метка перед отправкой на MsgStream.

MsgStream является оберткой очереди сообщений, которая в Milvus 2.0 по умолчанию является Pulsar.

timesync_proxy_insert_msg timesync_proxy_insert_msg

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

На следующем рисунке приведен пример InsertMsgs в фрагменте MsgStream. Фрагмент содержит пять InsertMsgs, три из которых взяты с Proxy1, а остальные - с Proxy2.

msgstream msgstream

Временные метки трех InsertMsgs из Proxy1 инкрементны, как и двух InsertMsgs из Proxy2. Однако среди Proxy1 и Proxy2 InsertMsgs нет определенного порядка.

Один из возможных сценариев заключается в том, что при чтении сообщения с временной меткой 110 с Proxy2 Milvus обнаруживает, что сообщение с временной меткой 80 с Proxy1 все еще находится в MsgStream. Поэтому Milvus вводит систему синхронизации времени, timetick, чтобы гарантировать, что при чтении сообщения с MsgStream все сообщения с меньшими значениями временных меток должны быть потреблены.

time_synchronization синхронизация по времени

Как показано на рисунке выше,

  • Каждый прокси периодически (по умолчанию каждые 200 мс) сообщает корневой коорд наибольшее значение временной метки последнего сообщения InsertMsg в MsgStream.

  • Корневой коорд определяет минимальное значение временной метки на этом Msgstream, независимо от того, какому прокси принадлежит InsertMsgs. Затем корневой коорд вставляет эту минимальную временную метку в Msgstream. Эта временная метка также называется timetick.

  • Когда компоненты-потребители читают timetick, вставленный root coord, они понимают, что все сообщения вставки с меньшими значениями timestamp были потреблены. Поэтому соответствующие запросы могут быть выполнены безопасно, не прерывая выполнение заказа.

На следующем рисунке приведен пример Msgstream со вставленным таймстиком.

timetick временная метка

MsgStream обрабатывает сообщения партиями в соответствии с временным тиком, чтобы выходные сообщения соответствовали требованиям временной метки. В приведенном выше примере все записи, кроме InsertMsgs, из Proxy2 будут обработаны по адресу Timestamp: 120, так как они находятся после последнего тика времени.

Что дальше

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

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

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

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