🚀 免费试用 Zilliz Cloud,完全托管的 Milvus,体验 10 倍的性能提升!立即试用>

milvus-logo
LFAI
  • Home
  • Blog
  • 利用内存副本提高向量数据库的读取吞吐量

利用内存副本提高向量数据库的读取吞吐量

  • Engineering
August 22, 2022
Congqi Xia

Cover_image 封面图片

本文由夏琮琦倪安琪共同撰写。

Milvus 2.1 正式发布后,新增了许多功能,为用户提供了便利和更好的用户体验。虽然对于分布式数据库世界来说,内存中副本的概念并不新鲜,但它却是一个能帮助你轻松提高系统性能和增强系统可用性的关键功能。因此,本篇文章将着手解释什么是内存中复制以及它的重要性,然后介绍如何在用于人工智能的向量数据库 Milvus 中启用这项新功能。

跳转到

在了解什么是内存中副本以及为什么它很重要之前,我们首先需要了解一些相关概念,包括副本组、分片副本、流式副本、历史副本和分片领导者。下图是这些概念的示意图。

Replica_concepts 复制概念

副本组

副本组由多个负责处理历史数据和副本的查询节点组成。

碎片副本

分片副本由流式副本和历史副本组成,两者属于同一个分片(即 DML 通道)。多个分片副本组成一个副本组。而副本组中碎片副本的确切数量是由指定 Collections 中碎片的数量决定的。

流副本

流式副本包含来自同一 DML 通道的所有增长片段。从技术上讲,流副本只能由一个副本中的一个查询节点提供服务。

历史副本

历史副本包含来自同一 DML 通道的所有密封数据段。一个历史副本的密封分段可分布在同一副本组内的多个查询节点上。

分片组长

分片领导是在分片副本中为流式副本提供服务的查询节点。

什么是内存复制?

启用内存中副本后,就可以在多个查询节点上加载 Collections 中的数据,这样就可以充分利用额外的 CPU 和内存资源。如果你的数据集相对较小,但又想提高读取吞吐量和硬件资源的利用率,这项功能就非常有用。

Milvus 向量数据库暂时在内存中为每个数据段保存一个副本。不过,有了内存中的副本,就可以在不同的查询节点上对一个数据段进行多次复制。这意味着,如果一个查询节点正在对一个数据段进行搜索,那么新收到的搜索请求可以分配给另一个空闲的查询节点,因为这个查询节点拥有完全相同的数据段副本。

此外,如果我们有多个内存复制,就能更好地应对查询节点崩溃的情况。以前,我们必须等待段重新加载,才能在另一个查询节点上继续搜索。但是,有了内存复制,搜索请求可以立即重新发送到新的查询节点,而无需再次重新加载数据。

Replication 复制

内存中复制为何重要?

启用内存复制的最大好处之一是提高整体 QPS(每秒查询次数)和吞吐量。此外,还可以维护多个网段副本,系统在发生故障切换时也更有弹性。

在 Milvus 向量数据库中启用内存内副本

在 Milvus 向量数据库中启用内存中复制这一新功能毫不费力。只需在加载 Collections 时指定所需的副本数量即可(即调用collection.load() )。

在下面的示例教程中,我们假设你已经创建了一个名为 "book "的 Collections并向其中插入了数据。然后,您可以运行以下命令,在加载图书 Collection 时创建两个副本。

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.load(replica_number=2) # load collection as 2 replicas

您可以灵活修改上述示例代码中的副本数量,以最适合您的应用场景。然后,您就可以直接在多个副本上进行向量相似性搜索查询,而无需运行任何额外的命令。不过,需要注意的是,允许的最大副本数量受限于运行查询节点的可用内存总量。如果您指定的副本数量超过了可用内存的限制,那么在数据加载过程中将返回错误信息。

您还可以通过运行collection.get_replicas() 来检查您创建的内存中副本的信息。将返回副本组以及相应查询节点和分片的信息。下面是一个输出示例。

Replica groups:
- Group: <group_id:435309823872729305>, <group_nodes:(21, 20)>, <shards:[Shard: <channel_name:milvus-zong-rootcoord-dml_27_435367661874184193v0>, <shard_leader:21>, <shard_nodes:[21]>, Shard: <channel_name:milvus-zong-rootcoord-dml_28_435367661874184193v1>, <shard_leader:20>, <shard_nodes:[20, 21]>]>
- Group: <group_id:435309823872729304>, <group_nodes:(25,)>, <shards:[Shard: <channel_name:milvus-zong-rootcoord-dml_28_435367661874184193v1>, <shard_leader:25>, <shard_nodes:[25]>, Shard: <channel_name:milvus-zong-rootcoord-dml_27_435367661874184193v0>, <shard_leader:25>, <shard_nodes:[25]>]>

下一步

随着 Milvus 2.1 的正式发布,我们准备了一系列介绍新功能的博客。请阅读本系列博客中的更多内容:

Like the article? Spread the word

扩展阅读