一、Milvus 是什么
Milvus 是一款面向 AI 时代的分布式向量数据库,专门用于存储、检索和分析海量高维向量数据,核心能力是实现高效的语义匹配,支持文本、图片、视频、音频等多种非结构化数据的向量检索,是 AI Agent、RAG、图像检索等场景的核心基础设施。
二、核心概念
- 向量与语义匹配
- 向量是高维空间中的一个点,向量之间的距离越近,代表内容语义越相似。
- Milvus 通过向量数据库,实现从海量向量中快速匹配出最相近的结果,完成语义检索。
- 向量索引
- 为了解决海量向量逐条比对效率低的问题,Milvus 引入向量索引(ANN 索引),常见的索引类型包括 HNSW、IVF_PQ 等,大幅提升检索速度。
- 标量索引:针对 ID、分类、时间等非向量字段,采用 B+ 树、倒排索引等传统索引方式,实现标量过滤。
- Segment
- Segment 是 Milvus 中数据存储的最小逻辑单元,包含向量列、标量列和对应的索引文件。
- 分为两种类型:
- Growing Segment:负责接收新写入的数据,处于可写入状态。
- Sealed Segment:数据固化后转为只读状态,不再接收新写入,可加载索引用于查询。
- Compaction:定期合并小的 Sealed Segment,减少文件碎片,提升存储和查询效率。
- Partition
- Partition 是对 Segment 的逻辑分组,查询时可以指定 Partition,缩小检索范围,提升查询速度。
- 例如将表情包、风景、人像等不同类型的数据分到不同的 Partition 中。
- Collection
- Collection 是 Milvus 中的逻辑表,类比关系型数据库中的表,包含多个 Partition,用于组织同一类数据(如图片、文本、视频等)。
三、Milvus 架构
- 架构设计原则
- 存算分离:存储层和计算层独立部署,分别弹性扩展。
- 读写分离:写入和查询操作分离,适配不同的资源需求。
- 分布式角色分化:各节点职责明确,独立扩展。
- 核心组件
组件 职责
Proxy 统一接入层,接收客户端请求,负载均衡,转发请求到对应节点,聚合查询结果返回。
Coordinator 集群调度和元数据管理,维护 Segment、节点、索引等元数据,存储在 etcd 中。
DataNode 负责数据写入,处理 Growing Segment,执行 Compaction,将数据持久化到对象存储。
QueryNode 负责查询执行,加载 Sealed Segment 和索引,执行向量检索、标量过滤和结果排序。
IndexNode 负责构建向量索引,将索引文件写入对象存储。
对象存储 存储 Segment 数据和索引文件,支持 S3、MinIO 等。
etcd 存储集群元数据,保证元数据的一致性和高可用。
- 高可用设计
- 写入侧:通过消息队列实现 Write-Ahead Logging(WAL),DataNode 从队列消费数据,重启后可从上次 Offset 继续消费,保证数据不丢失。
- 查询侧:QueryNode 加载多个副本,单个节点故障时,请求自动路由到其他副本。
- 协调侧:Coordinator 支持故障切换,元数据存储在 etcd 中,保证调度不中断。
四、读写流程
-
写入流程
- 应用将非结构化数据转为向量,同时携带 ID、分类等标量字段。
- 通过 SDK 将数据发送到 Proxy,Proxy 将数据写入消息队列持久化。
- DataNode 从消息队列消费数据,写入 Growing Segment。
- Growing Segment 数据量达到阈值后,flush 转为 Sealed Segment,持久化到对象存储。
- 定期执行 Compaction,合并小的 Sealed Segment。
- Coordinator 调度 IndexNode 为新的 Sealed Segment 构建索引,索引文件写入对象存储。
- Coordinator 通知 QueryNode 加载新的 Segment 和索引到内存,数据可被查询。
-
查询流程
(1)向量+标量混合查询
- 应用将查询数据转为向量,指定 Collection、Partition 和标量过滤条件。
- 请求发送到 Proxy,Proxy 从 Coordinator 获取路由信息,找到对应 Partition 的 QueryNode。
- QueryNode 在已加载的 Segment 上执行 ANN 向量检索,同时用标量索引过滤。
- 多个 QueryNode 的结果汇总到 Proxy,全局排序后返回最相似的结果。
(2)纯标量查询
- 应用通过 ID 等标量字段查询,请求发送到 Proxy。
- Proxy 路由到对应 Partition 的 QueryNode,QueryNode 在 Segment 的主键索引中查找。
- 找到对应数据后返回结果。
注意:Milvus 擅长向量相似性匹配,精确主键查询建议交给 MySQL 或 Redis 处理。
五、Milvus 核心优势
- 高性能:支持海量向量的低延迟检索,ANN 索引大幅提升查询效率。
- 高扩展:支持水平扩展,从单机到分布式集群平滑过渡。
- 高可用:存算分离、读写分离、多副本机制保证系统稳定。
- 多模态支持:支持文本、图片、视频、音频等多种非结构化数据的向量检索。
- 易用性:提供类似 SQL 的查询接口,降低使用门槛。