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(字段)
|
Milvus向量数据库
|
关系型数据库
|
|
Collection
|
表
|
|
Entity
|
行
|
|
Field
|
表字段
|
Partition(分区)
Segment(分段)
Sharding(分片)
Index(索引)
- 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 图形化管理工具
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并能显示信息即可。
更多推荐




所有评论(0)