Milvus
作为一款针对海量特征向量的相似度搜索引擎,在单台服务器上就可以处理十亿级数据规模。而对于百亿或者千亿级数据,则需要具有水平扩展能力的 Milvus
集群来满足对海量向量数据的高性能检索需求。
本文使用了 Mishards
中间件来搭建 Milvus
集群。Mishards
是一个用 Python
开发的 Milvus
集群分片中间件,其内部处理请求转发、读写分离和水平扩展,为用户提供内存和算力可以扩容的 Milvus
实例。详情请参阅 Mishards。Milvus
集群采用helm chart
方式部署在kubernetes
集群上,底层管理kubernetes
集群为汇智云计算组开发的云平台Rong
。
mulvus
基于mishards
集群架构
基本服务组件
Service Founder
:服务发现框架,本文采用kubernetes
部署Milvus
集群,服务发现框架为coredns
;
Load balancer
: 负载均衡入口,有NodePort
和ingress contoller
两种方式;
Mishards node
: Mishards
节点,该组件无状态,可伸缩;
Write-only Milvus node
: 只写milvus
节点,只有单个节点且不可伸缩,生成环境中需要采用高可用方案来避免单点故障;
Read-only Milvus node
: 只读milvus
节点,有状态服务,可以伸缩节点;
Shared File System
: 所有Milvus
节点使用的共享存储,用于存储数据,需支持ReadWriteMany
,方案中采用 NFS
;
Metadata Store
: 所有Milvus
节点使用该服务存储公共的元数据,方案中使用Mysql
,生成环境中需考虑MySQL
高可用方案;
可伸缩组件
Mishards
Read-only Milvus nodes
此外,可以按需要额外部署mulvus gui
组件mulvus-admin
,该组件为mulvus
的web
管理界面。
Mishards
组件负责将上游所有请求进行划分为子请求并且分发至milvus
集群各个节点,将milvus
集群各个节点的相应结果进行汇总返回给上游。
milvus
是个无状态服务,不保存数据或者参与复杂计算,因此该节点不需要很高的计算资源配置。它的主要计算任务是分发请求和汇总子结果,可以通过扩展节点数量来处理大量并发请求。
milvus
节点负责增删改查核心操作,需要很高的资源配置。
1)节点的内存必须足够大以避免大量磁盘io
操作;
2)节点的cpu
配置影响计算性能;
3)可以扩增集群节点来提高系统吞吐量;
1)读写分离
milvus
的核心操作为向量插入和向量搜索,向量搜索需要极高的CPU
和GPU
配置,向量插入和其他操作对计算能力要求较低,使用专用的只读节点进行搜索操作,其他操作通过只写节点,读写分离能合理的调配资源配置。
从服务质量出发,当节点处于向量搜索操作时,节点相关的资源会处于满负荷运行状态,不能保证其他操作的服务质量。因此,读写分离能更好的提供高服务质量。
2)水平扩展
可以通过扩展无状态服务Mishards
节点数量来处理大量并发请求。
可以通过扩展有状态服务只读milvus
节点来提高系统吞吐量,以应对大数据集,低延迟率场景。
milvus
集成到ai
专用版Rong
云平台,包含milvus
集群监控管理,部署完ai
专用版Rong
云平台即部署完milvus
集群。
卸载ai
专用版Rong
云平台即卸载milvus
集群。
https://milvus.io/docs/v0.10.4/mishards.md
https://github.com/milvus-io/milvus-helm
https://milvus.io/docs/v0.10.4/overview.md
https://dzone.com/articles/mishards-a-distributed-solution-to-scale-similarit