龙羽
发布于 2026-08-26 / 1 阅读
0

Milvus 向量数据库核心概念与架构详解

一、Milvus 是什么

Milvus 是一款面向 AI 时代的分布式向量数据库,专门用于存储、检索和分析海量高维向量数据,核心能力是实现高效的语义匹配,支持文本、图片、视频、音频等多种非结构化数据的向量检索,是 AI Agent、RAG、图像检索等场景的核心基础设施。

二、核心概念

  1. 向量与语义匹配
  • 向量是高维空间中的一个点,向量之间的距离越近,代表内容语义越相似。
  • Milvus 通过向量数据库,实现从海量向量中快速匹配出最相近的结果,完成语义检索。
  1. 向量索引
  • 为了解决海量向量逐条比对效率低的问题,Milvus 引入向量索引(ANN 索引),常见的索引类型包括 HNSW、IVF_PQ 等,大幅提升检索速度。
  • 标量索引:针对 ID、分类、时间等非向量字段,采用 B+ 树、倒排索引等传统索引方式,实现标量过滤。
  1. Segment
  • Segment 是 Milvus 中数据存储的最小逻辑单元,包含向量列、标量列和对应的索引文件。
  • 分为两种类型:
  • Growing Segment:负责接收新写入的数据,处于可写入状态。
  • Sealed Segment:数据固化后转为只读状态,不再接收新写入,可加载索引用于查询。
  • Compaction:定期合并小的 Sealed Segment,减少文件碎片,提升存储和查询效率。
  1. Partition
  • Partition 是对 Segment 的逻辑分组,查询时可以指定 Partition,缩小检索范围,提升查询速度。
  • 例如将表情包、风景、人像等不同类型的数据分到不同的 Partition 中。
  1. Collection
  • Collection 是 Milvus 中的逻辑表,类比关系型数据库中的表,包含多个 Partition,用于组织同一类数据(如图片、文本、视频等)。

三、Milvus 架构

  1. 架构设计原则
  • 存算分离:存储层和计算层独立部署,分别弹性扩展。
  • 读写分离:写入和查询操作分离,适配不同的资源需求。
  • 分布式角色分化:各节点职责明确,独立扩展。
  1. 核心组件

组件 职责
Proxy 统一接入层,接收客户端请求,负载均衡,转发请求到对应节点,聚合查询结果返回。
Coordinator 集群调度和元数据管理,维护 Segment、节点、索引等元数据,存储在 etcd 中。
DataNode 负责数据写入,处理 Growing Segment,执行 Compaction,将数据持久化到对象存储。
QueryNode 负责查询执行,加载 Sealed Segment 和索引,执行向量检索、标量过滤和结果排序。
IndexNode 负责构建向量索引,将索引文件写入对象存储。
对象存储 存储 Segment 数据和索引文件,支持 S3、MinIO 等。
etcd 存储集群元数据,保证元数据的一致性和高可用。

  1. 高可用设计
  • 写入侧:通过消息队列实现 Write-Ahead Logging(WAL),DataNode 从队列消费数据,重启后可从上次 Offset 继续消费,保证数据不丢失。
  • 查询侧:QueryNode 加载多个副本,单个节点故障时,请求自动路由到其他副本。
  • 协调侧:Coordinator 支持故障切换,元数据存储在 etcd 中,保证调度不中断。

四、读写流程

  1. 写入流程

    1. 应用将非结构化数据转为向量,同时携带 ID、分类等标量字段。
    2. 通过 SDK 将数据发送到 Proxy,Proxy 将数据写入消息队列持久化。
    3. DataNode 从消息队列消费数据,写入 Growing Segment。
    4. Growing Segment 数据量达到阈值后,flush 转为 Sealed Segment,持久化到对象存储。
    5. 定期执行 Compaction,合并小的 Sealed Segment。
    6. Coordinator 调度 IndexNode 为新的 Sealed Segment 构建索引,索引文件写入对象存储。
    7. Coordinator 通知 QueryNode 加载新的 Segment 和索引到内存,数据可被查询。
  2. 查询流程

(1)向量+标量混合查询

  1. 应用将查询数据转为向量,指定 Collection、Partition 和标量过滤条件。
  2. 请求发送到 Proxy,Proxy 从 Coordinator 获取路由信息,找到对应 Partition 的 QueryNode。
  3. QueryNode 在已加载的 Segment 上执行 ANN 向量检索,同时用标量索引过滤。
  4. 多个 QueryNode 的结果汇总到 Proxy,全局排序后返回最相似的结果。

(2)纯标量查询

  1. 应用通过 ID 等标量字段查询,请求发送到 Proxy。
  2. Proxy 路由到对应 Partition 的 QueryNode,QueryNode 在 Segment 的主键索引中查找。
  3. 找到对应数据后返回结果。

注意:Milvus 擅长向量相似性匹配,精确主键查询建议交给 MySQL 或 Redis 处理。

五、Milvus 核心优势

  • 高性能:支持海量向量的低延迟检索,ANN 索引大幅提升查询效率。
  • 高扩展:支持水平扩展,从单机到分布式集群平滑过渡。
  • 高可用:存算分离、读写分离、多副本机制保证系统稳定。
  • 多模态支持:支持文本、图片、视频、音频等多种非结构化数据的向量检索。
  • 易用性:提供类似 SQL 的查询接口,降低使用门槛。