Milvus 是一个开源的、云原生的向量数据库,专为处理海量非结构化数据(如文本、图像、音频)而设计。它通过将数据转换为高维向量并执行近似最近邻搜索,来支撑人工智能应用中的高效相似性检索。
核心优势:不仅仅是向量搜索引擎
与传统的向量索引库(如 FAISS)不同,Milvus 是一个完整的数据库系统,具备以下核心能力:
-
数据管理能力 :支持数据的持久化存储、元数据过滤(如
价格<50)、数据更新、删除与实时查询,并提供 ACID 事务保障。 -
高性能与可扩展性 :采用存算分离的分布式架构,支持水平扩展。在最新的 Milvus 2.6 版本中,单个集群可管理100K 个集合 ,支持百亿级向量规模。
-
混合搜索能力 :原生支持 BM25 关键词搜索 与向量语义搜索的结合,提供类似搜索引擎的综合检索体验,性能在特定场景下可达 Elasticsearch 的 4 倍。
核心架构:存算分离
Milvus 的架构遵循云原生原则,分为四个层次,各层相互独立,可实现弹性伸缩和高可用性:
-
接入层:由无状态代理组成,负责请求验证和结果聚合。
-
协调器:系统的"大脑",负责集群拓扑管理、负载均衡和任务调度。
-
工作节点:
-
查询节点:处理只读请求,从对象存储加载历史数据。
-
数据节点:处理数据插入、索引构建和压缩等写入操作。
-
流节点(2.6+版本):专门处理实时数据,替代了传统消息队列,降低架构复杂度。
-
-
存储层:
-
元存储:使用 etcd 存储元数据。
-
对象存储:存储日志、索引快照,支持 S3、MinIO 等,是成本低廉的核心存储。
-
日志存储 :Milvus 2.6 引入了自研的 Woodpecker 系统作为 Write-Ahead Log,替代了 Kafka/Pulsar,降低了运维成本并提升了吞吐量(S3模式下可达 750 MB/s)。
-
关键特性与性能亮点
-
多种部署模式 :支持从个人笔记本(Milvus Lite )到生产单机(Standalone ),再到大型分布式集群(Distributed)的无缝切换。
-
丰富的索引支持:内置 HNSW、IVF、DiskANN 等索引算法,并支持 GPU 加速(如 NVIDIA CAGRA)。
-
成本优化 :RaBitQ 量化技术可减少高达 72% 的内存占用,同时提升 4 倍 的查询速度;冷热分层存储 可将存储成本降低 50% 。
-
高级过滤 :支持 JSON 字段上的路径索引 ,使过滤延迟从 140 毫秒降至 1.5 毫秒(提升约 100 倍)。
典型应用场景
-
检索增强生成:作为 RAG 架构的核心记忆组件,为大模型提供外部知识库,减少幻觉。
-
推荐系统:实时匹配用户画像与物品特征向量,实现个性化推荐。
-
多模态搜索:支持以文搜图、以图搜图、视频指纹去重等场景。
-
语义缓存:利用向量相似度判断问题是否重复,减少大模型 API 调用,降低成本。
与传统 ANN 库对比
| 特性维度 | Milvus (向量数据库) | 传统 ANN 库 (如 FAISS) |
|---|---|---|
| 数据持久化 | 支持,数据不丢失 | 不支持,基于内存 |
| 分布式能力 | 原生支持,存算分离 | 不支持,需自行开发 |
| 数据操作 | 增删改查、过滤、混合搜索 | 仅支持索引构建与搜索 |
| 生产环境 | 内置监控、运维工具、RBAC | 需额外集成 |
Mac环境Milvus安装
使用 Docker Compose 安装 Milvus 是最快上手的方案,官方提供了单机版配置文件,一条命令就能启动所有依赖组件。
这种方式会启动 Milvus 服务本身以及 etcd(元数据存储)和 MinIO(对象存储)三个容器。
0. 环境要求:
-
MacOS 10.14 或更高版本。
-
已安装 Docker Desktop。
-
需为 Docker 虚拟机分配 至少 2 个虚拟 CPU (vCPUs) 和 8 GB 初始内存
备注:如何调整 Docker Desktop 资源 :打开 Docker Desktop,进入 Settings (macOS 上为 Preferences ) > Resources > Advanced,手动调整 CPUs 和 Memory 的数值。
1. 下载配置文件
下载官方最新版(v2.6.13)的 docker-compose.yml 文件,新建 milvus 文件夹,打开终端,进入到该文件夹下,运行以下命令:
bash
wget https://github.com/milvus-io/milvus/releases/download/v2.6.13/milvus-standalone-docker-compose.yml -O docker-compose.yml
如果你的 Mac 没有 wget 命令 ,别担心,可以用 curl 命令代替:
bash
curl -LO https://github.com/milvus-io/milvus/releases/download/v2.6.13/milvus-standalone-docker-compose.yml
## 然后修改下文件名
mv milvus-standalone-docker-compose.yml docker-compose.yml
2. 启动服务
在 docker-compose.yml 文件所在的目录下,运行以下命令启动服务:
bash
sudo docker compose up -d
Docker 会自动拉取镜像并启动所有容器,首次运行需要下载镜像(约2-3GB),请耐心等待。

3. 验证运行状态
执行以下命令检查容器是否正常运行。如果看到三个容器状态均为 Up,且 milvus-standalone 处于 healthy 状态,说明安装成功:
bash
sudo docker compose ps
你应该会看到类似下面的输出:
text
NAME COMMAND SERVICE STATE PORTS
milvus-etcd etcd ... etcd Up (healthy) ...
milvus-minio /usr/bin/docker-... minio Up (healthy) ...
milvus-standalone /tini -- milvus ... standalone Up 0.0.0.0:19530->19530/tcp
4. 连接测试
-
服务端口 :客户端通过
localhost:19530连接 Milvus -
WebUI :访问
http://localhost:9091/webui/可查看 Milvus 管理界面

pymilvus安装并使用
现在,你可以通过 Python 等语言的 SDK 连接到 localhost:19530 来操作 Milvus 了。安装 Python 库的命令如下:
bash
pip3 install pymilvus
这条命令会从官方的Python软件包仓库(PyPI)下载并安装最新版本的 pymilvus。安装成功后,终端会显示 "Successfully installed pymilvus-..." 的信息。当然也很可能安装失败,如果你看到以下报错信息:
bash
rcm@rcmdeMacBook-Pro ~ % pip3 install pymilvus
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try brew install
xyz, where xyz is the package you are trying to
install.
If you wish to install a Python library that isn't in Homebrew,
use a virtual environment:
python3 -m venv path/to/venv
source path/to/venv/bin/activate
python3 -m pip install xyz
是因为你的 Mac 系统 Python 环境受到了保护(这是 Python 3.11+ 和 Homebrew 的默认安全机制),不允许直接使用 pip 安装包到系统级别。这是为了避免破坏系统依赖。
推荐的解决方案:创建虚拟环境
这是最规范、最安全的方式,可以为你的项目创建一个独立的 Python 环境。
步骤 1:创建虚拟环境
在终端中,先进入你的项目目录,然后执行:
bash
cd /Users/rcm/diskE/space/pyspace
python3 -m venv milvus_env
这会在当前目录下创建一个名为 milvus_env 的虚拟环境文件夹。
步骤 2:激活虚拟环境
bash
source milvus_env/bin/activate
激活成功后,你的终端提示符前面会出现 (milvus_env),像这样:
text
(milvus_env) rcm@rcmdeMacBook-Pro pyspace %
步骤 3:安装 pymilvus
现在在虚拟环境中安装:
bash
pip install pymilvus
如何验证安装是否成功?
安装完成后,可以运行一个快速检查命令来确认是否一切就绪。
打开终端,输入以下Python命令:
bash
python3 -c "from pymilvus import MilvusClient; print('PyMilvus 安装成功!')"
如果看到 PyMilvus 安装成功! 的输出,就说明库已经正确安装,你的代码应该可以顺利运行了。
bash
一个简单的连接测试代码:
python
from pymilvus import connections
connections.connect(host='localhost', port='19530')
print(connections.list_connections())
print("连接成功!")
可视化管理工具(Attu)
WebUI提供的 Milvus 管理界面功能相对基础,主要用于查看 Milvus 实例的基本信息和状态,无法查看存储的具体数据。推荐安装 Milvus 官方 GUI 工具 Attu,可以像操作数据库一样管理你的集合和数据。可以下载桌面版,也可以用 Docker 运行。
Attu安装并启动
首先你可以在 Docker Compose 文件中添加以下服务定义:
bash
yaml
services:
attu:
image: zilliz/attu:v2.6.0
container_name: attu
environment:
MILVUS_URL: milvus-standalone:19530 # 指向你的 Milvus 服务名和端口
ports:
- "8000:3000"
注意 attu 与原有的 etcd、minio、standalone 平级
-
然后运行
docker compose up -d启动。 -
启动成功后,在浏览器中打开
http://localhost:8000。你可以像管理传统数据库一样,在 Web 界面上创建集合、浏览数据、执行向量搜索,非常方便。

连接 Milvus 服务器
在浏览器打开 http://localhost:8000 后,页面会要求你填写 Milvus 服务器的连接信息。

常见连接失败原因及解决
错误使用了 localhost 或 127.0.0.1
-
现象:连接超时或失败。
-
原因 :在 Attu 容器内部,
localhost指向的是 Attu 容器自己,而不是 Milvus 容器。 -
解决方案1 :将地址改为 Milvus 容器所在宿主机的IP,如
192.168.1.12:19530 -
解决方案2 :将地址改为 Milvus 容器的名称,如
milvus-standalone:19530(推荐)
方案2更优,因为可以避免因宿主机IP变化导致的配置变更
方案一:
第1步:获取宿主机的 IP 地址
在宿主机上执行:
-
Linux/macOS : 执行
ifconfig或ip addr,找到类似192.168.x.x的 IP。 -
Windows : 执行
ipconfig,找到类似192.168.x.x的 IPv4 地址。

第2步:在 Attu 中使用该 IP 地址连接
回到浏览器中 Attu 的连接页面,在 Milvus Address 一栏输入 <宿主机IP>:19530(例如 192.168.1.100:19530),然后点击 Connect。
为什么这样也能解决?
-p 19530:19530这个端口映射,将 Milvus 容器的内部端口绑定到了宿主机的同一个端口上。因此,任何能访问宿主机 IP 的设备(包括 Attu 容器),都能通过这个地址连接到 Milvus 服务。
方案二:
如果直接数据: milvus-standalone:19530 ,连接可能会报以下错误:
Name resolution failed for target dns:milvus-standalone:19530 (retried 3 times, 160ms)
它的意思是 Attu 容器内部无法解析 milvus-standalone 这个地址。
问题的根源在于:Attu 和 Milvus 没有运行在同一个 Docker 网络上 。当你通过浏览器访问 Attu 时,是 Attu 容器在尝试连接 Milvus 容器。milvus-standalone 这个主机名只在 Milvus 所在的 Docker 网络内才有效,Attu 容器里无法识别它。
解决方案:将 Attu 容器连接到 Milvus 的网络
这是改动最小、最快见效的方法,不需要重启现有容器,只是把 Attu "加入"到 Milvus 的网络中。
第一步:找到 Milvus 使用的网络名称
在你的终端中执行以下命令,查看 Milvus 容器连接到的网络:
bash
docker inspect milvus-standalone | grep -A 10 "Networks"
你会看到类似这样的输出,milvus 或 milvus-standalone_default 就是网络名称:
json
"Networks": {
"milvus": { // <--- 记下这个网络名
"Aliases": null,
...
}
}
第二步:将 Attu 容器连接到这个网络
假设找到的网络名是 milvus, attu的container_name是 attu,执行以下命令:
bash
docker network connect milvus attu
然后重启attu 否则 8000 端口将无法使用:
docker restart attu
第三步:修改 Attu 的连接地址并重试
回到浏览器中 Attu 的连接页面,在 Milvus Address 一栏输入 milvus-standalone:19530,然后点击 Connect 重试。
为什么这样能解决?
这个操作相当于给 Attu 容器添加了第二张"网卡",让它也接入 Milvus 所在的网络。从此,它就能通过 Docker 内置的 DNS 服务解析
milvus-standalone这个服务名了。
连接成功数据查看
连接成功后的界面如下,选择对应的Collection就可以查看向量库中存储的数据了:

