跳到主要内容

时间戳

本主题介绍了时间戳的概念,并介绍了 Milvus 向量数据库中四个主要的时间戳相关参数。

概述

Milvus 是一个向量数据库,可以搜索和查询从非结构化数据转换而来的向量。当执行数据操作语言(DML)操作时,包括数据插入和删除,Milvus 会为操作中涉及的实体分配时间戳。因此,Milvus 中的所有实体都有时间戳属性。同一个 DML 操作中的实体批次共享相同的时间戳值。

时间戳参数

当您在 Milvus 中进行向量相似性搜索或查询时,会涉及几个与时间戳相关的参数。

  • Guarantee_timestamp

  • Service_timestamp

  • Graceful_time

  • Travel_timestamp

Guarantee_timestamp

Guarantee_timestamp 是一种时间戳类型,用于确保在 Guarantee_timestamp 之前所有 DML 操作的数据更新在进行向量相似性搜索或查询时都是可见的。例如,如果您在下午 3 点插入了一批数据,在下午 5 点插入了另一批数据,并且在向量相似性搜索期间将 Guarantee_timestamp 的值设置为下午 6 点。这意味着分别在下午 3 点和下午 5 点插入的两批数据都应该参与搜索。

如果未配置 Guarantee_timestamp,Milvus 会自动采用发出搜索请求的时间点。因此,搜索是在包含搜索之前所有 DML 操作数据更新的数据视图上进行的。

为了省去您理解 Milvus 内部 TSO 的麻烦,作为用户,您不必直接配置 Guarantee_timestamp 参数。您只需要选择一致性级别,Milvus 会自动为您处理 Guarantee_timestamp 参数。每个一致性级别对应一定的 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 可以被看作是某些数据可见的时间点,因为查询节点可以确保 Service_timestamp 之前的所有 DML 操作都已完成。

当有传入的搜索或查询请求时,查询节点会比较 Service_timestampGuarantee_timestamp 的值。主要有两种情况。

Service_Timestamp.

情况 1:Service_timestamp >= Guarantee_timestamp

如图 1 所示,Guarantee_timestamp 的值设置为 2021-08-26T18:15:00。当 Service_timestamp 的值增长到 2021-08-26T18:15:01 时,这意味着这个时间点之前的所有 DML 操作都已被查询节点执行和完成,包括 Guarantee_timestamp 指示的时间之前的那些 DML 操作。结果,搜索或查询请求可以立即执行。

情况 2:Service_timestamp < Guarantee_timestamp

如图 2 所示,Guarantee_timestamp 的值设置为 2021-08-26T18:15:00,而当前 Service_timestamp 的值只有 2021-08-26T18:14:55。这意味着只有 2021-08-26T18:14:55 之前的 DML 操作被执行和完成,留下了这个时间点之后但在 Guarantee_timestamp 之前的部分 DML 操作未完成。如果此时执行搜索或查询,所需的一些数据是不可见和不可用的,严重影响搜索或查询结果的准确性。因此,查询节点需要推迟搜索或查询请求,直到 guarantee_timestamp 之前的 DML 操作完成(即当 Service_timestamp >= Guarantee_timestamp 时)。

Graceful_time

从技术上讲,Graceful_time 不是时间戳,而是一个时间段(例如 100ms)。但是,Graceful_time 值得一提,因为它与 Guarantee_timestampService_timestamp 密切相关。Graceful_time 是 Milvus 配置文件中的一个可配置参数。它用于指示在某些数据变得可见之前可以容忍的时间段。简而言之,Graceful_time 期间未完成的 DML 操作是可以容忍的。

当有传入的搜索或查询请求时,可能有两种情况。

Graceful_Time.

情况 1:Service_timestamp + Graceful_time >= Guarantee_timestamp

如图 1 所示,Guarantee_timestamp 的值设置为 2021-08-26T18:15:01Graceful_time2sService_timestamp 的值增长到 2021-08-26T18:15:00。虽然 Service_timestamp 的值仍然小于 Guarantee_timestamp 的值,并且 2021-08-26T18:15:01 之前的所有 DML 操作都没有完成,但如 Graceful_time 的值所示,可以容忍 2 秒的数据不可见期。因此,传入的搜索或查询请求可以立即执行。

情况 2:Service_timestamp + Graceful_time < Guarantee_timestamp

如图 2 所示,Guarantee_timestamp 的值设置为 2021-08-26T18:15:01Graceful_time2s。当前 Service_timestamp 的值只有 2021-08-26T18:14:54。这意味着预期的 DML 操作尚未完成,即使给予 2 秒的宽限时间,数据不可见仍然是不可容忍的。因此,查询节点需要推迟搜索或查询请求,直到某些 DML 请求完成(即当 Service_timestamp + Graceful_time >= Guarantee_timestamp 时)。

下一步