Временная метка
В этой теме объясняется понятие временной метки и представлены четыре основных параметра, связанных с временной меткой, в векторной базе данных Milvus.
Обзор
Milvus - это векторная база данных, в которой можно искать и запрашивать векторы, преобразованные из неструктурированных данных. При выполнении операций на языке манипулирования данными (DML), включая вставку и удаление данных, Milvus присваивает метки времени сущностям, участвующим в операции. Поэтому все сущности в Milvus имеют атрибут timestamp. И партии сущностей в одной операции DML имеют одно и то же значение временной метки.
Параметры временной метки
При выполнении поиска или запроса векторного сходства в Milvus задействуется несколько параметров, связанных с меткой времени.
Guarantee_timestampService_timestampGraceful_timeTravel_timestamp
Guarantee_timestamp
Guarantee_timestamp это тип временной метки, используемый для обеспечения того, чтобы все данные, обновленные операциями DML до Guarantee_timestamp, были видны при выполнении поиска или запроса по векторному подобию. Например, если вы вставили партию данных в 15:00, другую партию в 17:00, а значение Guarantee_timestamp установлено как 18:00 во время поиска векторного подобия. Это означает, что две партии данных, вставленные в 15:00 и 17:00 соответственно, должны быть задействованы в поиске.
Если значение Guarantee_timestamp не настроено, Milvus автоматически берет момент времени, когда был сделан запрос на поиск. Поэтому поиск ведется на представлении данных, в котором все данные были обновлены операциями DML до начала поиска.
Чтобы избавить вас от необходимости разбираться в TSO внутри Milvus, вам, как пользователю, не нужно напрямую настраивать параметр Guarantee_timestamp. Вам нужно только выбрать уровень согласованности, а Milvus автоматически обработает параметр Guarantee_timestamp для вас. Каждому уровню согласованности соответствует определенное значение Guarantee_timestamp.
Гарантированный_временной метки.
Пример
Как показано на рисунке выше, значение Guarantee_timestamp установлено как 2021-08-26T18:15:00 (для простоты временная метка в этом примере представлена физическим временем). При выполнении поиска или запроса будут искаться или запрашиваться все данные до 2021-08-26T18:15:00.
Service_timestamp
Service_timestamp это тип временной метки, автоматически генерируемой и управляемой узлами запросов в Milvus. Он используется для указания того, какие операции DML выполняются узлами запросов.
Данные, управляемые узлами запросов, можно разделить на два типа:
Исторические данные (или также называемые пакетными данными)
Инкрементные данные (или также называемые потоковыми данными).
В Milvus необходимо загружать данные перед выполнением поиска или запроса. Поэтому пакетные данные в коллекции загружаются узлом запроса перед выполнением запроса на поиск или запрос. Однако потоковые данные вставляются в Milvus или удаляются из него на лету, что требует от узла запроса вести хронологию операций DML и запросов поиска или запроса. В результате узлы запросов используют Service_timestamp для хранения такой временной шкалы. Service_timestamp можно рассматривать как момент времени, когда определенные данные становятся видимыми, поскольку узлы запросов могут убедиться, что все операции DML до Service_timestamp завершены.
Когда поступает запрос на поиск или запрос, узел запроса сравнивает значения Service_timestamp и Guarantee_timestamp. В основном существует два сценария.
Service_Timestamp.
Сценарий 1: Service_timestamp >= Guarantee_timestamp
Как показано на рисунке 1, значение Guarantee_timestamp устанавливается как 2021-08-26T18:15:00. Когда значение Service_timestamp увеличивается до 2021-08-26T18:15:01, это означает, что все операции DML до этого момента времени выполняются и завершаются узлом запроса, включая операции DML до времени, указанного на Guarantee_timestamp. В результате запрос на поиск или запрос может быть выполнен немедленно.
Сценарий 2: Service_timestamp < Guarantee_timestamp
Как показано на рисунке 2, значение Guarantee_timestamp установлено как 2021-08-26T18:15:00, а текущим значением Service_timestamp является только 2021-08-26T18:14:55. Это означает, что выполняются и завершаются только операции DML до 2021-08-26T18:14:55, оставляя часть операций DML после этой временной точки, но до Guarantee_timestamp незавершенными. Если поиск или запрос выполняется в этот момент, некоторые из требуемых данных еще не видны и недоступны, что серьезно повлияет на точность результатов поиска или запроса. Поэтому узел запроса должен отложить запрос на поиск или запрос до завершения операций DML перед guarantee_timestamp (т. е. когда Service_timestamp >= Guarantee_timestamp).
Graceful_time
Технически говоря, Graceful_time - это не временная метка, а скорее период времени (например, 100 мс). Тем не менее, Graceful_time стоит упомянуть, поскольку он тесно связан с Guarantee_timestamp и Service_timestamp. Graceful_time - настраиваемый параметр в конфигурационном файле Milvus. Он используется для указания периода времени, который можно выдержать, прежде чем определенные данные станут видимыми. Короче говоря, незавершенные операции DML во время Graceful_time могут быть терпимы.
Когда поступает запрос на поиск или запрос, может быть два сценария.
Graceful_Time.
Сценарий 1: Service_timestamp + Graceful_time >= Guarantee_timestamp
Как показано на рисунке 1, значение Guarantee_timestamp устанавливается как 2021-08-26T18:15:01, а Graceful_time - как 2s. Значение Service_timestamp увеличивается до 2021-08-26T18:15:00. Хотя значение Service_timestamp все еще меньше, чем Guarantee_timestamp, и не все операции DML до 2021-08-26T18:15:01 завершены, период невидимости данных в 2 секунды допускается, о чем свидетельствует значение Graceful_time. Поэтому входящий запрос на поиск или запрос может быть выполнен немедленно.
Сценарий 2: Service_timestamp + Graceful_time < Guarantee_timestamp
Как показано на рисунке 2, значение Guarantee_timestamp устанавливается как 2021-08-26T18:15:01, а Graceful_time - как 2s. Текущее значение Service_timestamp равно только 2021-08-26T18:14:54. Это означает, что ожидаемые операции DML еще не завершены, и даже с учетом 2 секунд льготного времени невидимость данных все еще невыносима. Поэтому узел запроса должен отложить запрос на поиск или запрос до завершения определенных DML-запросов (т. е. когда Service_timestamp + Graceful_time >= Guarantee_timestamp).