一、Milvus简介

Milvus(Milvus | High-Performance Vector Database Built for Scalehttps://milvus.io/,官网https://milvus.io/) 是由 Zilliz 公司开发的‌开源向量数据库‌,专为高效处理非结构化数据(如图像、视频、音频)的向量化存储与检索而设计‌。它采用云原生架构,支持存储计算分离和 Kubernetes 部署,能弹性扩展至百亿级向量规模‌。

核心特性

  1. ‌高性能检索‌
    支持 GPU 加速和多种索引算法(如 CAGRA、HNSW),实现毫秒级近似最近邻搜索‌。例如三维向量相似性搜索可快速定位最接近目标的数据点‌。

  2. ‌混合查询能力‌
    支持同时筛选向量相似度和结构化字段,如查找相似图片时限定特定类别标签‌

  3. ‌开发友好性‌
  4. 提供 Python/Java/Go 等多语言 SDK
  5. 轻量版 Milvus Lite 支持 pip install 快速部署‌
  6. 兼容 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 update

2.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.deb
 

2.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:        de40ad0

2.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.sh

3.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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐