milvus向量数据库介绍与部署(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服务状态

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

显示OK即为正常

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

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

相关推荐
PPIO派欧云1 小时前
PPIO 上线 MiniMax M2.5:体验架构师级编程与高效 Agent 能力
人工智能·ai·大模型
laplace01231 小时前
deque+yield+next语法
人工智能·笔记·python·agent·rag
小王毕业啦1 小时前
2007-2024年 上市公司-投资者情绪数据(xlsx)
大数据·人工智能·数据挖掘·数据分析·数据统计·社科数据·经管数据
(; ̄ェ ̄)。1 小时前
机器学习入门(二十一)特征工程
人工智能·机器学习
CeshirenTester2 小时前
保姆级教程 | 人工智能应用开发平台 Coze
人工智能
码农三叔2 小时前
《卷2:人形机器人的环境感知与多模态融合》
人工智能·嵌入式硬件·算法·机器人·人形机器人
MaoziShan2 小时前
CMU Subword Modeling | 02 Signs, Minimal Signs, and Compositionality
人工智能·自然语言处理
烁烁闪闪烁烁2 小时前
【weelinking系列Claude教程】 04 - Claude Code 安装与配置
人工智能·chatgpt·ai编程·claude·cursor·claude code·opencode