Синхронизация времени
В этой теме описывается механизм синхронизации времени в 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 необходимо решить следующие две проблемы:
В приведенном примере для двух пользователей, находящихся на разных узлах, часы времени отличаются. Например, если пользователь 2 отстает от пользователя 1 на 24 часа, все операции пользователя 1 будут видны пользователю 2 только на следующий день.
Может существовать сетевая задержка. Если пользователь 2 выполняет поиск в коллекции
C0
по адресуt17
, Milvus должен гарантировать, что все операции доt17
будут успешно обработаны и завершены. Если операция удаления наt15
задерживается из-за сетевых задержек, велика вероятность того, что пользователь 2 все еще может увидеть предположительно удаленные данныеA1
при поиске наt17
.
Поэтому для решения этих проблем в Milvus используется система синхронизации времени (timetick).
Оракул временных меток (TSO)
Для решения первой проблемы, упомянутой в предыдущем разделе, Milvus, как и другие распределенные системы, предоставляет сервис оракула временных меток (TSO). Это означает, что все события в Milvus должны получать временную метку от TSO, а не от локальных часов.
Служба TSO предоставляется корневым координатором в Milvus. Клиенты могут выделять одну или несколько временных меток в одном запросе на выделение временной метки.
Временная метка TSO - это тип значения uint64
, состоящий из физической и логической частей. На рисунке ниже показан формат временной метки.
TSO_Timestamp.
Как показано на рисунке, 46 бит в начале - это физическая часть, а именно время UTC в миллисекундах. Последние 18 бит - это логическая часть.
Система синхронизации времени (timetick)
В этом разделе на примере операции вставки данных объясняется механизм синхронизации времени в Milvus.
Когда прокси получает запрос на вставку данных от SDK, он делит сообщения вставки на различные потоки сообщений (MsgStream
) в соответствии с хэш-значением первичных ключей.
Каждому сообщению вставки (InsertMsg
) присваивается временная метка перед отправкой на MsgStream
.
MsgStream
является оберткой очереди сообщений, которая в Milvus 2.0 по умолчанию является Pulsar.
timesync_proxy_insert_msg
Один из общих принципов заключается в том, что в MsgStream
, временные меткиInsertMsgs
от одного и того же прокси должны быть инкрементными. Однако для InsertMsgs
от разных прокси такого правила не существует.
На следующем рисунке приведен пример InsertMsgs
в фрагменте MsgStream
. Фрагмент содержит пять InsertMsgs
, три из которых взяты с Proxy1
, а остальные - с Proxy2
.
msgstream
Временные метки трех InsertMsgs
из Proxy1
инкрементны, как и двух InsertMsgs
из Proxy2
. Однако среди Proxy1
и Proxy2
InsertMsgs
нет определенного порядка.
Один из возможных сценариев заключается в том, что при чтении сообщения с временной меткой 110
с Proxy2
Milvus обнаруживает, что сообщение с временной меткой 80
с Proxy1
все еще находится в MsgStream
. Поэтому Milvus вводит систему синхронизации времени, timetick, чтобы гарантировать, что при чтении сообщения с MsgStream
все сообщения с меньшими значениями временных меток должны быть потреблены.
синхронизация по времени
Как показано на рисунке выше,
Каждый прокси периодически (по умолчанию каждые 200 мс) сообщает корневой коорд наибольшее значение временной метки последнего сообщения
InsertMsg
вMsgStream
.Корневой коорд определяет минимальное значение временной метки на этом
Msgstream
, независимо от того, какому прокси принадлежитInsertMsgs
. Затем корневой коорд вставляет эту минимальную временную метку вMsgstream
. Эта временная метка также называется timetick.Когда компоненты-потребители читают timetick, вставленный root coord, они понимают, что все сообщения вставки с меньшими значениями timestamp были потреблены. Поэтому соответствующие запросы могут быть выполнены безопасно, не прерывая выполнение заказа.
На следующем рисунке приведен пример Msgstream
со вставленным таймстиком.
временная метка
MsgStream
обрабатывает сообщения партиями в соответствии с временным тиком, чтобы выходные сообщения соответствовали требованиям временной метки. В приведенном выше примере все записи, кроме InsertMsgs
, из Proxy2
будут обработаны по адресу Timestamp: 120
, так как они находятся после последнего тика времени.
Что дальше
- Узнайте о концепции временной метки.
- Узнайте о рабочем процессе обработки данных в Milvus.