/ˈmɪlvəs/
一、特点
百亿 级,分布式 ,毫秒级检索,低延迟、高并发,支持百万维度;
支持多模态 (文本、图片、视频、音频)各种非结构化数据的向量存储 ,支持混合检索、多向量类型(稠密向量、稀疏向量);
实时索引更新;
索引优化:提供多种索引类型(如 IVF_FLAT、HNSW、IVF_PQ、ANNOY 等)
支持向量压缩、分布式索引分片、分布式事务
支持元数据过滤(如按文档标签、时间戳筛选)
支持 "冷热数据分离":热数据存内存,冷数据存对象存储,分层存储(内存 + SSD + 对象存储)
需安装启动服务,
适用场景:亿级以上海量数据,实时 超低延迟检索(<100ms),私有部署。
二、结构
Collection:包含一组 entity,
Entity:包含一组 field。primary key 是用于指代一个 entity 的唯一值。
Field:可以是代表对象属性的结构化数据,例如数字和字符串,也可以是向量。
| Milvus 向量数据库 | 关系型数据库 |
|---|---|
| Collection | 表 |
| Entity | 行 |
| Field | 表字段 |
Segment:一个 collection 可以包含多个 segment。一个 segment 可以包含多个 entity。在搜索中,Milvus 会搜索每个 segment,并返回合并后的结果。
Partition分区:是集合(Collection)的一个分区。Milvus 支持将收集数据划分为物理存储上的多个部分。这个过程称为分区,每个分区可以包含多个段。
Sharding分片 :是指将数据写入操作分散到不同节点上,使 Milvus 能充分利用集群的并行计算能力进行写入。默认情况下,单个 Collection 包含 2 个分片(Shard)。目前 Milvus 采用基于主键哈希的分片方式,未来将支持随机分片、自定义分片等更加灵活的分片方式。
**注意:** 分区的意义在于通过划定分区减少数据读取,而分片的意义在于多台机器上并行写入操作。
PChannel:物理信道。每个 PChannel 对应一个日志存储主题。默认情况下,将分配一组 256 个 PChannels 来存储记录 Milvus 集群启动时数据插入、删除和更新的日志。
VChannel:逻辑通道。每个集合将分配一组 VChannels,用于记录数据的插入、删除和更新。VChannels 在逻辑上是分开的,但在物理上共享资源。
三、存储
负责 Milvus 数据的持久化,分为元数据存储(meta store)、消息存储(log broker)和对象存储(object storage)三个部分。
1、元数据存储
负责存储元信息的快照,比如:集合 schema 信息、节点状态信息、消息消费的 checkpoint 等。元信息存储需要极高的可用性、强一致和事务支持,因此,etcd 是这个场景下的不二选择。除此之外,etcd 还承担了服务注册和健康检查的职责。
2、对象存储
负责存储日志的快照文件、标量 / 向量索引文件以及查询的中间处理结果。Milvus 采用 MinIO 作为对象存储,另外也支持部署于 AWS S3 和 Azure Blob 这两大最广泛使用的低成本存储。但是,由于对象存储访问延迟较高,支持基于内存或 SSD 的缓存池,通过冷热分离的方式提升性能以降低成本。
3、消息存储
消息存储是一套支持回放的发布订阅系统,用于持久化流式写入的数据,以及可靠的异步执行查询、事件通知和结果返回。执行节点宕机恢复时,通过回放消息存储保证增量数据的完整性。
四、索引
支持多种索引类型(如 IVF_FLAT、HNSW、IVF_PQ、ANNOY 等),
索引优化:Milvus 支持自动优化索引(如合并小分片、重建索引),保证检索性能稳定。
基于原始数据构建,可以提高对 collection 数据搜索的速度。一个向量字段支持一种索引类型。切换索引类型时,Milvus 自动删除之前的索引。
选择:
- 中小规模数据(100 万以内):选 IVF_FLAT(精度高,检索速度快)
- 大规模数据(100 万~10 亿):选 HNSW(低延迟,召回率高)或 IVF_PQ(存储成本低,适合超大规模)
注意:索引构建需要时间,批量写入数据后建议手动触发索引构建(避免刚写入就查询导致检索速度慢)
五、使用
1、机器节点:存储 和 计算分离架构,根据数据量调整节点规格(比如亿级数据建议至少 3 个数据节点 + 2 个查询节点)
2、Milvus 初始化
创建「集合(Collection)」:相当于 RAG 的 "知识库向量表",定义向量维度(如 768)、元数据字段(如 source: string, chapter: string)
创建索引:为集合指定索引算法(如 HNSW,适合低延迟场景)
数据写入:将「向量 + 元数据」批量写入 Milvus 集合,Milvus 自动完成分片和索引构建
3、Milvus 检索
调用 Milvus SDK,传入查询向量 + 元数据过滤条件(如 source="员工手册"),Milvus 会分布式并行检索。
4、知识库更新(增量维护)
新增文档:拆分、编码后,批量写入 Milvus 集合(支持增量更新,无需全量重建索引)
删除 / 修改文档:通过元数据(如 chunk_id)定位到目标向量,执行删除 / 更新操作。
索引优化:Milvus 支持自动优化索引(如合并小分片、重建索引),保证检索性能稳定。
六、Milvus 主要的组件
Milvus 支持两种部署模式,单机模式(standalone)和分布式模式(cluster)。两种模式具备完全相同的能力,用户可以根据数据规模、访问量等因素选择适合自己的模式。Standalone 模式部署的 Milvus 暂时不支持在线升级为 cluster 模式。
6.1 单机版
单机版 Milvus 包括三个组件:
- Milvus 负责提供系统的核心功能。
- etcd 是元数据引擎,用于管理 Milvus 内部组件的元数据访问和存储,例如:proxy、index node 等。
- MinIO 是存储引擎,负责维护 Milvus 的数据持久化。
6.2 分布式版
分布式版 Milvus 由八个微服务组件和三个第三方依赖组成,每个微服务组件可使用 Kubernetes 独立部署。
存储 和 计算分离架构:根据数据量调整节点规格(比如亿级数据建议至少 3 个数据节点 + 2 个查询节点)
**(1)微服务组件**
- Root coord
- Proxy
- Query coord
- Query node
- Index coord
- Index node
- Data coord
- Data node *
**(2)第三方依赖**
- etcd 负责存储集群中各组件的元数据信息。
- MinIO 负责处理集群中大型文件的数据持久化,如索引文件和全二进制日志文件。
- Pulsar 负责管理近期更改操作的日志,输出流式日志及提供日志订阅服务。