了解 Milvus 向量数据库中的一致性水平 - 第二部分
封面图片
在上一篇关于一致性的博客中,我们解释了什么是分布式向量数据库中一致性的内涵,介绍了 Milvus 向量数据库中支持的强一致性、有界滞后性、会话一致性和最终一致性四种一致性级别,并解释了每种一致性级别最适合的应用场景。
在本篇文章中,我们将继续研究 Milvus 向量数据库的用户能够灵活选择各种应用场景的理想一致性级别的机制。我们还将提供如何在 Milvus 向量数据库中调整一致性级别的基本教程。
跳转到
底层时间刻度机制
在进行向量搜索或查询时,Milvus 使用时间刻度机制来确保不同级别的一致性。时间刻度是 Milvus 的水印,它就像 Milvus 中的时钟,标志着 Milvus 系统处于哪个时间点。每当有数据操作语言(DML)请求发送到 Milvus 向量数据库时,它就会给请求分配一个时间戳。如下图所示,例如,当有新数据插入信息队列时,Milvus 不仅会在这些插入的数据上标记时间戳,还会每隔一段时间插入时间刻度。
时间刻度
以上图中的syncTs1
为例。当查询节点等下游消费者看到syncTs1
时,消费者组件就会明白,所有早于syncTs1
插入的数据都已被消费。换句话说,时间戳值小于syncTs1
的数据插入请求将不再出现在消息队列中。
保证时间戳
如上一节所述,下游消费组件(如查询节点)会不断从消息队列中获取数据插入请求和时间刻度的消息。每消耗一个时间刻度,查询节点就会将这个消耗的时间刻度标记为可服务时间 -ServiceTime
,查询节点可看到ServiceTime
之前插入的所有数据。
除了ServiceTime
之外,Milvus 还采用了一种时间戳--保证时间戳(GuaranteeTS
),以满足不同用户对不同程度的一致性和可用性的需求。这意味着,Milvus 向量数据库的用户可以指定GuaranteeTs
,以便通知查询节点,在进行搜索或查询时,GuaranteeTs
之前的所有数据都应是可见的和涉及的。
当查询节点在 Milvus 向量数据库中执行搜索请求时,通常有两种情况。
情况 1:立即执行搜索请求
如下图所示,如果GuaranteeTs
小于ServiceTime
,查询节点可以立即执行搜索请求。
立即执行
方案 2:等待至 "ServiceTime > GuaranteeTs"(服务时间 > 保证时间
如果GuaranteeTs
大于ServiceTime
,查询节点必须继续消耗消息队列中的时间刻度。在ServiceTime
大于GuaranteeTs
之前,查询请求无法执行。
等待搜索
一致性级别
因此,可以在搜索请求中配置GuaranteeTs
,以实现您指定的一致性级别。GuaranteeTs
的值越大,一致性越强,但搜索延迟也越高。而GuaranteeTs
的值越小,搜索延迟越短,但数据的可见性会受到影响。
GuaranteeTs
在 Milvus 是一种混合时间戳格式。而用户对 Milvus 内部的TSO一无所知。因此,对用户来说,指定 的值是一项过于复杂的任务。为了省去用户的麻烦,提供最佳的用户体验,Milvus 只需要用户选择特定的一致性级别,Milvus 向量数据库就会自动为用户处理 值。也就是说,Milvus 用户只需从四种一致性级别中进行选择:, , , 和 。每个一致性级别都对应一定的 值。GuaranteeTs
GuaranteeTs
Strong
Bounded
Session
Eventually
GuaranteeTs
下图展示了 Milvus 向量数据库中四个一致性级别的GuaranteeTs
。
保证
Milvus 向量数据库支持四级一致性:
CONSISTENCY_STRONG
:GuaranteeTs
设置为与最新系统时间戳相同的值,查询节点等待服务时间到达最新系统时间戳后再处理搜索或查询请求。CONSISTENCY_EVENTUALLY
:GuaranteeTs
设置为比最新系统时间戳小得多的值,以跳过一致性检查。查询节点会立即在现有数据视图上进行搜索。CONSISTENCY_BOUNDED
:GuaranteeTs
设置为相对小于最新系统时间戳的值,查询节点会在更新较少的数据视图上进行搜索。CONSISTENCY_SESSION
:客户端使用最后一次写操作的时间戳作为GuaranteeTs
,这样每个客户端至少可以检索到自己插入的数据。
如何调整 Milvus 的一致性级别?
Milvus 支持在创建 Collections或进行搜索或查询时调整一致性级别。
进行向量相似性搜索
要按照所需的一致性级别进行向量相似性搜索,只需将参数consistency_level
的值设置为Strong
,Bounded
,Session
, 或Eventually
即可。如果不设置参数consistency_level
的值,一致性级别默认为Bounded
。该示例使用Strong
一致性进行向量相似性搜索。
results = collection.search(
data=[[0.1, 0.2]],
anns_field="book_intro",
param=search_params,
limit=10,
expr=None,
consistency_level="Strong"
)
进行向量查询
与进行向量相似性搜索类似,在进行向量查询时也可以指定参数consistency_level
的值。示例使用Strong
一致性进行了向量查询。
res = collection.query(
expr = "book_id in [2,4,6,8]",
output_fields = ["book_id", "book_intro"],
consistency_level="Strong"
)
下一步
随着 Milvus 2.1 的正式发布,我们准备了一系列介绍新功能的博客。请阅读本系列博客中的更多内容:
- 底层时间刻度机制
- 保证时间戳
- 一致性级别
- 如何调整 Milvus 的一致性级别?
- 下一步
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