docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > milvus向量数据库部署docker-compose

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

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

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

etcd 的特点包括:

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

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

三、部署执行步骤

3.1 准备所需的镜像文件

3.2 依次导入所需镜像文件

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

总结

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

您可能感兴趣的文章:
阅读全文