Elon Musk (@elonmusk)
Milvus 是一个开源的向量数据库,专为 AI 和机器学习应用设计,用于高效存储、索引和检索海量向量数据。以下是关于 Milvus 的详细介绍:
1. 核心功能
- 向量相似度搜索:支持高维向量的近邻搜索(如余弦相似度、欧氏距离等),适用于推荐系统、图像检索、语义搜索等场景。
- 高性能:通过分布式架构和优化的索引算法(如 IVF、HNSW、ANNOY)实现低延迟查询。
- 可扩展性:支持水平扩展,可处理数十亿级别的向量数据。
- 多语言支持:提供 Python、Java、Go 等多种语言的 SDK。
2. 关键特性
- 分布式架构:支持多节点部署,适合大规模数据集。
- 混合搜索:结合向量搜索和标量过滤(如元数据筛选),提升查询精度。
- 持久化存储:支持数据持久化,避免内存限制。
- 多租户支持:通过集合(Collection)和分区(Partition)实现数据隔离。
3. 典型应用场景
- 推荐系统:基于用户行为向量推荐商品或内容。
- 图像/视频检索:通过特征向量快速匹配相似图像。
- 语义搜索:处理文本嵌入(如 BERT、Word2Vec)进行语义相似度搜索。
- 异常检测:通过向量距离识别异常模式。
4. 技术架构
- 存储层:支持本地存储(如 RocksDB)或云存储(如 S3、HDFS)。
- 索引层:采用近似最近邻(ANN)算法加速搜索。
- 查询层:提供 RESTful API 和 gRPC 接口。
- 集群管理:通过 Kubernetes 或 Docker 部署,支持动态扩缩容。
5. 与其他工具的对比
- 与 Elasticsearch:Milvus 专注于向量搜索,而 Elasticsearch 更适合全文检索。
- 与 FAISS:FAISS 是 Facebook 开发的向量索引库,但 Milvus 提供了更完整的数据库功能(如持久化、分布式)。
- 与 Pinecone:Pinecone 是商业化的向量数据库,Milvus 是开源且可自托管的替代方案。
6. 部署与生态
- 部署方式:可通过 Docker、Kubernetes 或源码编译部署。
- 集成工具:与 TensorFlow、PyTorch、LangChain 等 AI 框架兼容。
- 云服务:Zilliz Cloud 提供托管版 Milvus(Zilliz 是 Milvus 的主要贡献者)。
7. 示例代码(Python)
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)
# 插入数据
data = [
[1, 2, 3],
[[0.1]*128, [0.2]*128, [0.3]*128]
]
collection.insert(data)
# 搜索
search_vectors = [[0.15]*128]
results = collection.search(search_vectors, anns_field="embedding", limit=2)
print(results)
8. 社区与资源
Milvus 因其高性能和灵活性,已成为 AI 应用中向量搜索的主流选择之一。如果需要处理大规模向量数据,它是一个值得考虑的工具。
Milvus 依赖 etcd 和 MinIO 主要是为了实现 分布式协调 和 高效存储,这两个组件在 Milvus 的架构中扮演着关键角色。以下是具体原因:
1. 为什么依赖 etcd?
etcd 是一个分布式键值存储系统,主要用于 配置管理、服务发现和集群协调。在 Milvus 中,etcd 的作用包括:
(1)元数据管理
- 存储集合(Collection)、分区(Partition)、索引等元数据。
- 确保集群中所有节点对元数据的访问一致性。
(2)分布式协调
- 管理节点间的通信(如主从选举、任务调度)。
- 实现分布式锁,避免多节点同时修改同一资源时的冲突。
(3)服务发现
- 动态跟踪集群中各组件(如 QueryNode、DataNode)的状态。
- 支持节点动态加入或退出集群。
(4)高可用性
- etcd 本身支持多副本部署,保证元数据的持久化和容错。
2. 为什么依赖 MinIO?
MinIO 是一个高性能的对象存储系统,Milvus 使用它来存储 向量数据和索引文件。具体原因包括:
(1)持久化存储
- 向量数据和索引文件需要持久化存储,避免内存限制。
- MinIO 提供类似 S3 的接口,支持大规模数据存储。
(2)高性能读写
- MinIO 优化了小文件和大文件的读写性能,适合 Milvus 的高频查询场景。
- 支持并发访问,提升集群吞吐量。
(3)分布式兼容性
- 可替换为其他 S3 兼容存储(如 AWS S3、阿里云 OSS),灵活适配不同环境。
- 支持多节点部署,提高数据可靠性。
(4)与 Milvus 的深度集成
- Milvus 的存储层(如
MinIOStorage
)直接与 MinIO 交互,简化数据管理。
3. 替代方案
虽然 etcd 和 MinIO 是默认依赖,但 Milvus 也支持其他替代方案:
- etcd 替代:
- 单机模式下可使用本地文件存储元数据(但不推荐生产环境)。
- 未来可能支持其他分布式协调工具(如 ZooKeeper)。
- MinIO 替代:
- 可直接使用 AWS S3、阿里云 OSS 等 S3 兼容存储。
- 本地开发时可用本地文件系统(但性能较差)。
4. 架构中的位置
在 Milvus 的分布式架构中:
- etcd 负责控制平面(元数据、协调)。
- MinIO 负责数据平面(向量数据、索引文件)。
- 其他组件(如 QueryNode、DataNode)通过 etcd 发现彼此,并通过 MinIO 读写数据。
总结
- etcd:确保集群协调和元数据一致性。
- MinIO:提供高性能、可扩展的对象存储。
这两个组件的结合,使 Milvus 能够在分布式环境中高效管理向量数据,同时保证高可用性和扩展性。