milvus向量数据库用法及部署(docker-compose)

 更新时间:2026年02月11日 09:38:57   作者:Hoking  
Milvus是一个开源的向量数据库,专为存储和检索高维向量数据设计,支持多种索引算法和混合查询能力,它广泛应用于实时推荐系统、图像/视频检索、生物信息学、自然语言处理和多模态检索等领域,部署环境包括etcd、minio和attu等组件,通过docker-compose进行管理

一、Milvus介绍

1.1 概述

Milvus 是一个开源的向量数据库,专为存储和检索高维向量数据而设计。它并非传统的关系型数据库,而是专注于解决‌相似性搜索‌问题,即在海量数据中快速找到与查询向量最相似的项。这使其成为处理图像、视频、音频、文本等非结构化数据的理想选择。‌

多样化的索引算法:内置 IVF、HNSW、CAGRA(GPU 加速)等多种索引类型,可根据数据规模和场景需求(如追求高召回率或低延迟)进行选择和优化。‌

强大的混合查询能力‌:支持“向量相似性搜索”与“标量过滤”(如指定品牌、时间范围等)的结合,实现更精准的检索。

主要应用场景:

  • 实时推荐系统‌:基于用户行为向量,实现个性化内容推荐,显著提升点击率和用户时长。‌
  • 图像/视频检索‌:在海量图库中快速找到语义相似的图片或视频帧。‌
  • 生物信息学‌:用于基因测序、蛋白质序列分析等,加速新药研发。‌
  • 自然语言处理与语义搜索‌:理解文本的语义,实现比关键词匹配更智能的搜索。‌
  • 广告推荐、自动驾驶、多模态检索‌:处理来自传感器、摄像头等的多模态数据。

‌1.2 主要概念

Collection(集合)

直白的讲:在Milvus里,一个Collection就像是一个表格,但里面放的不是普通的文字或数字,而是向量。每个向量代表了一个数据对象,比如一张图或一段话的特征描述。

包含一组 entity,可以等价于关系型数据库系统(RDBMS)中的表。

Entity(实体)

直白的讲:实体就像是你盒子里的每张卡片,每个Entity都包含了向量信息,有时候还会有额外的标签或者描述,比如这张图是哪只猫的名字、年龄之类的。

包含一组 field。field 与实际对象相对应。field 可以是代表对象属性的结构化数据,也可以是代表对象特征的向量。primary key 是用于指代一个 entity 的唯一值。

注:你可以自定义 primary key,否则 Milvus 将会自动生成 primary key。请注意,目前 Milvus 不支持 primary key 去重,因此有可能在一个 collection 内出现 primary key 相同的 entity。

Field(字段)

Entity 的组成部分。​​Field​​ 可以是结构化数据,例如数字和字符串,也可以是向量。

注:Milvus 2.0 现已支持标量字段过滤。并且,Milvus 2.0 在一个集合中只支持一个主键字段。

Milvus与关系数据库的对应关系

Milvus向量数据库关系型数据库
Collection
Entity
Field表字段

Partition(分区)

Partition(分区)是Collection(集合)的一个分区。Milvus 支持将收集数据划分为物理存储上的多个部分。这个过程称为分区,每个分区可以包含多个段。

Segment(分段)

Milvus 在数据插入时,通过合并数据自动创建的数据文件。一个 collection 可以包含多个 segment。一个 segment 可以包含多个 entity。在搜索中,Milvus 会搜索每个 segment,并返回合并后的结果。

Sharding(分片)

Shard 是指将数据写入操作分散到不同节点上,使 Milvus 能充分利用集群的并行计算能力进行写入。默认情况下,单个 Collection 包含 2 个分片(Shard)。目前 Milvus 采用基于​主键哈希​的分片方式,未来将支持随机分片、自定义分片等更加灵活的分片方式。

注:分区的意义在于通过划定分区减少数据读取,而分片的意义在于多台机器上并行写入操作

Index(索引)

索引基于原始数据构建,可以提高对 collection 数据搜索的速度。Milvus 支持多种​​索引类型​​。为提高查询性能,你可以为每个向量字段指定一种索引类型。目前,一个向量字段仅支持一种索引类型。切换索引类型时,Milvus 自动删除之前的索引。

Milvus支持的索引类型主要分为CPU 索引 GPU 索引两大类

CPU 索引

  • FLAT‌:执行暴力搜索,不构建索引,能保证 100% 的召回率,适用于数据规模较小(如百万级)且对精度要求极高的场景。‌
  • IVF(Inverted File System)‌:通过聚类将向量空间划分为多个单元,先搜索相关单元再进行精确搜索,适用于大规模数据集的批量查询。‌
  • HNSW(Hierarchical Navigable Small World)‌:基于图结构的索引,能实现高精度和高速度的实时搜索,是处理高维数据的常用选择。‌
  • DiskANN‌:一种面向磁盘优化的索引,专为处理超大规模数据集设计,能在有限内存下高效检索。‌
  • ANNOY‌:基于树的近似最近邻搜索索引,适用于中等规模数据的快速检索。‌

GPU 索引‌(利用 NVIDIA GPU 加速,性能远超 CPU 索引)

  • CAGRA(CUDA Accelerated Graph-based Retrieval Algorithm)‌:Milvus 2.4 新增支持,是 NVIDIA RAFT 库中最先进的 GPU 图形索引,在小批量和大批量查询中均表现出压倒性优势,是当前性能最强的索引之一。‌
  • GPU IVF-Flat‌:基于 GPU 的 IVF-Flat 索引,适用于需要高召回率的场景。‌
  • GPU IVF-PQ‌:基于 GPU 的 IVF-PQ(Product Quantization)索引,通过量化压缩数据,在保证较高精度的同时提升查询速度。‌
  • GPU 暴搜‌:Milvus 2.4 还支持 GPU 加速的暴力搜索,性能可提升数十倍,满足对召回率要求极高的应用。‌

二、部署环境介绍

2.1 组件依赖关系

milvus的运行依赖etcd和minio,所以需要优先启动这两个组件。

  • etcd:用来存储milvus的元数据。
  • minio:用来存储milvus的向量数据和索引数据。

etcd是一个开源、分布式、强一致性的键值存储系统,主要用于为分布式系统提供可靠的协调服务。它由CoreOS(后被Red Hat收购)开发,采用Go语言编写,并基于Raft共识算法实现数据的一致性和高可用性。

etcd 通常用于在分布式系统中进行配置管理、服务发现、分布式锁、选举等任务。

etcd 的特点包括:

  • 分布式一致性:基于 Raft 共识算法,etcd 确保数据在分布式环境中的一致性和可靠性。
  • 键值存储:提供类似于 NoSQL 数据库的键值对存储功能。
  • 高可用性:通过多节点部署、自动故障转移等方式提高服务的可用性。
  • 易于使用:提供简单的 HTTP 和 gRPC API 进行数据操作。
  • 事件通知:支持观察特定键或键前缀的变化,并通过事件通知客户端。

2.2 图形化管理工具

attu为milvus的一款图形化管理工具,非常方便对milvus的一些管理。
本例使用的版本为:zilliz/attu:v2.3.5

2.3 本地运行环境

docker版本:Docker version 29.2.0, build 0b9d198

docker-compose版本:Docker Compose version v5.0.2

使用主要组件镜像版本为:

  • etcd:quay.io/coreos/etcd:v3.5.5
  • minio:minio/minio:RELEASE.2023-04-28T18-11-17Z
  • milvus:milvusdb/milvus:v2.3.1
  • attu:zilliz/attu:v2.3.5

三、部署执行步骤

3.1 准备所需的镜像文件

  • etcd:quay.io/coreos/etcd:v3.5.5
  • minio:minio/minio:RELEASE.2023-04-28T18-11-17Z
  • milvus:milvusdb/milvus:v2.3.1
  • attu:zilliz/attu:v2.3.5

3.2 依次导入所需镜像文件

  • docker load -i etcd-v3.5.5.tar
  • docker load -i minio-RELEASE.2023-04-28T18-11-17Z.tar
  • docker load -i milvus-v2.3.1.tar
  • docker load -i attu-v2.3.5.tar

3.3 编写milvus部署使用的docker-compose.yml文件

milvus-docker-compose.yml内容如下

version: '3.5'

services:
  etcd:
    container_name: milvus-etcd
    image: quay.io/coreos/etcd:v3.5.5
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_AUTO_COMPACTION_RETENTION=1000
      - ETCD_QUOTA_BACKEND_BYTES=4294967296
      - ETCD_SNAPSHOT_COUNT=50000
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
    command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
    healthcheck:
      test: ["CMD", "etcdctl", "endpoint", "health"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio:
    container_name: milvus-minio
    image: minio/minio:RELEASE.2023-04-28T18-11-17Z
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    ports:
      - "9001:9001"
      - "9000:9000"
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
    command: minio server /minio_data --console-address ":9001"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  standalone:
    container_name: milvus-standalone
    image: milvusdb/milvus:v2.3.1
    command: ["milvus", "run", "standalone"]
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
      interval: 30s
      start_period: 90s
      timeout: 20s
      retries: 3
    ports:
      - "19530:19530"
      - "9091:9091"
    depends_on:
      - "etcd"
      - "minio"

networks:
  default:
    name: milvus

3.4 编写attu部署使用的docker-compose.yml文件

attu-docker-compose.yml内容如下

version: '3.5'

services:
  attu:
    container_name: milvus-attu
    image: zilliz/attu:v2.3.5
    environment:
      - MILVUS_URL=172.16.15.4:19530
    ports:
      - "8000:3000"

3.5 创建部署目录

mkdir milvus-standalone
mkidr milvus-attu
mv milvus-docker-compose.yml ./milvus-standalone/docker-compose.yml
mv attu-docker-compose.yml ./milvus-attu/docker-compose.yml

3.6 依次启动服务

依次进入工作目录启动milvus、attu服务

cd milvus-standalone
docker-compose up -d
cd ../milvus-attu

3.7 检查服务运行状态

1)执行docker ps -a,查看容器状态

2)执行docker logs -f milvus-standalone,查看milvus服务状态

2)访问http://127.0.0.1:9091/healthz,检查milvus健康状态

显示OK即为正常

3)访问http://127.0.0.1:8000,检查attu的服务状态

可以连上milvus并能显示信息即可。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • docker部署springboot项目实践(更新无需重新build)

    docker部署springboot项目实践(更新无需重新build)

    文章描述了使用Docker部署Spring Boot项目的另一种方式,通过在宿主机上挂载jar包路径,实现jar包的热更新,避免了每次更新都需要重新构建镜像的问题
    2026-01-01
  • 在 OpenKylin 上安装 Docker的详细过程

    在 OpenKylin 上安装 Docker的详细过程

    在 OpenKylin 上安装 Docker可能会遇到与 Ubuntu 略有不同的包管理问题,这篇文章主要介绍了在 OpenKylin上安装 Docker的过程,需要的朋友可以参考下
    2024-05-05
  • Docker 安装 Nginx 并挂载目录的实现示例

    Docker 安装 Nginx 并挂载目录的实现示例

    本文介绍了如何使用Docker拉取Nginx镜像、创建容器,并设置挂载目录,挂载目录用于将容器内配置文件与主机关联,便于直接修改影响容器配置,感兴趣的可以了解一下
    2024-10-10
  • Armbian5.9.0安装docker及部署可视化portainer的详细教程

    Armbian5.9.0安装docker及部署可视化portainer的详细教程

    这篇文章主要介绍了Armbian5.9.0安装docker及部署可视化portainer的详细教程,通过 ssh 进去 Armbian 系统后,输入相应代码,按提示输入y,等待安装完成即可,需要的朋友可以参考下
    2022-05-05
  • 聊聊docker跨主机之间容器通信问题

    聊聊docker跨主机之间容器通信问题

    这篇文章主要介绍了docker跨主机之间容器通信问题,创建网桥之后,使用ifconfig查看会多出一个网桥,该网桥在docker启动或者重启之后,会自动显示出来,具体实践跟随小编一起看看吧
    2022-05-05
  • 一文教你彻底解决Docker日志膨胀

    一文教你彻底解决Docker日志膨胀

    这篇文章主要为大家详细介绍了如何快速检查,清理 Docker 日志,并设置日志大小限制以防止未来日志失控,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-05-05
  • docker Network(网络)详解

    docker Network(网络)详解

    这篇文章主要介绍了docker Network(网络),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • 如何在docker容器内部安装kibana分词器

    如何在docker容器内部安装kibana分词器

    这篇文章主要介绍了如何在docker容器内部安装kibana分词器,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • docker安装部署 onlyoffice的详细过程

    docker安装部署 onlyoffice的详细过程

    本文给大家分享docker安装部署 onlyoffice的详细过程,通过图文并茂实例相结合给大家分享安装Docker Desktop及如何进入BIOS设置CPU的虚拟化,感兴趣的朋友一起看看吧
    2021-06-06
  • Docker Buildx 简介与安装指南(最新推荐)

    Docker Buildx 简介与安装指南(最新推荐)

    Docker Buildx 是 Docker 官方推出的一款增强型构建工具,旨在简化和优化多架构容器映像的构建流程,这篇文章主要介绍了Docker Buildx 简介与安装指南,需要的朋友可以参考下
    2024-08-08

最新评论