向量数据库Milvus安装及使用实战经验分享

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 服务器的连接信息。

常见连接失败原因及解决

错误使用了 localhost127.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 : 执行 ifconfigip 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"

你会看到类似这样的输出,milvusmilvus-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就可以查看向量库中存储的数据了:

相关推荐
ego.iblacat2 小时前
Python 连接 MySQL 数据库
数据库·python·mysql
祖传F872 小时前
quickbi数据集数据查询时间字段显示正确,仪表板不显示
数据库·sql·阿里云
Leon-Ning Liu2 小时前
Oracle 26ai新特性:时区、表空间、审计方面的新特性
数据库·oracle
humors2212 小时前
各厂商工具包网址
java·数据库·python·华为·sdk·苹果·工具包
Yushan Bai3 小时前
ORACLE数据库在进行DROP TABLE时失败报错ORA-00604问题的分析处理
数据库·oracle
77美式3 小时前
Node + Express + MongoDB 后端部署全解析:新手零踩坑
数据库·mongodb·express
城数派3 小时前
2000-2025年我国省市县三级逐8天日间地表温度数据(Shp/Excel格式)
数据库·arcgis·信息可视化·数据分析·excel
AC赳赳老秦4 小时前
OpenClaw text-translate技能:多语言批量翻译,解决跨境工作沟通难题
大数据·运维·数据库·人工智能·python·deepseek·openclaw
AI应用实战 | RE4 小时前
014、索引高级实战:当单一向量库不够用的时候
数据库·人工智能·langchain