尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Docker部署Milvus实战:从零搭建RAG向量数据库

Docker部署Milvus实战:从零搭建RAG向量数据库 过去两个月里我一直在折腾 RAG 相关的知识库方案先后试过好几款向量数据库最后把生产环境的底座定在了 Milvus 上部署方式直接用 Docker Compose 拉一套单机版。说句实在话Milvus 这家伙单看架构会觉得有点重——一堆组件拉起来要协调但用 Docker 落地之后反而成了我目前维护成本最低的一个服务。如果你正准备给知识库、语义检索或者推荐系统找个向量数据库或者已经在 Milvus 和别的方案之间来回摇摆这篇文章应该能帮你少走不少弯路。这篇文章我会从零开始把 Docker 部署 Milvus 的完整流程、每个关键配置背后的逻辑、我实际操作中踩过的坑以及怎么排查一次性讲清楚。适合刚接触向量数据库的新手也适合已经用过一段时间、想回头梳理部署细节的人参考。1. 先搞清楚Milvus 到底解决什么问题以及为什么用 Docker 部署1.1 向量数据库和大模型的伴生关系先别急着敲命令我们得先形成一个共识——你为什么要用向量数据库在过去一两年大模型应用爆发的过程里一个非常典型的痛点是模型的知识截止时间有限它不知道你私域里的资料但你也不可能把整个资料库塞进上下文成本和技术上都不现实。于是 RAG检索增强生成这套玩法火了起来先把文档切块、做 embedding得到一堆高维向量查询时把用户问题也转成向量然后去数据库里找最相似的几个片段再把这些片段交还给大模型做答案生成。而找相似向量的过程本质上是海量高维空间里的最近邻搜索。普通的关系型数据库和 Elasticsearch 虽然也能存向量但在几百万、上千万条向量的场景下简单暴力的全量计算就是自杀。Milvus 这类专门的向量数据库会对向量做索引比如 IVF、HNSW、DiskANN让检索速度提升几个数量级同时还能兼顾标量过滤、混合检索这些需求。我之前在 50 万条 768 维向量上用 HNSW 索引实测单次 top-10 查询基本在个位数毫秒级别这体验是传统方案给不了的。1.2 为什么选择 Docker 而不是裸机安装Milvus 当前主流的架构分两个形态一个是 milvus-standalone单机版另一个是 milvus-cluster分布式集群版。单机版虽然名字叫“单机”但它内部依然依赖三个核心组件milvus 主服务、etcd元数据管理和 MinIO存储。你要是裸机安装意味着得自己分别装好这三个东西版本还得匹配升级维护都是负担。Docker 的出现把这些问题都收拢了。官方提供了编排好的 Docker Compose 配置文件一条 docker compose up -d 就能把三个组件全部拉起来。升级时直接拉新镜像重建容器就行回滚时切换 tag 也很快。尤其对于个人开发者或者中小企业一台 16G 内存的 Linux 服务器或者性能好点的 Windows 笔记本配合 Docker Desktop 就能把整个向量数据库平台跑起来这比维护三套独立进程舒服太多了。1.3 当前版本的选择思路Milvus 的版本迭代速度不算慢写这篇文章时最新的 release 系列是 2.4.x 和 2.5.x。2.4 引入了很多实用性功能比如 BoolExprQuery、Array 字段支持增强、更灵活的分区管理2.5 在检索性能和资源控制上又做了一些优化。如果是从零开始的新项目建议直接上 2.4 以上的版本镜像 tag 用 milvusdb/milvus:v2.4.x 这种具体版本号而不是 latest。为什么要锁版本因为向量数据库承载的是数据一旦升级出兼容性问题重建索引的代价很高。我在测试环境吃过一次亏用 latest 部署后两周没管再一拉镜像发现版本已经跳了两个小版本又不敢轻易动生产数据很被动。所以凡是带存储的服务建议都用固定 tag。2. 环境准备Docker、Compose 和资源配置的那些事2.1 安装 Docker 的底层准备部署 Milvus 之前先确保 Docker 本体是健康的。这里我分开讲 Linux 和 Windows 两种常见场景。Linux 服务器上安装 Docker一般是用官方脚本或者包管理器。以 Ubuntu 为例你可以用 apt 装也可以执行官方提供的 get.docker.com 脚本。装完之后有一个很容易被忽略的坑docker 命令需要 root 权限。如果你不想每次都用 sudo就把当前用户加到 docker 用户组里sudo usermod -aG docker $USER newgrp docker做完这一步再执行 docker info如果输出里没有报权限错误就说明 Docker 环境可用。这里要特别提醒加入 docker 用户组等同于授予该用户等同于 root 的可控权限所以在生产服务器上要慎重别为了省事给普通业务账号也加上。Windows 上基本就是安装 Docker Desktop但有一个前置条件经常把人卡住——Windows 的虚拟化支持必须开启。你可能会在启动 Docker Desktop 时看到“Docker Desktop failed to start because virtualisation support wasnt detected”之类的报错。这个问题的根源一般是 BIOS 里的虚拟化开关没打开或者是 Hyper-V / WSL2 相关功能没有启用。解决办法是在 BIOS 里找到 Intel VT-x 或 AMD SVM 并把状态改为 Enabled然后在 Windows 功能里勾选“适用于 Linux 的 Windows 子系统”和“虚拟机平台”最后重启系统。还有一个更隐蔽的问题出现在 Windows 上Docker Desktop 启动后客户端提示 “failed to connect to the docker api at npipe:////./pipe/dockerDesktopLinuxEngine” 这种。遇到这个报错十有八九是 Docker Engine 还没有完全启动或者被安全软件拦了。我的排查顺序是先看 Docker Desktop 的小鲸鱼图标是不是稳定状态如果不是就重启 Docker Desktop如果重启没用就去 Windows 服务里确认两个关键服务——LxssManager 和 vmcompute 的状态把 Docker Desktop 以管理员身份运行通常也能解决掉一部分权限类问题。2.2 Docker Compose 是必选项而非可选项Milvus 官方提供的部署方式就是基于 Docker Compose 的所以这个工具必须装好。新版 Docker Desktop 已经内置了 docker compose 插件直接 docker compose version 验证即可。Linux 上如果你是用官方脚本装的 Docker Enginecompose 插件不一定自带需要单独安装。装好后同样验证一下版本。这里顺便提一嘴如果你在用老的 docker-compose带横杠的独立二进制命令格式是 docker-compose up -d如果你用的是 docker compose 插件命令格式是 docker compose up -d。两者区别不只是多一个空格版本解析和部分参数行为也有差异。建议统一用新版插件别混用否则你写好的 yml 文件可能在换机器执行时出问题。2.3 资源规划内存、CPU、磁盘的基本盘Milvus 单机版的资源消耗主要来自三个地方etcd 需要一点内存MinIO 需要一点内存真正吃内存的是 milvus 主进程——尤其是你启用了 HNSW 索引或者向量规模较大的时候。我个人的经验阈值是单纯 demo 的话8G 内存的机器勉强能跑想在 100 万向量级别做正式性能测试16G 内存起步生产环境建议 32G 以上并且给 Docker 分配至少 16G 内存。磁盘方面别忽略 MinIO 的存储占用。向量数据本身加上原始日志、segment 文件消耗量比裸向量文件还要多出不少。建议给 Milvus 单独挂一个数据目录而且这个目录所在的磁盘要够快。SSD 是必须的机械硬盘跑 HNSW 构建索引时那个速度能把人急死。我在一台云服务器上用普通云盘跑 50 万条数据的索引构建花了快两小时后来换到 SSD 盘同样规模十分钟出头就完成了。CPU 核心数也会直接影响索引构建速度但这方面不用太焦虑4 核起步8 核体验就非常顺滑了。如果你只是写个小 demo 验证功能2 核也能跑就是索引构建慢点而已。2.4 镜像加速与拉取失败的处理因为网络环境的特殊性国内服务器拉取 Docker Hub 镜像经常超时。我所在的网络环境拉 milvusdb/milvus 这个几 GB 级别的大镜像时如果不用加速器基本是要随缘的。这里建议大家配置镜像加速器。配置方法是在 Docker 的 daemon.json 里加上 registry-mirrors 配置{ registry-mirrors: [https://docker.m.daocloud.io] }配置完重启 Docker 服务再拉镜像就快不少。不过也要提醒一句镜像加速器这玩意儿有时效性不同服务商的稳定程度也不一样如果哪天拉不动了换一个可用的源就行。3. 核心环节Milvus 安装完整实操步骤3.1 获取官方 Compose 文件Milvus 官方安装文档里提供了一个快速脚本它会自动下载对应版本的 docker-compose.yml 文件。这个文件里定义了四个关键部分etcd、minio、standalone即 milvus 主服务以及一个可选的 attu 可视化工具新版用 attu 替代了旧版的 milvus-insight。我在实际部署时没有直接用官方脚本而是手动创建目录、下载配置并做了定制修改。我的习惯是建一个专用目录mkdir -p /opt/milvus cd /opt/milvus wget https://github.com/milvus-io/milvus/releases/download/v2.4.13/milvus-standalone-docker-compose.yml -O docker-compose.yml如果你是外网访问 GitHub 不方便可以先去官网文档页面复制对应 yml 内容在服务器上手动创建文件粘贴进去效果是一样的。3.2 逐个拆解 Compose 文件的关键配置打开这个 docker-compose.yml核心结构大概是这样的version: 3.5 services: etcd: container_name: milvus-etcd image: quay.io/coreos/etcd:v3.5.5 environment: - ETCD_AUTO_COMPACTION_MODErevision - ETCD_AUTO_COMPACTION_RETENTION1000 - ETCD_QUOTA_BACKEND_BYTES4294967296 - ETCD_SNAPSHOT_COUNT50000 volumes: - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd command: etcd -advertise-client-urlshttp://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-03-20T20-16-18Z environment: MINIO_ACCESS_KEY: minioadmin MINIO_SECRET_KEY: minioadmin volumes: - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data command: minio server /minio_data 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.4.13 command: [milvus, run, standalone] security_ctx: - seccomp:unconfined 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这里的几个细节非常关键。etcd 是 Milvus 的元数据存储负责记录 collection、partition、segment 等元信息它的健康和稳定直接决定 Milvus 的可用性。MinIO 用来存向量数据和索引文件。standalone 则是真正干活的组件。端口方面19530 是 Milvus 的 gRPC 端口所有客户端 SDK 都走这个端口9091 是健康检查和管理端口。官方 Compose 还把 9000 和 2379 都映射出来了但生产环境下建议不要暴露 etcd 和 MinIO 的端口到公网只暴露 19530 就行。在环境变量里ETCD_ENDPOINTS 设置为 etcd:2379、MINIO_ADDRESS 设置为 minio:9000这是 Docker 内部网络的服务名解析。也就是说milvus-standalone 容器是通过容器名去访问 etcd 和 minio 的而不是通过 localhost。这个机制是 Docker Compose 默认创建的 bridge 网络提供的所以在同一个 compose 文件里的服务可以互相用服务名访问。3.3 正式启动与验证配置就绪后在 yml 文件所在目录执行docker compose up -d第一次执行会拉取镜像几个镜像加起来可能有好几个 GB需要耐心等一会儿。拉取完成后容器开始启动。这时候用 docker compose ps 查看当前状态正常情况下 etcd、minio、standalone 都会显示 Uphealthy或者至少处于 Up 状态。Milvus 主容器从启动到真正可用通常需要一段时间因为初始化要连接 etcd、检查 MinIO、创建内部存储结构。官方 Compose 里给 standalone 设置了 start_period: 90s 的健康检查意思是最多等 90 秒才会标记为健康。所以如果刚启动完就看到 unhealthy 状态别急着折腾多等一两分钟再 docker compose ps 看一次效果会好很多。等三个服务都健康了再确认端口监听ss -tlnp | grep -E 19530|9091能看到 19530 端口有进程监听基本就可以判断服务起来了。为了进一步验证我一般直接用一个很小的 Python 脚本试连接from pymilvus import connections connections.connect(aliasdefault, hostlocalhost, port19530) print(连接成功)能打印出连接成功说明 Milvus 对外服务正常。3.4 启用 Attu 可视化面板纯命令行操作 Milvus 当然可以但很多时候人眼能看到数据状态、索引状态、查询性能会踏实很多。Attu 是 Milvus 官方提供的可视化工具部署方式可以直接作为独立容器跑。官方新版 Compose 里也包含了 attu 服务配置大致如下attu: container_name: attu image: zilliz/attu:v2.4 environment: MILVUS_URL: http://standalone:19530 ports: - 3000:3000 depends_on: - standalone启动后浏览器访问 http://localhost:3000界面里会要求填 Milvus 地址填 http://localhost:19530 即可。Attu 里可以直接建 collection、插入数据、建索引、跑查询对前期调试非常有帮助。我个人习惯是在容器刚部署完的时候先开 Attu 看一眼数据状态确认索引构建进度再回到代码里做业务逻辑。4. 初始化配置与核心场景落地4.1 Collection、分区和索引设计的核心思路Milvus 的顶层数据结构是 Collection你可以把它理解成关系型数据库里的一张表。每个 Collection 必须指定向量字段的维度这个维度必须和你用的 embedding 模型输出维度一致。比如你用 OpenAI 的 text-embedding-3-small向量维度是 1536你用 BGE-M3默认输出是 1024你用开源的 text2vec-large-chinese那可能是 1024 或 768具体看模型说明。维度设置错了插入数据就会失败。索引类型的选择直接决定检索延迟和召回效果。在小规模数据集比如 10 万条以内你甚至可以不建索引用 brute force 全量搜速度也能接受。但数据一多必须建索引。Milvus 2.4 里最常用的索引是 HNSW 和 IVF_FLAT。HNSW 的搜索速度和召回率都很优秀但构建内存占用高、构建时间相对长IVF_FLAT 更省内存但检索时要遍历的桶多速度略慢。我的建议是默认用 HNSWM 参数设 16efConstruction 设 200查询时 ef 参数可以根据实时性要求调一般在 64 到 256 之间。以下是我在实际项目中常用的建表代码from pymilvus import ( connections, CollectionSchema, FieldSchema, DataType, Collection ) connections.connect(aliasdefault, hostlocalhost, port19530) dim 1024 fields [ FieldSchema(nameid, dtypeDataType.INT64, is_primaryTrue, auto_idTrue), FieldSchema(nametext, dtypeDataType.VARCHAR, max_length65535), FieldSchema(nameembedding, dtypeDataType.FLOAT_VECTOR, dimdim), ] schema CollectionSchema(fieldsfields, description知识库文档向量) collection Collection(namedoc_rag, schemaschema) index_params { index_type: HNSW, metric_type: IP, params: {M: 16, efConstruction: 200} } collection.create_index(field_nameembedding, index_paramsindex_params) print(Collection 创建完成)这里有个容易被忽略的点创建索引后数据不会自动重新组织所以对于已有大量数据的 collection建完索引后需要等索引构建完成查询才会真正用到索引。你可以通过 collection.wait_for_index_building_completed() 或者 Attu 面板里的进度条来跟踪。另一个值得讨论的是 metric_type 的选择。Milvus 支持 IP内积、L2欧氏距离和 COSINE余弦相似度。如果你 embedding 模型输出的向量已经做了归一化用 IP 和 COSINE 效果等同如果没归一化建议用 COSINE避免向量模长对相似度造成干扰。我一开始图省事全用 IP后来换模型后召回效果明显变差排查下来才发现是向量没归一化导致的。记住这条经验能省很多排查时间。4.2 数据写入与检索的完整闭环数据写入 Milvus 有两种常用方式一次性批量导入和逐条插入。批量导入推荐用 pymilvus 的 insert 接口配合列表数据或者用 DataImport 类从文件导入。逐条插入适合在线场景但性能不如批量。下面是一个简单的写入和检索闭环import random data [ {text: Milvus 是一个高性能向量数据库, embedding: [random.random() for _ in range(dim)]}, {text: Docker 让部署变得更简单, embedding: [random.random() for _ in range(dim)]}, ] collection.insert(data) collection.flush()插入之后数据默认在内存中调用 flush 会把数据落盘到 MinIO。检索时这样写collection.load() query_vector [random.random() for _ in range(dim)] results collection.search( data[query_vector], anns_fieldembedding, param{metric_type: IP, params: {ef: 128}}, limit5, output_fields[text], ) for hits in results: for hit in hits: print(hit.id, hit.score, hit.entity.get(text))这里有个非常关键的步骤查询前必须 collection.load()。Milvus 采用了内存/磁盘两层架构collection 创建后数据在磁盘上检索时要把数据段加载进内存。如果忘了 load直接 search 会报错“collection not loaded”。我在第一次写代码时就被这个坑绊了一次后来写了个工具函数在应用启动时自动 load 所有需要的 collection从根上规避了这个问题。4.3 Milvus 与 RAG 场景的组合方式很多读者部署 Milvus 是为了做 RAG 知识库。这个场景下 Milvus 通常只是整个链路的一部分前面要接文档解析和 embedding后面要接大模型。典型的调用链是文档加载 - 分块 - embedding - 写入 Milvus查询时问题 - embedding - Milvus 检索 - TopK 片段拼 prompt - 大模型生成回答。我这边用的方案是 LangChain 或 LlamaIndex 搭配 pymilvus。LangChain 里可以直接用 Milvus 作为 vectorstore底层集成已经做得比较完善。需要注意的一个细节是LangChain 里的 Milvus 默认会用自己的方式管理 collection 和 index如果你之前已经手工建好了 collection要配置好字段映射否则 LangChain 会尝试建一个新的 collection导致数据不一致。我自己更推荐用 Python 直接写业务层代码调用 pymilvus 做检索这样对索引参数和字段映射的控制最灵活也方便在检索前后加各种过滤逻辑。5. 性能调优与生产化加固5.1 索引构建与内存管理Milvus 在检索时依赖内存中的索引结构。HNSW 索引占用的内存大约是向量原始大小的 1.2 到 1.5 倍。假设你有 100 万条 1024 维 float 向量裸数据大小约为 4GBHNSW 索引可能需要 5~6GB 内存。如果你的服务器内存只有 16G再算上 etcd 和 MinIO 的开销会非常紧张。建议在评估资源时按“裸向量大小的 3 倍”预留总内存这是一个相对安全的经验值。如果你的数据量很大但内存有限可以考虑 DiskANN 索引它是基于磁盘的索引方案内存占用更小检索速度略慢但依然可用。Milvus 2.4 对 DiskANN 的支持已经比较稳定值得在大数据量场景下尝试。5.2 Compose 资源限制与日志轮转生产环境下我不建议让容器无限制地占用宿主机资源。可以在 docker-compose.yml 里为 standalone 服务加上资源限制standalone: deploy: resources: limits: memory: 12G cpus: 4.0 reservations: memory: 8G注意deploy.resources 配置在使用 docker compose非 Swarm 模式时通常只会对容器产生部分限制效果更可靠的方式是直接在 Docker 运行时加 --memory 和 --cpus 参数或者在 compose 的 standalone 服务下加mem_limit: 12g cpus: 4.0这两者写法有差异但 mem_limit 这种旧式写法在 docker compose 里依然被支持实测有效。加上限制的好处是哪怕 Milvus 因为某种原因内存暴涨也不会把宿主机整个拖死其他容器还能继续服务。日志轮转也值得提前配置。Milvus 容器日志如果不限制时间久了会占据大量磁盘空间。我给全局容器默认加了日志限制logging: driver: json-file options: max-size: 100m max-file: 35.3 数据备份与恢复思路数据备份这一块官方的 Milvus 提供了 milvus-backup 工具但配置起来相对繁琐。我在实践中更常用的土办法是备份整个 volumes 目录也就是把 compose 文件里的 volumes 目录打个包docker compose stop tar -czvf milvus-backup-$(date %Y%m%d).tar.gz volumes/ docker compose start这种做法的原理是Milvus 的数据、etcd 的元数据、MinIO 的对象存储全部落在 volumes 目录下。只要这个目录完整备份下来整个环境就可以恢复。操作的缺点是需要停机但数据一致性最好。对于很多中小项目每天凌晨进行一次这种冷备完全够用。如果要用官方的 milvus-backup 工具支持热备但复杂度和操作成本都上来了。我的建议是先做冷备跑通了再考虑热备别一上来就给自己加太多负担。5.4 安全加固的常见做法Milvus 默认是不需要认证的任何能访问 19530 端口的人都能操作你的数据。生产环境至少做三件事第一防火墙层面只放行可信 IP 访问 19530第二给 etcd 和 MinIO 的端口加上 IP 白名单或者干脆不映射到宿主机只在 Docker 内部网络访问第三启用 Milvus 的认证机制。新版 Milvus 支持设置 root 用户密码具体可以在启动脚本里配置用户和初始密码或者在 yml 文件的环境变量中指定。这块配置项比较多强烈建议生产环境认真配一遍。6. 常见问题与排查技巧实录6.1 容器起不来或不断重启这个现象比较常见尤其第一次部署时。首先 docker compose logs standalone | tail -100 查看主容器日志。如果日志里报错提示连接 etcd 超时多半是 etcd 容器没进入健康状态或者 Milvus 容器启动太快、依赖的 etcd 还没就绪。解决办法有两个层面。第一个层面是手动重启 standalonedocker compose restart standalone第二个层面是检查 etcd 日志看 etcd 自身是否有磁盘空间或权限问题docker compose logs etcd | tail -50我遇到过一种很隐蔽的情况服务器 /opt/milvus/volumes 目录的所有者不是当前用户导致 etcd 容器写入 /etcd 目录时权限不足容器反复崩溃。解决办法是 chown 一下目录chown -R 1000:1000 /opt/milvus/volumes这是根据常见实践的补充具体 UID 可能因镜像不同而略有区别通常 1000 是多数容器的默认用户。6.2 19530 端口被占用有时候你机器上已经跑了别的服务占用 19530Milvus 起不来。查看占用情况ss -tlnp | grep 19530 lsof -i :19530要么关掉占用进程要么修改 compose 文件里的端口映射比如改成 19531:19530。改端口后客户端连接的 host 和 port 也要同步调整。6.3 Python SDK 连接失败pymilvus 连接报错最常见的两类原因Milvus 服务本身没起来或者防火墙拦了端口。先确认容器状态docker compose ps curl http://localhost:9091/healthz如果 healthz 返回正常但 SDK 连不上基本是网络层的问题。本地客户端和远端服务器之间的防火墙安全组策略可能需要放行 19530。我之前在云服务器上部署后本地死活连不上控制台安全组放行 19530 后秒连。6.4 索引构建卡住不动索引构建卡在 0% 或者构建了很久都不动先看日志。常见原因是内存不足导致索引构建进程一直在等待内存。此时把并发度调低同时检查机器内存余量free -h如果内存确实紧张可以临时缩小数据集测试构建流程确认配置没问题后再放开全量数据。Milvus 还有一个资源限制参数 build_index 相关的 memory 配置项在配置里可以限制索引构建的内存占比。但我个人经验是与其调复杂的参数不如直接给机器加内存性价比最高。6.5 数据明明插了但查不到这种情况通常和 flush 有关。插入数据后如果不 flush 或检索Milvus 的 segment 还没有真正可检索。条件允许的话在插入完成后调用 collection.flush()。还有一种情况是 collection 没有 load查询会报错。把 load 操作放到应用初始化阶段执行能规避大半类似问题。6.6 常见问题速查表问题现象可能原因解决动作容器不断重启etcd 元数据目录权限不对chown volumes 目录为容器用户客户端连接超时防火墙/安全组未放行 19530放行端口或修改端口映射检索报 collection not loaded忘记执行 load()启动时自动 load 所有 collection索引构建卡住内存不足加内存或减小数据集重试数据查不到未 flush 或未 loadflush load 后再查询docker compose 命令不存在未安装 compose 插件安装 docker compose 或改用 docker-compose7. 最后的实战心得Milvus 用 Docker 部署这件事真的不复杂核心就是把 Compose 文件搞明白、把资源规划做好、把端口和权限管住。真正决定系统好不好用的反而是你后续怎么设计 collection、怎么选择索引参数、怎么把查询性能调到最优。这些事我在文章里尽可能多写了一些自己的实测和踩坑记录就是希望大家能少走几步弯路。如果你准备把 Milvus 投入到真实项目里建议不要直接上来就干集群版。先在单机 Docker 版上把数据模型跑通把索引和检索链路验证好等数据量真的到了百万级以上、并发也上来了再去考虑 k8s 或者集群方案。很多团队一上来就堆架构最后发现单机版已经能扛住全部压力白白浪费了一堆运维成本。还有一个实用的小技巧写一个 health check 脚本定时 curl 一下 http://localhost:9091/healthz异常时自动重启容器并通知你。我这边就挂了个定时任务偶尔遇到宿主机重启或者磁盘写满导致 Milvus 假死的场景它能自动恢复服务省了不少半夜被叫醒的麻烦。
返回列表