关于 Milvus
# Milvus 是什么?
Milvus是鹰科Accipaitridae中Milvus属的一种猛禽, 以飞行速度快, 视力敏锐, 适应性强而著称.
Zilliz采用Milvus作为其开源高性能, 高扩展性向量数据库的名称, 该数据库可在从笔记本电脑到大规模分布式系统等各种环境中高效运行. 它既是开源软件, 也是云服务.
Milvus由Zilliz开发, 并很快捐赠给了Linux基金会下的 LF AI & Data 基金会, 现已成为世界领先的开源向量数据库项目之一. 它采用Apache2.0许可发布, 大多数贡献者都是高性能计算(HPC)领域的专家, 擅长构建大规模系统和优化硬件感知代码.
# 非结构化数据, Embeddings 和 Milvus
非结构化数据(如文本, 图像和音频)格式各异, 蕴含丰富的潜在语义, 因此分析起来极具挑战性. 为了处理这种复杂性, Embeddings被用来将非结构化数据转换成能够捕捉其基本特征的数字向量. 然后将这些向量存储在向量数据库中, 从而实现快速, 可扩展的搜索和分析.
Milvus提供强大的数据建模功能, 使你能够将非结构化或多模式数据组织成结构化的Collections. 它支持多种数据类型, 适用于不同的属性模型, 包括常见的数字和字符类型, 各种向量类型, 数组, 集合和JSON, 为你节省了维护多个数据库系统的精力.

Milvus提供三种部署模式, 涵盖各种数据规模--从 Jupyter Notebooks 中的本地原型到管理数百亿向量的大规模 Kubernetes 集群:
- Milvus Lite是一个Python库, 可以轻松集成到你的应用程序中, 作为Milvus的轻量级版本, 它非常适合在Jupyter Notebooks中进行快速原型开发, 或在资源有限的边缘设备上运行.
- Milvus Standalone是单机服务器部署, 所有组件都捆绑在一个Docker镜像中, 方便部署.
- Milvus Distributed可部署在Kubernetes集群上, 采用云原生架构, 专为十亿规模甚至更大的场景设计. 该架构可确保关键组件的冗余.
# Milvus 为何如此快速?
Milvus从设计之初就是一个高效的向量数据库系统. 在大多数情况下, Milvus的性能是其他向量数据库的2-5倍(参见VectorDBBench结果). 这种高性能是几个关键设计决策的结果:
硬件感知优化: 为了让Milvus适应各种硬件环境, 专门针对多种硬件架构和平台优化了其性能, 包括AVX512, SIMD, GPU和NVMe SSD.
高级搜索算法: Milvus支持多种内存和磁盘索引/搜索算法, 包括IVF, HNSW, DiskANN等, 所有这些算法都经过了深度优化. 与FAISS和HNSWLib等流行实现相比, Milvus的性能提高了30%-70%.
C++搜索引擎: 向量数据库性能的80%以上取决于其搜索引擎. 由于C++语言的高性能, 底层优化和高效资源管理, Milvus使用C++来处理这一关键组件. 最重要的是, Milvus集成了大量硬件感知代码优化, 从汇编级向量到多线程并行化和调度, 以充分利用硬件能力.
面相列: Milvus是面相列的向量数据库系统. 其主要优势来自数据访问模式. 在执行查询时, 面相列的数据库只读取查询中涉及的特定字段, 而不是整行, 这大大减少了访问的数据量. 此外, 对基于列的数据的操作可以很容易地进行向量化, 从而可以一次性在整个列中应用操作, 进一步提高性能.
# 是什么让 Milvus 具有如此高的可扩展性?
2022年, Milvus支持十亿级向量, 2023年, 它以持续稳定的方式扩展到数百亿级, 为300多家大型企业的大规模场景提供支持.
Milvus的云原生和高度解耦的系统架构确保了系统可以随着数据的增长而不断扩展:

Milvus本身是完全无状态的, 因此可以借助Kubernetes或公共云轻松地扩展. 此外, Milvus的各个组件都有很好的解耦, 其中最关键的三项任务--搜索, 数据插入和索引/压实--被设计为易于并行化的流程, 复杂的逻辑被分离出来. 这确保了响应的查询节点, 数据节点和索引节点可以独立地向上和向下扩展, 从而优化了性能和成本效率.
# Milvus 支持的搜索类型
Milvus支持各种类型的搜索功能, 以满足不同用例的需求:
- ANN搜索: 查找最接近查询向量的前K个向量.
- 过滤搜索: 在指定的过滤条件下执行ANN搜索.
- 范围搜索: 查找查询向量指定半径范围内的向量.
- 混合搜索: 基于多个向量场进行ANN搜索.
- 全文搜索: 基于BM25的全文搜索.
- Rerankers: 根据附加标准或辅助算法调整搜索结果顺序, 完善初始ANN搜索结果.
- 获取: 根据主键检索数据.
- 查询: 使用特定表达式检索数据.
# 综合功能集
除了上述主要搜索功能外, Milvus还提供了一系列围绕ANN搜索实现的功能, 以便你充分利用其功能.
# 应用程序接口和SDK
- RESTful API (官方)
- PyMilvus (Python SDK) (官方)
- Go SDK (官方)
- Java SDK (官方)
- Node.js (JavaScript) SDK (官方)
- C# (微软提供)
- C++ SDK (开发中)
- Rust SDK (开发中)
# 高级数据类型
除了原始数据类型, Milvus还支持各种高级数据类型及其各自适用的距离度量.
- 稀疏向量
- 二进制向量
- JSON支持
- 数组支持
- 文本 (开发中)
- 地理定位 (开发中)
# 为什么选择Milvus?
- 高性能和高可用性
Milvus采用计算与存储分类的分布式架构. Milvus可以横向扩展并适应多样化的流量模式, 通过独立增加读取繁重工作负载的查询节点和写入繁重工作负载的数据节点来实现最佳性能. K8S上的无状态微服务允许从故障中快速恢复, 确保了可用性. 通过在多个查询节点上加载数据段, 对复制的支持进一步增强了容错能力和吞吐量.
- 支持各种向量索引类型和硬件加速
Milvus分离了系统和核心向量搜索引擎, 使其能够支持针对不同场景优化的所有主要向量索引类型, 包括HNSW, IVF, FLAT(暴力), SCANN和DiskANN, 以及基于量化的变化和mmap. Milvus针对元数据过滤和范围搜索等高级功能对向量搜索进行了优化. 此外, Milvus还实现了硬件加速以提高向量搜索性能, 并支持GPU索引, 如英伟达的CAGRA.
- 灵活的多租户和热/冷存储
Milvus通过在数据库, Collection, 分区或分区Key层面进行隔离来支持多租户. 灵活的策略允许单个集群处理数百到数百万个租户, 还能确保优化的搜索性能和灵活的访问控制. Milvus通过冷/热存储提高了成本效益. 经常访问的热数据可以存储在内存或固态硬盘中, 以获得更好的性能, 而访问量较少的冷数据则保存在速度较慢, 成本效益较高的存储设备中. 这种机制可以大大降低成本, 同时保持关键人物的高性能.
- 用于全文搜索和混合搜索的稀疏向量
除了通过密集向量进行语义搜索外, Milvus还通过BM25以及SPLADE和BGE-M3等学习型稀疏嵌入原生支持全文搜索. 用户可以将稀疏向量和密集向量存储在同一个Collections中, 并定义函数对多个搜索请求的结果进行Rerankers.
- 数据安全和细粒度访问控制
Milvus通过实施强制用户认证, TLS加密和基于角色的访问控制(RBAC)来确保数据安全. 用户身份验证可确保只有拥有有效凭证的授权用户才能访问数据库, 而TLS加密则可确保网络内所有通信的安全. 此外, RBAC允许根据用户的角色为其分配特定权限, 从而实现精细的访问控制. 这些功能使Milvus称为企业应用强大而安全的选择, 保护敏感数据免遭未经授权的访问和潜在的破坏.
# 人工智能集成
- Embeddings模型集成Embedding模型将非结构化的数据转换为其在高维数据空间中的数字表示, 以便你可以将其存储在Milvus中. 目前, PyMilvus(Python SDK)集成了多个嵌入模型, 因此你可以快速将数据准备成向量嵌入.
- Reranker模型集成在信息检索和生成式人工智能领域, Reranker是优化初始搜索结果顺序的重要工具. PyMilvus也集成了几种Rerankers模型, 以优化初始搜索返回结果的顺序.
- LangChain和其他人工智能工具集成在GenAI时代, LangChain等工具受到了应用程序开发人员的广泛关注. 作为核心组件, Milvus通常在此类工具中充当向量存储.
# 工具和生态系统
- Attu Attu是一个一体化的直观图形用户界面, 可帮助管理Milvus及其存储的数据.
- Birdwatcher Birdwatcher是Milvus的调试工具. 使用它连接到etcd, 可以检查Milvus系统的状态, 或动态配置它.
- Promethus和Grafana集成 Promathus是Kubernetes的开源系统监控和警报工具包. Grafana是一个开源可视化堆栈, 可以连接所有数据源.
- Milvus备份是一个允许用户备份和恢复Milvus数据的工具. 它同时提供CLI和API, 以适应不同的应用场景.
- Milvus Capture Data Change (CDC) Milvus-CDC 可以捕获和同步Milvus实例中的增量数据, 并通过在源实例和目标实例之间的无缝传输, 确保业务数据的可靠性, 从而轻松实现增量备份和灾难恢复.
- Milvus连接器Milvus规划了一套连接器, 以便将Milvus与Apach Spark等第三方工具无缝集成. 目前, 可以使用Spark连接器将Milvus数据馈送到Apache Spark进行机器学习处理.
- 向量传输服务(VTS) Milvus提供了一套工具, 用于在Milvus实例和一系列数据源(包括Zilliz集群, Elasticsearch, Postgres(PgVector)和另一个Milvus实例)之间传输数据.
# Milvus 采用者
# Milvus 路线图
| 类别 | Milvus 2.5.x(在最近的版本中实现) | 下一个版本--Milvus 2.6 (25年中期) | 未来路线图--Milvus 3.0 (1年内) |
|---|---|---|---|
| 人工智能驱动的非结构化数据处理: 利用人工智能模型和先进技术加强处理和分析非结构化数据的能力 | 全文搜索: 利用Sparse-BM25支持全文搜索. 新的API接收文本作为输入, 并在Milvus内部自动生成稀疏向量. 稀疏向量(GA): 支持稀疏向量的高效存储和索引方法 | 数据输入和数据输出: 支持主要的模型服务, 以摄取原始文本. 高级Reranker: 支持基于模型的Reranker和用户定义的评分函数 迭代搜索: 根据用户标签修改查询向量 | 支持向量: 支持向量列表, 典型用户如Colbert, Copali和视频表示 支持更多数据类型: 如日期时间, 地图, GIS等 |
| 搜索质量和性能: 通过优化架构, 算法和API提供准确, 相关和快速的搜索结果 | 文本匹配: 快速过滤文本/varchar中的关键词/关键字 增强分组搜索: 在混合搜索中引入分组大小并添加分组支持 位图索引和反向索引: 加速标签过滤 | 高级匹配: 如phrase_match, multi_match 分析器增强: 通过扩展标记符号支持和改进可观察性来增强分析器 JSON过滤: 优化JSON索引和解析, 以加快处理速度 | 排序功能: 在执行过程中按标量字段排序 支持数据集群: 数据共定位 |
| 丰富的功能和管理: 对开发人员友好的强大数据管理功能 | 在数据导入中支持csv文件Bulkinsert支持csv格式 支持控制和默认值, 控制和默认值类型使从其他DBMS导入数据更加容易 Milvus WebUI(测试版), 面相DBA的可视化管理工具 | Schema更改: 如添加/删除字段, 修改varchar长度 聚合: 标量字段聚合, 如计数, 不同值, 最小值, 最大值 支持UDF: 用户自定义函数 | 批量更新: 支持对特定字段值的批量更新 主键重复数据删除: 通过使用全局 pk 索引 数据版本管理和还原: 支持通过快照进行数据版本管理 |
| 成本效益与架构: 具有稳定性, 成本效益和简化部署的先进系统 | 内存优化: 减少 OOM 和增强负载 集群压缩: 根据配置重新分配数据,加快读取性能 存储格式 V2 (测试版): 通用格式设计和基于磁盘的数据访问基础 | 分层存储: 支持冷热存储以优化成 Stream Node: 处理流数据并简化增量写入流: MixCoord: 将DataCoord 逻辑合二为一 | 向量湖: 具有成本效益的离线解决方案,Spark 连接器并与 iceberg 集成 Logstore 组件: 减少对 pulsar 等外部组件的依赖: 数据驱逐策略: 用户可以定义自己的驱逐策略 |