在近期更新的 Milvus 2.x 版本中,咱们上线了在社区中呼声始终很高的【资源组性能】。有了这个性能,用户再也不须要“为每个 collection 部署一套 Milvus 服务”的计划,轻松实现对 Query Node 资源进行分组治理,达到物理资源隔离的成果。
本文将从需要、计划以及实操层面登程,带你具体解读资源组性能。
01. 源自用户需要
上线资源组性能的契机来自和用户的一次沟通。
某次,在社区交流活动中,Milvus 的社区用户提出了这样一个问题: 基于 Milvus 部署了多个利用场景,依据数据源和利用场景将数据划分成了多个 Collection。不过,因为向量搜寻具备着高度的 CPU 密集型特色,所以在业务的顶峰时间段,多个 Collection 的同时查问会争抢 CPU 资源,彼此影响。
为了满足场景须要,用户抉择了为每个 Collection 部署一套 Milvus 服务,从数据库的层面来防止查问过程中 Collection 之间的影响。这也是在没有资源组性能时一个比拟规范的计划。只管这套计划完满解决了用户的问题,却也带来了 Milvus 服务运维的开——用户须要同时运维多个 Milvus 集群。因而,在沟通中,用户提出了在一个 Milvus 服务中去实现这个场景的需要。
02. 资源隔离计划
Milvus 在提供查问前,须要对 Collection 执行 load 操作,以减速后续查问的速度,实现更好的查问性能。联合 Milvus 用户的应用习惯,咱们设计了一套 Milvus 的资源组计划。
Milvus 服务中保护了名为一个 __default_resource_group 的资源组,在 Milvus 启动后,默认所有的 QueryNode 都会退出到这个资源组进行治理,后续的 load 操作也会将 Collection 在这个资源组中进行加载。对于不须要感知物理资源的用户,所有的操作、零碎体现没有产生任何变动。
如果用户有物理资源隔离的需要,那么能够创立多个自定义资源组,而后将默认资源组中的节点调配转移到自定义的资源组中,实现对 Milvus 集群中 QueryNode 资源的划分和物理隔离。随后在 load 操作中,能够去指定每一个 Collection 要加载到哪个资源组中。在加载 Collection 的同时,可实现资源的应用限度。
03. 实现 Collection 资源隔离
在介绍完 Milvus 资源隔离的背景和计划后,咱们能够通过一个例子来讲述实现 Collection 级别资源隔离的残缺步骤。
上面的所有操作是基于用户部署了一个 6 个 QueryNode 的 Milvus 服务,所以会有 6 个 QueryNode 参加资源隔离过程中的划分和调配。
- 创立两个自定义资源组和
rg1
和rg2
,用于承载 QueryNode 资源。
import pymilvus
utility.create_resource_group("rg1", using='default')
utility.create_resource_group("rg2", using='default')
rgs = utility.list_resource_groups(using='default')
print(f"Resource group list: {rgs}")
# Resource group list: ['__default_resource_group', 'rg1', 'rg2']
- 别离从 __default_resource_group 中向
rg1
和rg2
转移 3 个节点,实现所有 QueryNode 资源的隔离划分。
utility.transfer_node("__default_resource_group", "rg1", 3, using="default")
utility.transfer_node("__default_resource_group", "rg2", 3, using="default")
- 假设用户有两个须要加载的 Collection, 别离为
Collection A
和Collection B
, 这里通过将Collection A
加载到rg1
, 将Collection B
加载到rg2
, 以此实现Collection A
和Collection B
的资源隔离。
# ask Milvus load the collection to the desired resource group.
# make sure that query nodes num should be greater or equal to replica_number
collection = Collection('collectionA')
collection.load(replica_number=3, _resource_group=['rg1'])
collection = Collection('collectionB')
collection.load(replica_number=3, _resource_group=['rg2'])
通过上述 3 个步骤,咱们实现了 Collection 级别的资源隔离,每个 Collection 应用了 3 个独立的 QueryNode, 后续产生在 Collection 上的查问将会应用各自独立的 QueryNode, 彼此之间物理隔离,互不影响。
Milvus 通过资源组提供对 QueryNode 资源划分的能力,用户能够依据本身的需要灵便安顿 Collection 的加载计划,实现各种级别的资源隔离,应答不同的场景和需要。更多对于 Milvus 资源组性能的应用细节,能够点击链接参考 Milvus Doc。
(本文作者刘伟系 Zilliz 高级研发工程师)
本文由 mdnice 多平台公布