了解Milvus矢量数据库的一致性水平

786 阅读6分钟

了解Milvus矢量数据库中的一致性级别

了解Milvus矢量数据库中支持的四种一致性级别:强、有边界的呆滞性、会话和最终。

你有没有想过,为什么有时你从Milvus矢量数据库中删除的数据仍然出现在搜索结果中?

一个很可能的原因是你没有为你的应用程序设置适当的一致性级别。在分布式矢量数据库中,一致性级别是非常关键的,因为它决定了某一特定的数据写在哪一点上可以被系统读取。

因此,这篇文章旨在揭开一致性概念的神秘面纱,深入探讨Milvus矢量数据库支持的一致性级别。

什么是一致性?

在开始之前,我们需要首先澄清本文中一致性的内涵,因为 "一致性 "这个词在计算行业中是一个超负荷的术语。分布式数据库中的一致性具体指的是确保每个节点或副本在特定时间内写入或读取数据时具有相同的数据视图的属性。因此,我们在这里讨论的是CAP定理中的一致性。

在现代社会中,为了服务大规模的在线业务,通常会采用多个副本。例如,在线电子商务巨头亚马逊将其订单或SKU数据复制到多个数据中心、区域、甚至国家,以确保在系统崩溃或故障时的高系统可用性。这就给系统带来了一个挑战--跨多个副本的数据一致性。如果没有一致性,你的亚马逊购物车中被删除的商品很可能会重新出现,造成非常糟糕的用户体验。

因此,我们需要为不同的应用提供不同的数据一致性水平。而幸运的是,Milvus,一个用于人工智能的数据库,在一致性级别上提供了灵活性,你可以设置最适合你的应用的一致性级别。

Milvus矢量数据库的一致性

一致性等级的概念是在Milvus 2.0版本中首次引入的。1.0版本的Milvus不是一个分布式矢量数据库,所以我们当时没有涉及可调整的一致性级别。Milvus 1.0每秒钟都会刷新数据,这意味着新的数据在插入后几乎立即可见,当矢量相似性搜索或查询请求到来时,Milvus会在准确的时间点读取最新的数据视图。

然而,Milvus在其2.0版本中进行了重构,Milvus 2.0是一个基于pub-sub机制的分布式向量数据库。PACELC定理指出,一个分布式系统必须在一致性、可用性和延迟之间进行权衡。此外,不同级别的一致性服务于不同的场景。因此,在Milvus 2.0中引入了一致性的概念,它支持调整一致性的级别。

Milvus向量数据库中的四个一致性级别

Milvus支持四种级别的一致性:强、有边界的呆滞性、会话和最终*。* 而Milvus用户可以在创建集合或进行矢量相似性搜索或查询时指定一致性级别。本节将继续解释这四个级别的一致性有什么不同,以及它们最适合哪种场景。

1.强一致性

强一致性是最高和最严格的一致性级别。它确保用户可以读取最新版本的数据。

一个强一致性的例子。

根据PACELC定理,如果一致性级别被设置为强,延迟会增加。因此,我们建议在功能测试中选择强一致性,以保证测试结果的准确性。而且,强一致性也最适合于对数据一致性有严格要求的应用,以牺牲搜索速度为代价。一个例子可以是处理订单支付和账单的在线金融系统。

2.有边界的呆滞性

有限制的呆滞性,正如其名称所示,允许在一定时期内的数据不一致。然而,一般来说,在这段时间之外,数据总是全局一致的。

有界呆滞性一致性的说明。

有限制的呆滞性适用于需要控制搜索延迟并能接受零星数据不可见的场景。例如,在像视频推荐引擎这样的推荐系统中,偶尔一次的数据不可见性对整体召回率的影响确实很小。不过,它还是可以大大提升推荐系统的性能。一个例子可以是一个跟踪你的在线订单状态的应用程序。

3.会话

会话确保所有的数据写入可以在同一会话中的读取中立即被感知。换句话说,当你通过一个客户端写数据时,新插入的数据会立即变成可搜索的。

对会话一致性的说明。

对于那些对同一会话中的数据一致性要求很高的场景,我们建议选择会话作为一致性级别。一个例子是,从图书馆系统中删除一个图书条目的数据。在确认删除并刷新页面(不同的会话)后,该书应该在搜索结果中不再可见。

4.最终

读和写的顺序没有保证,考虑到没有进一步的写操作,复制体最终会收敛到相同的状态。在最终一致性下,复制体以最新的更新值开始工作于阅读请求。最终一致性是四个层次中最弱的一个。

最终一致性的一个例子。

然而,根据PACELC定理,如果牺牲了一致性,搜索延迟可以大大缩短。因此,最终一致性最适合于对数据一致性要求不高但需要极快搜索性能的场景。一个例子是用最终一致性检索亚马逊产品的评论和评级。

所以回到本文开头提出的问题,由于用户没有选择合适的一致性级别,被删除的数据仍然会作为搜索结果返回。在Milvus矢量数据库中,一致性级别的默认值是有边界的呆滞性(Bounded)。因此,数据读取可能会滞后,在相似性搜索或查询过程中,Milvus可能碰巧在你进行删除操作之前读取数据视图。然而,这个问题很容易解决。你所需要做的就是在创建集合或进行矢量相似性搜索或查询时调整一致性水平。很简单!

例如,如果你想把一致性级别设置为strong ,你只需要把参数consistency_level 的值设置为Strong 。下面是一个例子。

在下一篇文章中,我们将揭开其背后的机制,并解释Milvus矢量数据库如何实现不同级别的一致性。敬请期待!