ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Milvus离线部署整合包:向量数据库内网安装与备份实战

Milvus离线部署整合包:向量数据库内网安装与备份实战

简介:milvus-standalone2.5.4.zip是面向向量数据库开发者与数据科学家的单节点离线安装包,用于在无外网环境下快速搭建Milvus 2.5.4运行环境,解决大规模特征向量检索与相似度搜索的部署需求。压缩包共10个文件,约779.13MB,以gz镜像包、yml/yaml编排配置、milvus-backup备份工具、mc客户端及Python脚本为主,另含requirements.txt依赖清单,覆盖服务启动、数据备份与对象存储对接等环节。包内集成milvus-backup与minio-binaries,无需单独下载MinIO即可完成数据持久化与恢复配置,适合开发调试及小规模应用场景。目前已有1372人学习下载。借助该包,读者可一站式获得可独立运行的Milvus环境、备份恢复工具链与容器编排模板,快速验证索引算法、查询优化及API集成流程,降低离线部署与运维门槛。

1. 离线环境下的向量数据库落地:为什么这个整合包值得关注

内网服务器上要跑向量检索,最头疼的往往不是算法调参,而是装不上。Docker Hub 拉不动、MinIO 的二进制下不来、备份工具还得单独找版本匹配的包——一圈折腾下来,半天就没了。这个milvus-standalone2.5.4.zip离线安装包解决的正是这个问题:它把 Milvus 单机版 2.5.4 的核心组件、milvus-backup备份工具和minio-binaries对象存储二进制打包在一起,解压即用,不需要联网拉镜像。适合在隔离网络、内网测试环境或边缘节点上部署向量检索服务的从业者,尤其是做 RAG 应用、语义搜索、推荐召回这类需要快速验证 Milvus 能力的场景。下面按实际拆包和部署的顺序,把每一步的命令、参数和容易翻车的地方讲清楚。

2. 拆包与目录结构:先搞清楚每个文件干什么

2.1 解压后的目录布局与组件职责

拿到 zip 之后别急着docker compose up,先看一眼里面有什么。常见做法是:

unzip milvus-standalone2.5.4.zip -d milvus-offline cd milvus-offline find . -maxdepth 2 -type d | sort

典型输出会包含这几个关键目录:

目录/文件作用是否必须
milvus-standalone/Milvus 核心服务,含docker-compose.yml是
milvus-backup/备份恢复工具,独立二进制按需
minio-binaries/MinIO 服务端与客户端二进制是(Milvus 依赖对象存储)
etcd/或内嵌配置元数据存储是
images/或*.tar离线镜像归档是

Milvus 单机版依赖三个东西:etcd 存元数据、MinIO 存向量和索引文件、Milvus 本体做计算。这个包把 MinIO 的二进制单独放出来,意味着你可以不用 Docker 跑 MinIO,直接在宿主机起进程,省一层网络转发。milvus-backup则是官方备份工具,支持按 collection 粒度导出和恢复,做迁移或定期快照时比直接拷数据目录靠谱得多。

2.2 离线镜像的加载与校验

如果包里是*.tar格式的镜像归档,需要先 load 进本地 Docker:

# 查看镜像归档文件 ls -lh images/ # 逐个加载,注意文件名要和实际一致 docker load -i images/milvus-standalone-2.5.4.tar docker load -i images/minio.tar docker load -i images/etcd.tar # 确认镜像已就位 docker images | grep -E "milvus|minio|etcd"

加载完成后,docker images里应该能看到milvusdb/milvus:v2.5.4、minio/minio和quay.io/coreos/etcd对应的条目。这里有个细节:离线包的镜像 tag 可能和 compose 文件里写的不完全一致,如果docker compose up报image not found,先对比一下 compose 里的 image 字段和本地实际 tag,用docker tag补一个别名即可。

注意:加载镜像前确认磁盘剩余空间,Milvus 单机版镜像解压后通常在 1GB 以上,加上 MinIO 和 etcd,预留 5GB 比较稳妥。

2.3 docker-compose 配置的离线适配

离线环境和在线环境最大的区别在 compose 文件里。打开milvus-standalone/docker-compose.yml,重点看三处:

services: 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 volumes: - ./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 minio: image: minio/minio:RELEASE.2023-03-20T20-16-18Z environment: MINIO_ACCESS_KEY: minioadmin MINIO_SECRET_KEY: minioadmin volumes: - ./volumes/minio:/minio_data command: minio server /minio_data --console-address ":9001" standalone: image: milvusdb/milvus:v2.5.4 command: ["milvus", "run", "standalone"] environment: ETCD_ENDPOINTS: etcd:2379 MINIO_ADDRESS: minio:9000 volumes: - ./volumes/milvus:/var/lib/milvus ports: - "19530:19530" - "9091:9091" depends_on: - etcd - minio

三个参数值得留意:ETCD_QUOTA_BACKEND_BYTES默认 4GB,如果元数据量大要往上调;MINIO_ACCESS_KEY和MINIO_SECRET_KEY在离线环境里建议改掉默认值,别用 minioadmin;standalone的ports里 19530 是 SDK 连接端口,9091 是健康检查和 metrics 端口。改完配置后,docker compose up -d启动,再用docker compose ps确认三个容器都是running状态。

3. milvus-backup 工具实战:备份、恢复与跨实例迁移

3.1 备份工具的配置与连接参数

milvus-backup是独立二进制,不依赖 Docker,直接跑在宿主机上。它通过 Milvus 的 SDK 端口连接,同时需要能访问 MinIO 的存储桶。先准备配置文件:

# backup.yaml milvus: address: 127.0.0.1 port: 19530 authorizationEnabled: false minio: address: 127.0.0.1 port: 9000 accessKeyID: minioadmin secretAccessKey: minioadmin useSSL: false bucketName: milvus-backup

几个参数的含义:address和port指向 Milvus 的 gRPC 端口,默认 19530;bucketName是备份数据实际存放的 MinIO 桶,如果不存在,工具会自动创建。authorizationEnabled在没开鉴权时保持 false,开了 RBAC 再改成 true 并补 token。

3.2 创建备份与恢复的完整命令

配置就绪后,备份一个 collection 的命令是:

# 创建备份,指定备份名称和 collection ./milvus-backup create -n my_backup_202501 -c my_collection # 查看已有备份列表 ./milvus-backup list # 恢复到目标实例(可以是同一个 Milvus,也可以是另一个) ./milvus-backup restore -n my_backup_202501 -c my_collection_restored

create的-n是备份名,-c是 collection 名,不指定-c则备份整个实例。restore的-c是恢复后的新 collection 名,如果目标已有同名 collection 会报错,需要先 drop 或换名。这里有个血泪经验:备份时 Milvus 的写入不会暂停,如果备份期间有大量 insert,恢复出来的数据可能和备份时刻有细微偏差。对一致性要求高的场景,建议在业务低峰期做,或者先停写再备份。

3.3 跨实例迁移的注意事项

把备份从 A 实例迁到 B 实例,核心是让 B 能访问到 A 的备份数据。两种做法:一是把 A 的 MinIO 桶整个同步到 B 的 MinIO,二是让 B 的 backup 工具直接指向 A 的 MinIO 地址。第二种更简单:

# 在 B 实例的 backup.yaml 里,minio 地址指向 A 的 MinIO minio: address: 192.168.1.100 # A 实例的 MinIO IP port: 9000 accessKeyID: minioadmin secretAccessKey: minioadmin bucketName: milvus-backup

然后./milvus-backup restore -n my_backup_202501即可。注意两个实例的 Milvus 版本要一致或兼容,2.5.4 的备份恢复到 2.4.x 上大概率失败,版本对齐是前提。

4. MinIO 二进制独立部署:绕开 Docker 的轻量方案

4.1 为什么单独用 minio-binaries

包里把 MinIO 二进制单独拎出来,用意很明显:有些环境不让跑 Docker,或者 Docker 资源开销太大。MinIO 单进程跑起来内存占用不到 100MB,比容器化省不少。启动命令:

# 赋予执行权限 chmod +x minio-binaries/minio # 指定数据目录和控制台端口启动 ./minio-binaries/minio server /data/minio --console-address ":9001" \ --address ":9000"

--address是 S3 API 端口,Milvus 通过这个端口读写对象存储;--console-address是 Web 控制台,用来查看桶和文件。启动后浏览器访问http://IP:9001,默认账号密码是minioadmin/minioadmin,生产环境务必改掉。

4.2 与 Milvus 的对接配置

MinIO 独立跑起来后,Milvus 的 compose 文件里要把MINIO_ADDRESS从minio:9000改成宿主机的 IP 和端口:

environment: MINIO_ADDRESS: 192.168.1.100:9000 MINIO_ACCESS_KEY: your_access_key MINIO_SECRET_KEY: your_secret_key

如果 Milvus 跑在 Docker 里而 MinIO 跑在宿主机,用host.docker.internal代替 IP 在某些系统上更稳,但 Linux 下需要加extra_hosts映射。我一般直接写宿主机局域网 IP,省去 DNS 解析的玄学问题。

4.3 存储桶的预创建与权限

Milvus 启动时会自动创建所需的桶,但如果 MinIO 的权限配置不对,会卡在启动阶段。手动预创建更可控:

# 用 mc 客户端创建桶(mc 也在 minio-binaries 里) ./minio-binaries/mc alias set local http://127.0.0.1:9000 minioadmin minioadmin ./minio-binaries/mc mb local/milvus-bucket ./minio-binaries/mc mb local/milvus-backup

mc alias set是配置一个连接别名,后续操作都用local指代这个 MinIO。mb是 make bucket。创建完用mc ls local确认。Milvus 默认用的桶名是a-bucket,如果不想改配置,直接建这个名也行。

5. 避坑与排查:离线部署中最容易翻车的五个点

5.1 容器启动后 Milvus 反复重启

现象:docker compose ps里 standalone 容器状态是restarting,日志报failed to connect to etcd或minio。

原因:compose 的depends_on只保证启动顺序,不保证服务就绪。etcd 和 MinIO 还没完全起来,Milvus 就去连,连不上就退出重启。

解决:在 compose 里给 etcd 和 minio 加 healthcheck,或者手动先起 etcd 和 minio,等 10 秒再起 standalone。简单做法是docker compose up -d etcd minio,确认这两个稳定后再docker compose up -d standalone。

5.2 备份工具报bucket not found

现象:milvus-backup create时报错,提示 MinIO 里找不到配置的桶。

原因:backup.yaml 里的bucketName写了一个不存在的桶,工具在某些版本不会自动创建。

解决:先用mc mb手动建桶,或者把bucketName改成已存在的桶名。另外确认accessKeyID和secretAccessKey和 MinIO 启动时设置的一致。

5.3 镜像加载后 tag 不匹配

现象:docker compose up报image milvusdb/milvus:v2.5.4 not found,但docker images里明明有。

原因:离线包里的镜像 tag 可能是v2.5.4-amd64或带其他后缀,和 compose 里写的v2.5.4对不上。

解决:docker tag 实际tag 期望tag补一个别名。比如docker tag milvusdb/milvus:v2.5.4-amd64 milvusdb/milvus:v2.5.4。

5.4 端口冲突导致启动失败

现象:MinIO 或 Milvus 容器起不来,日志报bind: address already in use。

原因:宿主机上 9000、9001、19530、9091、2379 这些端口被其他服务占了。

解决:ss -tlnp | grep -E "9000|9001|19530|9091|2379"查占用,改 compose 里的端口映射,比如"29530:19530",同时记得改 backup.yaml 里的连接端口。

5.5 数据目录权限问题

现象:容器启动后立刻退出,日志报permission denied写/var/lib/milvus或/minio_data。

原因:Docker 容器内进程的 UID 和宿主机挂载目录的权限不匹配。

解决:chmod -R 777 ./volumes临时放开权限,或者用chown -R 1000:1000 ./volumes把目录归属改成容器内用户。生产环境建议后者,别用 777。

6. 进阶技巧:用 backup 工具做定时快照与版本回滚

milvus-backup除了手动执行,还能配合 cron 做定时快照。我一般会写一个简单的 shell 脚本,每天凌晨跑一次,备份名带日期,保留最近 7 天:

#!/bin/bash # daily_backup.sh BACKUP_NAME="auto_$(date +%Y%m%d)" BACKUP_DIR="/opt/milvus-backup" RETENTION_DAYS=7 cd $BACKUP_DIR # 创建当日备份 ./milvus-backup create -n $BACKUP_NAME # 清理超过保留期的备份 ./milvus-backup list | grep "auto_" | while read line; do name=$(echo $line | awk '{print $1}') backup_date=$(echo $name | sed 's/auto_//') if [ $(date -d "$backup_date" +%s) -lt $(date -d "-${RETENTION_DAYS} days" +%s) ]; then ./milvus-backup delete -n $name fi done

这个脚本的关键点:备份名用auto_日期格式,方便解析;milvus-backup delete删除旧备份释放 MinIO 空间。注意list的输出格式在不同版本可能有差异,跑之前先手动执行一次确认字段位置。

回滚的时候,先./milvus-backup restore -n auto_20250101 -c my_collection_rollback,恢复到一个新 collection,验证数据没问题后再用ALTER COLLECTION或重建的方式切换。别直接覆盖原 collection,万一恢复出来的数据有问题,连后悔药都没了。

还有一个技巧:如果只是想验证备份文件是否完整,不用真的恢复,用./milvus-backup get -n auto_20250101查看备份的元信息,包括 collection 列表、行数、索引类型。这个命令很快,适合在恢复前做一次 sanity check。

从那以后我每次做离线部署,都强制走一遍「先起 etcd 和 minio → 确认健康 → 再起 milvus → 最后跑一次 backup list」的流程,看起来多花两分钟,但能省掉后面排查容器反复重启的半小时。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进