当前位置: 首页 > 科技观察

如何使用内存拷贝提高矢量数据库的读吞吐量

时间:2023-03-19 14:33:30 科技观察

译者|Milvus,可调一致性,用户身份验证和传输加密,方便和更好的用户体验。虽然内存副本的概念对于分布式数据库来说并不陌生,但它是一个关键特性,可以帮助用户轻松提升系统性能,增加数据库读取吞吐量,提高硬件资源利用率。因此,本文首先解释什么是内存副本及其重要性,然后介绍如何在人工智能矢量数据库Milvus中启用这一新功能。与内存副本相关的概念在了解什么是内存副本及其重要性之前,需要了解一些相关概念,包括副本组、分片副本、流式副本、历史副本和分片领导者。下图是这些概念的说明。副本概念(1)副本组副本组由多个负责处理历史数据的查询节点和副本组成。更具体地说,Milvus向量数据库中的查询节点检索增量日志数据并将其变成增长的碎片。(2)分片副本分片副本由流副本和历史副本组成,两者属于同一个分片(即数据操作语言通道,在Milvus中简称为DML通道)。多个分片副本组成一个副本组。而副本组中分片副本的确切数量由指定集合中的分片数量决定。(3)流复制流复制包含来自同一DML通道的所有增长段。增长的段不断接收新插入的数据,直到它被密封。从技术上讲,一个流副本应该由一个副本中的一个查询节点提供服务。(4)历史副本历史副本包含来自同一DML通道的所有密封段。密封段不再接收任何新数据并将刷新到对象存储,将新数据插入新创建的增长段。历史副本的密封段可以分布在同一副本组内的多个查询节点上。(5)ShardleaderShardleader是分片副本中为流式副本提供服务的查询节点。什么是内存副本?启用内存中副本允许用户将数据加载到多个查询节点上的集合中,以便可以利用额外的CPU和内存资源。换句话说,当您在集合中加载数据并指定将其作为两个副本加载时,您最终将在两个查询节点上拥有数据的两个副本。如果您的数据集相对较小,但又想增加读取吞吐量并提高硬件资源的利用率,则内存中复制功能非常有用。默认情况下,Milvus向量数据库当前在内存中保留每个段的副本。但是,使用内存中的副本,用户可以在不同的查询节点上多次复制一个段。这意味着,如果查询节点正在对一个段进行搜索,则可以将传入的新搜索请求分配给另一个空闲查询节点,因为该查询节点具有完全相同段的副本。好处是不必再次重新加载数据。用户不需要进行任何操作,空闲的查询节点会自动搜索或查询,因为查询节点已经复制并接收了数据。此外,拥有多个内存中副本可以更好地抵御查询节点崩溃。如果没有内存中的副本,则必须等待段重新加载,然后才能继续在另一个查询节点上进行搜索。但是,通过内存复制,搜索请求可以立即重新发送到新的查询节点,而无需再次重新加载数据,如下图所示:内存复制为什么内存复制很重要?启用内存中副本的最显着好处之一是整体QPS(每秒查询数)和吞吐量的增加。如果您在使用Milvus矢量数据库时启用内存副本,您将能够看到系统性能的巨大飞跃。此外,使用内存中的副本,可以维护段的多个副本,并且系统在面对故障转移时更具弹性,如上例所示。在Milvus向量数据库中启用内存副本在Milvus向量数据库中启用内存副本的新功能非常简单。您需要做的就是在加载集合时指定所需的副本数(即调用collection.load())。在以下教程中,将使用包含书籍信息的集合示例。假设您已经创建了一个名为“book”的集合并向其中插入了数据。然后,您可以指定加载集合数据时要创建的副本数。下面的示例代码将集合加载为两个副本。frompymilvusimportCollectioncollection=Collection("book")#获取一个已有的collection.collection.load(replica_number=2)#loadcollectionas2replicas用户可以灵活修改以上示例代码中的副本数以最适合应用场景.然后可以直接针对多个副本执行向量相似性搜索或查询,而无需运行任何其他命令。但是,应该注意的是,允许的最大副本数受运行查询的节点上可用内存总量的限制。如果指定的副本数超过可用内存的限制,数据加载时会返回错误。用户还可以通过运行collection.get_replicas()检查有关他们创建的内存中副本的信息。将返回副本组的信息以及相应的查询节点和分片。以下是示例输出:副本组:-组:,,,,分片:,,]>-Group:,,,,,Shard:,,]>原标题:IncreaseYourVectorDatabaseReadThroughputwithIn-MemoryReplicas,作者:AngelaNi