什么是 Milvus?
Milvus 是一个开源的向量数据库,专门设计用于处理海量向量数据的存储、索引和检索。作为专为 AI 应用打造的基础设施,它能够高效管理由深度学习模型生成的嵌入向量(embeddings),支持相似性搜索、推荐系统、图像识别、自然语言处理等多种应用场景。
为什么需要向量数据库?
在传统数据库中,我们查询的是精确匹配的数据。但在 AI 时代,我们更多需要的是"相似性查询"——例如:
-
找到与这张图片相似的图片
-
检索与这句话语义相近的文本
-
推荐与用户历史喜好相似的商品
这些场景都需要对高维向量进行高效的相似度计算,这正是 Milvus 的专长所在。
Milvus 的核心特性
-
高性能向量检索:
-
支持多种索引类型(IVF_FLAT、IVF_PQ、HNSW等)
-
优化了近似最近邻(ANN)搜索算法
-
单机版可处理十亿级向量,集群版可扩展至万亿级
-
-
多数据类型支持:
-
浮点型向量(FP32/FP64)
-
二进制向量
-
支持标量字段与向量混合存储
-
-
丰富的SDK支持:
-
Python、Java、Go、Node.js、RESTful API
-
与主流AI框架无缝集成
-
-
云原生架构:
-
计算存储分离设计
-
支持水平扩展
-
高可用和容错机制
-
-
完善的生态系统:
-
可视化工具Attu
-
监控组件Prometheus集成
-
与Kubernetes深度整合
-
Milvus 的架构解析
Milvus 采用微服务架构,主要包含以下组件:
-
接入层:
-
提供gRPC和HTTP接口
-
负责请求路由和负载均衡
-
-
协调服务:
-
根协调器(Root Coordinator):管理元数据
-
查询协调器(Query Coordinator):处理查询请求
-
数据协调器(Data Coordinator):管理数据分布
-
-
工作节点:
-
查询节点(Query Node):执行向量搜索
-
数据节点(Data Node):处理数据写入
-
索引节点(Index Node):构建向量索引
-
-
存储依赖:
-
etcd:存储元数据
-
MinIO/S3:对象存储
-
Pulsar/Kafka:消息队列
-
Milvus 的索引类型
Milvus 支持多种向量索引算法,适用于不同场景:
-
FLAT索引:
-
暴力搜索,100%准确率
-
适合小规模数据集
-
-
IVF_FLAT:
-
基于倒排文件的近似搜索
-
平衡准确率和速度
-
-
IVF_PQ:
-
结合倒排文件和乘积量化
-
高压缩比,内存占用低
-
-
HNSW:
-
基于图的近似算法
-
搜索速度快,建索引慢
-
适合高召回率场景
-
-
SCANN:
-
基于聚类的近似搜索
-
支持标量过滤
-
Milvus 的 Docker 部署指南
1. 环境准备
确保系统已安装 Docker 和 Docker Compose:
# 检查Docker版本
docker --version# 如果没有安装Docker,执行以下命令安装
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
2. 安装 Docker Compose
# 下载最新版 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose# 验证安装
docker-compose --version
3. 部署 Milvus Standalone 版(开发测试)
# 下载 docker-compose.yml 文件
wget https://github.com/milvus-io/milvus/releases/download/v2.3.3/milvus-standalone-docker-compose.yml -O docker-compose.yml# 启动 Milvus
sudo docker-compose up -d# 查看运行状态
sudo docker-compose ps
4. 部署 Milvus Cluster 版(生产环境)
# 下载 cluster 模式的 docker-compose 文件
wget https://github.com/milvus-io/milvus/releases/download/v2.3.3/milvus-cluster-docker-compose.yml -O docker-compose.yml# 启动 Milvus 集群
sudo docker-compose up -d# 查看运行状态
sudo docker-compose ps
5. 验证安装
# 检查容器状态
sudo docker ps# 应该能看到类似以下的输出(standalone 模式):
# CONTAINER ID IMAGE PORTS NAMES
# xxxxxxx milvusdb/milvus:v2.3.3 0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp milvus-standalone
# xxxxxxx quay.io/coreos/etcd:v3.5.5 2379/tcp, 2380/tcp milvus-etcd
# xxxxxxx minio/minio:RELEASE.2023-03-20T20-16-18Z 9000/tcp milvus-minio
6. 连接 Milvus
Milvus 默认监听以下端口:
-
19530 - gRPC 端口
-
9091 - HTTP 端口
可以使用以下方式连接:
-
使用 Milvus SDK(Python、Java、Go等)
-
使用 Attu(Milvus 的图形化管理工具)
7. 停止和清理
# 停止 Milvus
sudo docker-compose down# 删除数据(谨慎操作,会删除所有数据)
sudo rm -rf ./volumes
Milvus 基本操作示例
以下是一个使用 Python SDK 的简单示例:
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType# 连接 Milvus
connections.connect("default", host="localhost", port="19530")# 定义集合结构
fields = [FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)
]
schema = CollectionSchema(fields, description="示例集合")
collection = Collection("example_collection", schema)# 插入数据
import numpy as np
vectors = np.random.random((1000, 128)).tolist()
ids = [i for i in range(1000)]
collection.insert([ids, vectors])# 创建索引
index_params = {"index_type": "IVF_FLAT","metric_type": "L2","params": {"nlist": 128}
}
collection.create_index("embedding", index_params)# 搜索相似向量
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = collection.search(vectors[:5], "embedding", param=search_params, limit=3
)
print(results)
Milvus 的最佳实践
-
数据建模:
-
合理设计集合结构
-
平衡向量维度和精度需求
-
考虑混合查询场景(向量+标量)
-
-
索引选择:
-
小数据集(<1M):FLAT或IVF_FLAT
-
中等数据集(1M-100M):IVF_PQ或HNSW
-
大数据集(>100M):SCANN或DISKANN
-
-
性能调优:
-
调整nlist/nprobe参数平衡精度和速度
-
批量操作优于单条操作
-
合理设置预加载策略
-
-
生产环境建议:
-
使用集群版确保高可用
-
配置定期备份
-
监控关键指标(QPS、延迟、资源使用率)
-
Milvus 的应用场景
-
推荐系统:
-
用户/商品向量化表示
-
实时相似推荐
-
-
图像检索:
-
基于内容的图像搜索
-
重复图片检测
-
-
自然语言处理:
-
语义搜索
-
问答系统
-
文档去重
-
-
生物信息学:
-
蛋白质结构相似性搜索
-
基因序列比对
-
-
异常检测:
-
通过向量距离识别异常模式
-
Milvus 的生态系统
-
可视化工具 Attu:
-
提供图形化界面管理集合和数据
-
支持查询构建和结果可视化
-
-
监控方案:
-
集成Prometheus和Grafana
-
提供关键指标仪表板
-
-
向量处理工具:
-
Towhee:数据预处理管道
-
Knowhere:向量计算引擎优化
-
-
云服务:
-
Zilliz Cloud:全托管Milvus服务
-
各大云厂商的向量数据库服务
-
总结
Milvus 作为领先的开源向量数据库,为AI应用提供了强大的相似性搜索能力。通过本文的介绍,您应该已经了解了:
-
Milvus 的核心概念和架构设计
-
各种向量索引的特点和适用场景
-
使用Docker快速部署Milvus的方法
-
基本操作和最佳实践
-
丰富的应用场景和生态系统
无论是开发一个简单的相似图片搜索应用,还是构建企业级推荐系统,Milvus 都能提供高效、可靠的向量检索能力。随着AI技术的普及,向量数据库将成为新一代数据基础设施的重要组成部分,而Milvus无疑是这一领域的佼佼者。