一、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并能显示信息即可。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐