milvus向量數(shù)據(jù)庫用法及部署(docker-compose)
一、Milvus介紹
1.1 概述
Milvus 是一個開源的向量數(shù)據(jù)庫,專為存儲和檢索高維向量數(shù)據(jù)而設(shè)計(jì)。它并非傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,而是專注于解決相似性搜索問題,即在海量數(shù)據(jù)中快速找到與查詢向量最相似的項(xiàng)。這使其成為處理圖像、視頻、音頻、文本等非結(jié)構(gòu)化數(shù)據(jù)的理想選擇。
多樣化的索引算法:內(nèi)置 IVF、HNSW、CAGRA(GPU 加速)等多種索引類型,可根據(jù)數(shù)據(jù)規(guī)模和場景需求(如追求高召回率或低延遲)進(jìn)行選擇和優(yōu)化。
強(qiáng)大的混合查詢能力:支持“向量相似性搜索”與“標(biāo)量過濾”(如指定品牌、時間范圍等)的結(jié)合,實(shí)現(xiàn)更精準(zhǔn)的檢索。
主要應(yīng)用場景:
- 實(shí)時推薦系統(tǒng):基于用戶行為向量,實(shí)現(xiàn)個性化內(nèi)容推薦,顯著提升點(diǎn)擊率和用戶時長。
- 圖像/視頻檢索:在海量圖庫中快速找到語義相似的圖片或視頻幀。
- 生物信息學(xué):用于基因測序、蛋白質(zhì)序列分析等,加速新藥研發(fā)。
- 自然語言處理與語義搜索:理解文本的語義,實(shí)現(xiàn)比關(guān)鍵詞匹配更智能的搜索。
- 廣告推薦、自動駕駛、多模態(tài)檢索:處理來自傳感器、攝像頭等的多模態(tài)數(shù)據(jù)。
1.2 主要概念
Collection(集合)
直白的講:在Milvus里,一個Collection就像是一個表格,但里面放的不是普通的文字或數(shù)字,而是向量。每個向量代表了一個數(shù)據(jù)對象,比如一張圖或一段話的特征描述。
包含一組 entity,可以等價于關(guān)系型數(shù)據(jù)庫系統(tǒng)(RDBMS)中的表。
Entity(實(shí)體)
直白的講:實(shí)體就像是你盒子里的每張卡片,每個Entity都包含了向量信息,有時候還會有額外的標(biāo)簽或者描述,比如這張圖是哪只貓的名字、年齡之類的。
包含一組 field。field 與實(shí)際對象相對應(yīng)。field 可以是代表對象屬性的結(jié)構(gòu)化數(shù)據(jù),也可以是代表對象特征的向量。primary key 是用于指代一個 entity 的唯一值。
注:你可以自定義 primary key,否則 Milvus 將會自動生成 primary key。請注意,目前 Milvus 不支持 primary key 去重,因此有可能在一個 collection 內(nèi)出現(xiàn) primary key 相同的 entity。
Field(字段)
Entity 的組成部分。??Field?? 可以是結(jié)構(gòu)化數(shù)據(jù),例如數(shù)字和字符串,也可以是向量。
注:Milvus 2.0 現(xiàn)已支持標(biāo)量字段過濾。并且,Milvus 2.0 在一個集合中只支持一個主鍵字段。
Milvus與關(guān)系數(shù)據(jù)庫的對應(yīng)關(guān)系
| Milvus向量數(shù)據(jù)庫 | 關(guān)系型數(shù)據(jù)庫 |
| Collection | 表 |
| Entity | 行 |
| Field | 表字段 |
Partition(分區(qū))
Partition(分區(qū))是Collection(集合)的一個分區(qū)。Milvus 支持將收集數(shù)據(jù)劃分為物理存儲上的多個部分。這個過程稱為分區(qū),每個分區(qū)可以包含多個段。
Segment(分段)
Milvus 在數(shù)據(jù)插入時,通過合并數(shù)據(jù)自動創(chuàng)建的數(shù)據(jù)文件。一個 collection 可以包含多個 segment。一個 segment 可以包含多個 entity。在搜索中,Milvus 會搜索每個 segment,并返回合并后的結(jié)果。
Sharding(分片)
Shard 是指將數(shù)據(jù)寫入操作分散到不同節(jié)點(diǎn)上,使 Milvus 能充分利用集群的并行計(jì)算能力進(jìn)行寫入。默認(rèn)情況下,單個 Collection 包含 2 個分片(Shard)。目前 Milvus 采用基于?主鍵哈希?的分片方式,未來將支持隨機(jī)分片、自定義分片等更加靈活的分片方式。
注:分區(qū)的意義在于通過劃定分區(qū)減少數(shù)據(jù)讀取,而分片的意義在于多臺機(jī)器上并行寫入操作
Index(索引)
索引基于原始數(shù)據(jù)構(gòu)建,可以提高對 collection 數(shù)據(jù)搜索的速度。Milvus 支持多種??索引類型??。為提高查詢性能,你可以為每個向量字段指定一種索引類型。目前,一個向量字段僅支持一種索引類型。切換索引類型時,Milvus 自動刪除之前的索引。
Milvus支持的索引類型主要分為CPU 索引和 GPU 索引兩大類
CPU 索引
- FLAT:執(zhí)行暴力搜索,不構(gòu)建索引,能保證 100% 的召回率,適用于數(shù)據(jù)規(guī)模較小(如百萬級)且對精度要求極高的場景。
- IVF(Inverted File System):通過聚類將向量空間劃分為多個單元,先搜索相關(guān)單元再進(jìn)行精確搜索,適用于大規(guī)模數(shù)據(jù)集的批量查詢。
- HNSW(Hierarchical Navigable Small World):基于圖結(jié)構(gòu)的索引,能實(shí)現(xiàn)高精度和高速度的實(shí)時搜索,是處理高維數(shù)據(jù)的常用選擇。
- DiskANN:一種面向磁盤優(yōu)化的索引,專為處理超大規(guī)模數(shù)據(jù)集設(shè)計(jì),能在有限內(nèi)存下高效檢索。
- ANNOY:基于樹的近似最近鄰搜索索引,適用于中等規(guī)模數(shù)據(jù)的快速檢索。
GPU 索引(利用 NVIDIA GPU 加速,性能遠(yuǎn)超 CPU 索引)
- CAGRA(CUDA Accelerated Graph-based Retrieval Algorithm):Milvus 2.4 新增支持,是 NVIDIA RAFT 庫中最先進(jìn)的 GPU 圖形索引,在小批量和大批量查詢中均表現(xiàn)出壓倒性優(yōu)勢,是當(dāng)前性能最強(qiáng)的索引之一。
- GPU IVF-Flat:基于 GPU 的 IVF-Flat 索引,適用于需要高召回率的場景。
- GPU IVF-PQ:基于 GPU 的 IVF-PQ(Product Quantization)索引,通過量化壓縮數(shù)據(jù),在保證較高精度的同時提升查詢速度。
- GPU 暴搜:Milvus 2.4 還支持 GPU 加速的暴力搜索,性能可提升數(shù)十倍,滿足對召回率要求極高的應(yīng)用。
二、部署環(huán)境介紹
2.1 組件依賴關(guān)系
milvus的運(yùn)行依賴etcd和minio,所以需要優(yōu)先啟動這兩個組件。
- etcd:用來存儲milvus的元數(shù)據(jù)。
- minio:用來存儲milvus的向量數(shù)據(jù)和索引數(shù)據(jù)。
etcd是一個開源、分布式、強(qiáng)一致性的鍵值存儲系統(tǒng),主要用于為分布式系統(tǒng)提供可靠的協(xié)調(diào)服務(wù)。它由CoreOS(后被Red Hat收購)開發(fā),采用Go語言編寫,并基于Raft共識算法實(shí)現(xiàn)數(shù)據(jù)的一致性和高可用性。
etcd 通常用于在分布式系統(tǒng)中進(jìn)行配置管理、服務(wù)發(fā)現(xiàn)、分布式鎖、選舉等任務(wù)。
etcd 的特點(diǎn)包括:
- 分布式一致性:基于 Raft 共識算法,etcd 確保數(shù)據(jù)在分布式環(huán)境中的一致性和可靠性。
- 鍵值存儲:提供類似于 NoSQL 數(shù)據(jù)庫的鍵值對存儲功能。
- 高可用性:通過多節(jié)點(diǎn)部署、自動故障轉(zhuǎn)移等方式提高服務(wù)的可用性。
- 易于使用:提供簡單的 HTTP 和 gRPC API 進(jìn)行數(shù)據(jù)操作。
- 事件通知:支持觀察特定鍵或鍵前綴的變化,并通過事件通知客戶端。
2.2 圖形化管理工具
2.3 本地運(yùn)行環(huán)境
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
三、部署執(zhí)行步驟
3.1 準(zhǔn)備所需的鏡像文件
- 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 依次導(dǎo)入所需鏡像文件
- 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內(nèi)容如下
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: milvus3.4 編寫attu部署使用的docker-compose.yml文件
attu-docker-compose.yml內(nèi)容如下
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 創(chuàng)建部署目錄
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 依次啟動服務(wù)
依次進(jìn)入工作目錄啟動milvus、attu服務(wù)
cd milvus-standalone docker-compose up -d cd ../milvus-attu
3.7 檢查服務(wù)運(yùn)行狀態(tài)
1)執(zhí)行docker ps -a,查看容器狀態(tài)

2)執(zhí)行docker logs -f milvus-standalone,查看milvus服務(wù)狀態(tài)

2)訪問http://127.0.0.1:9091/healthz,檢查milvus健康狀態(tài)

顯示OK即為正常
3)訪問http://127.0.0.1:8000,檢查attu的服務(wù)狀態(tài)

可以連上milvus并能顯示信息即可。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker部署ruoyi項(xiàng)目的詳細(xì)步驟
這篇文章主要介紹了docker部署ruoyi項(xiàng)目的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2025-06-06
dockerfile構(gòu)建任意java鏡像的實(shí)現(xiàn)示例
本文主要介紹了dockerfile構(gòu)建任意java鏡像的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-09-09
解決docker啟動容器錯誤:docker:Error response from dae
這篇文章主要介紹了解決docker啟動容器錯誤:docker:Error response from daemon:OCI runtime create failed問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
K8s集群重啟與恢復(fù)-Node節(jié)點(diǎn)啟停方式
這篇文章主要介紹了K8s集群重啟與恢復(fù)-Node節(jié)點(diǎn)啟停方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08

