一、Milvus简介
Milvus(Milvus | High-Performance Vector Database Built for Scale,https://milvus.io/,官网https://milvus.io/) 是由 Zilliz 公司开发的开源向量数据库,专为高效处理非结构化数据(如图像、视频、音频)的向量化存储与检索而设计。它采用云原生架构,支持存储计算分离和 Kubernetes 部署,能弹性扩展至百亿级向量规模。
核心特性
高性能检索
支持 GPU 加速和多种索引算法(如 CAGRA、HNSW),实现毫秒级近似最近邻搜索。例如三维向量相似性搜索可快速定位最接近目标的数据点。混合查询能力
支持同时筛选向量相似度和结构化字段,如查找相似图片时限定特定类别标签- 开发友好性
- 提供 Python/Java/Go 等多语言 SDK
- 轻量版 Milvus Lite 支持
pip install快速部署 - 兼容 PyTorch 等主流框架
应用场景
- 非结构化数据:如文本、语音、图像、视频等,通过嵌入技术转化为向量后存储。
- 人工智能:在聊天机器人、网络搜索等场景中实现相似度检索。
架构特点
- 分层设计:分为接入层、协调服务层、工作节点和存储层,各层独立扩展和容灾。
- 共享存储:计算节点与存储分离,支持数据持久化和增量数据摄取
二、环境准备
Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-144-generic x86_64)
2.1.配置soures.list,可以直接去编辑/etc/apt/sources.list,也可以参考下面的命令
#将主软件源地址替换为阿里云镜像 sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list #将安全更新源替换为阿里云镜像 sudo sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list sudo apt-get update2.2.安装docker
2.2.1.下载docker的deb
wget https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/dists/jammy/pool/stable/amd64/containerd.io_1.7.26-1_amd64.deb wget https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-ce_28.0.2-1~ubuntu.22.04~jammy_amd64.deb wget https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-ce-cli_28.0.2-1~ubuntu.22.04~jammy_amd64.deb wget https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-buildx-plugin_0.22.0-1~ubuntu.22.04~jammy_amd64.deb wget https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-compose-plugin_2.34.0-1~ubuntu.22.04~jammy_amd64.deb2.2.2.安装docker命令如下:
dpkg -i ./containerd.io_1.7.26-1_amd64.deb ./docker-ce_28.0.2-1~ubuntu.22.04~jammy_amd64.deb ./docker-ce-cli_28.0.2-1~ubuntu.22.04~jammy_amd64.deb ./docker-buildx-plugin_0.22.0-1~ubuntu.22.04~jammy_amd64.deb ./docker-compose-plugin_2.34.0-1~ubuntu.22.04~jammy_amd64.deb #或者命令 dpkg -i *.deb安装后的版本信息如下
docker compose version #Docker Compose version v2.34.0 docker version #Client: Docker Engine - Community # Version: 28.0.2 # API version: 1.48 # Go version: go1.23.7 # Git commit: 0442a73 # Built: Wed Mar 19 14:36:46 2025 # OS/Arch: linux/amd64 # Context: default # #Server: Docker Engine - Community # Engine: # Version: 28.0.2 # API version: 1.48 (minimum version 1.24) # Go version: go1.23.7 # Git commit: bea4de2 # Built: Wed Mar 19 14:36:46 2025 # OS/Arch: linux/amd64 # Experimental: false # containerd: # Version: 1.7.26 # GitCommit: 753481ec61c7c8955a23d6ff7bc8e4daed455734 # runc: # Version: 1.2.5 # GitCommit: v1.2.5-0-g59923ef # docker-init: # Version: 0.19.0 # GitCommit: de40ad02.3.3 配置/etc/docker/daemon.json
#cat /etc/docker/daemon.json { "registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.nju.edu.cn", "https://hub-mirror.c.163.com", "https://registry.docker-cn.com" ] } #重启docker systemctl restart docker || service docker restart #查看docker运行状态 systemctl status docker #●docker.service - Docker Application Container Engine # Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: #enabled) # Active: active (running) since Mon 2025-08-18 08:42:46 CST; 1h 19min ago #TriggeredBy: ● docker.socket三、安装Milvus
3.1.1下载脚本
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh3.1.2 运行
./standalone_embed.sh start #Milvus is running.遇到的问题:
错误1:/standalone_embed.sh start
#./standalone_embed.sh please use bash standalone_embed.sh restart|start|stop|upgrade|delete root@iZ2zefmyqi46e90ttn3odtZ:~/docker# ./standalone_embed.sh start Unable to find image 'milvusdb/milvus:v2.6.0' locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded Run 'docker run --help' for more information Start failed.原因是/ /etc/docker/daemon.json里面配置的源地址不能用,建议采用科学上网的模式,因为那些镜像的服务器说不定哪天会抽风。修改daemon.json文件后,需要重启一下服务
sudo systemctl daemon-reload sudo systemctl restart docker sudo systemctl status docker问题2:如果打不开,自己新建一个standalone_embed.sh
,直接复制下面的内容:
#!/usr/bin/env bash # Licensed to the LF AI & Data foundation under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. run_embed() { cat << EOF > embedEtcd.yaml listen-client-urls: http://0.0.0.0:2379 advertise-client-urls: http://0.0.0.0:2379 quota-backend-bytes: 4294967296 auto-compaction-mode: revision auto-compaction-retention: '1000' EOF cat << EOF > user.yaml # Extra config to override default milvus.yaml EOF if [ ! -f "./embedEtcd.yaml" ] then echo "embedEtcd.yaml file does not exist. Please try to create it in the current directory." exit 1 fi if [ ! -f "./user.yaml" ] then echo "user.yaml file does not exist. Please try to create it in the current directory." exit 1 fi sudo docker run -d \ --name milvus-standalone \ --security-opt seccomp:unconfined \ -e ETCD_USE_EMBED=true \ -e ETCD_DATA_DIR=/var/lib/milvus/etcd \ -e ETCD_CONFIG_PATH=/milvus/configs/embedEtcd.yaml \ -e COMMON_STORAGETYPE=local \ -e DEPLOY_MODE=STANDALONE \ -v $(pwd)/volumes/milvus:/var/lib/milvus \ -v $(pwd)/embedEtcd.yaml:/milvus/configs/embedEtcd.yaml \ -v $(pwd)/user.yaml:/milvus/configs/user.yaml \ -p 19530:19530 \ -p 9091:9091 \ -p 2379:2379 \ --health-cmd="curl -f http://localhost:9091/healthz" \ --health-interval=30s \ --health-start-period=90s \ --health-timeout=20s \ --health-retries=3 \ milvusdb/milvus:v2.6.0 \ milvus run standalone 1> /dev/null } wait_for_milvus_running() { echo "Wait for Milvus Starting..." while true do res=`sudo docker ps|grep milvus-standalone|grep healthy|wc -l` if [ $res -eq 1 ] then echo "Start successfully." echo "To change the default Milvus configuration, add your settings to the user.yaml file and then restart the service." break fi sleep 1 done } start() { res=`sudo docker ps|grep milvus-standalone|grep healthy|wc -l` if [ $res -eq 1 ] then echo "Milvus is running." exit 0 fi res=`sudo docker ps -a|grep milvus-standalone|wc -l` if [ $res -eq 1 ] then sudo docker start milvus-standalone 1> /dev/null else run_embed fi if [ $? -ne 0 ] then echo "Start failed." exit 1 fi wait_for_milvus_running } stop() { sudo docker stop milvus-standalone 1> /dev/null if [ $? -ne 0 ] then echo "Stop failed." exit 1 fi echo "Stop successfully." } delete_container() { res=`sudo docker ps|grep milvus-standalone|wc -l` if [ $res -eq 1 ] then echo "Please stop Milvus service before delete." exit 1 fi sudo docker rm milvus-standalone 1> /dev/null if [ $? -ne 0 ] then echo "Delete milvus container failed." exit 1 fi echo "Delete milvus container successfully." } delete() { read -p "Please confirm if you'd like to proceed with the delete. This operation will delete the container and data. Confirm with 'y' for yes or 'n' for no. > " check if [ "$check" == "y" ] ||[ "$check" == "Y" ];then delete_container sudo rm -rf $(pwd)/volumes sudo rm -rf $(pwd)/embedEtcd.yaml sudo rm -rf $(pwd)/user.yaml echo "Delete successfully." else echo "Exit delete" exit 0 fi } upgrade() { read -p "Please confirm if you'd like to proceed with the upgrade. The default will be to the latest version. Confirm with 'y' for yes or 'n' for no. > " check if [ "$check" == "y" ] ||[ "$check" == "Y" ];then res=`sudo docker ps -a|grep milvus-standalone|wc -l` if [ $res -eq 1 ] then stop delete_container fi curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed_latest.sh && \ bash standalone_embed_latest.sh start 1> /dev/null && \ echo "Upgrade successfully." else echo "Exit upgrade" exit 0 fi } case $1 in restart) stop start ;; start) start ;; stop) stop ;; upgrade) upgrade ;; delete) delete ;; *) echo "please use bash standalone_embed.sh restart|start|stop|upgrade|delete" ;; esac