向量数据库Milvus01-入门与核心原理详解
Milvus向量数据库入门与核心原理详解
目录
- 引言
- Milvus的核心概念
- Milvus的系统架构
- Milvus的核心原理
- 总结与预告
1. 引言
什么是向量数据库?
向量数据库(Vector Database)是专为存储和查询高维度向量数据设计的系统,适用于处理文本、图像、音频等非结构化数据。传统的数据库难以高效处理这些数据,因为它们通常需要通过嵌入模型(如BERT、ResNet)将原始数据转换为数值向量(Embedding),再通过向量相似性搜索(如余弦相似度、欧氏距离)实现快速检索。
Milvus的诞生背景
Milvus 是一款高性能、可扩展的开源向量数据库,专为处理由深度神经网络和其他机器学习模型生成的大规模嵌入向量而设计。自2019年发布以来,Milvus 已成为推荐系统、图像检索、自然语言处理等领域的核心工具。其核心优势包括:
- 高性能:支持万亿级向量数据的毫秒级检索。
- 云原生架构:存储与计算分离,支持弹性扩展。
- 多样化的索引策略:如 HNSW、IVF_FLAT、IVF_PQ 等。
- 混合查询能力:支持向量相似性搜索与标量过滤的联合操作。
2. Milvus的核心概念
向量数据与非结构化数据
非结构化数据(如文本、图像、音频)需通过嵌入模型生成高维向量(Embedding Vector),例如:
- 文本:通过 BERT 等模型生成 768 维向量。
- 图像:通过 ResNet 等模型生成 2048 维向量。
Milvus 的核心任务是高效存储和检索这些向量数据。
Milvus vs 传统数据库
特性 | 传统数据库 | Milvus 向量数据库 |
---|---|---|
数据类型 | 结构化数据(表、行、列) | 高维向量 + 标量元数据 |
查询方式 | SQL 过滤与聚合 | 向量相似性搜索 + 标量过滤 |
索引策略 | B+ 树、哈希表 | HNSW、IVF_PQ、FLAT 等 ANN 索引 |
扩展性 | 垂直扩展为主 | 水平扩展,支持 PB 级数据 |
3. Milvus的系统架构
Milvus 的架构遵循 数据流与控制流分离 的原则,分为四层:
1. 接入层(Proxy)
- 功能:接收客户端请求,路由到对应的执行节点,聚合结果返回客户端。
- 特点:无状态代理,支持负载均衡(如 Nginx、Kubernetes Ingress)。
- 示例:客户端通过
pymilvus
SDK 连接 Milvus 服务。
from pymilvus import connections
connections.connect(host='localhost', port='19530')
2. 协调服务(Coordinator Service)
- 核心角色:
- Root Coord:集群拓扑管理与元数据存储。
- Data Coord:数据分配与一致性管理。
- Query Coord:查询任务调度与负载均衡。
- Index Coord:索引构建与优化。
- 特点:通过 Raft 协议确保高可用性,支持动态扩缩容。
3. 执行节点(Worker Node)
- 类型:
- Data Node:处理数据插入、更新、删除。
- Query Node:执行向量搜索与标量过滤。
- Index Node:构建和维护索引(如 HNSW、IVF_PQ)。
- 特点:支持并行处理,适配 CPU/GPU 加速。
4. 存储层
- 组件:
- 元数据存储:使用 etcd 确保强一致性。
- 消息存储:通过 WAL(Write-Ahead Log)保证数据持久化。
- 对象存储:支持 S3、MinIO 等,用于存储索引文件和向量数据。
- 特点:存储与计算分离,支持 PB 级数据持久化。
4. Milvus的核心原理
1. 数据模型
Milvus 的数据模型基于 集合(Collection) 和 字段(Field):
- Collection:类似于传统数据库的表,存储向量和标量数据。
- Field:定义字段类型(如
INT64
、FLOAT_VECTOR
)和约束(如主键、向量维度)。
from pymilvus import FieldSchema, CollectionSchema, DataType
fields = [FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)
]
schema = CollectionSchema(fields, "Example Collection")
collection = Collection("example_collection", schema)
2. 索引机制
Milvus 支持多种索引类型,适用于不同场景:
索引类型 | 适用场景 | 优势 |
---|---|---|
FLAT | 小规模数据精确搜索 | 无精度损失 |
IVF_FLAT | 中大规模数据平衡精度与速度 | 支持标量过滤 |
HNSW | 高并发低延迟场景 | 无需倒排索引,动态更新 |
IVF_PQ | 超大规模数据压缩存储 | 内存占用低,适合 GPU 加速 |
CAGRA | GPU 加速场景 | 利用 CUDA 并行计算 |
索引构建示例:
index_params = {"index_type": "IVF_PQ","params": {"nlist": 100, "m": 16},"metric_type": "L2"
}
collection.create_index("embedding", index_params)
3. 时间旅行机制
Milvus 通过 MVCC(多版本并发控制) 和 LSM 树 实现时间点查询(Point-in-Time Query):
- MVCC:记录数据的多个版本,支持按时间戳读取历史数据。
- LSM 树:将内存数据定期刷写到磁盘,优化写入性能。
5. 总结与预告
总结
Milvus 通过云原生架构、多样化的索引策略和高效的向量检索能力,成为处理非结构化数据的核心工具。其核心价值在于:
- 高性能:毫秒级检索万亿级向量。
- 灵活性:支持多种索引类型和混合查询。
- 可扩展性:存储与计算分离,适配大规模场景。
预告
在下一次博客中,我们将深入 Milvus 的实战操作,包括:
- 环境部署:单机版与集群版的 Docker 部署。
- 基础操作:通过 Python SDK 创建集合、插入数据、构建索引。
- 实战案例:实现语义搜索系统(如文档检索、图像相似性匹配)。
参考资料:
- Milvus 官方文档:https://milvus.io/docs/zh/
- CSDN 技术社区:https://blog.csdn.net/
- GitHub 仓库:https://github.com/milvus-io/milvus
版权声明:本文为原创文章,转载请注明出处。