Milvus 安装与部署:三种形态怎么选
安装与部署:三种形态怎么选
Milvus 有三种部署形态,选型逻辑很直接:本机调试用 Milvus Lite,单机生产用 Standalone,数据量和并发上来了再上 Distributed(集群版,依赖 Kubernetes 与对象存储)。
Milvus Lite:最快跑起来的方式
Milvus Lite 是把数据库嵌进 Python 进程里的轻量版本,不需要 Docker 也不需要任何外部依赖,装一个包就能用。
pip install pymilvus
然后直接用一个本地文件路径当连接地址:
from pymilvus import MilvusClient
client = MilvusClient("./milvus_demo.db")
print(client.list_collections())
它会自动创建 milvus_demo.db 这个本地文件,所有数据都存进去。适合写 Demo、跑单元测试、在笔记本上验证索引参数。要注意 Milvus Lite 并不支持全部功能,索引类型和部分标量类型都有限制,官方文档有一张支持矩阵,动手前先对一眼,别把 Standalone 上跑通的代码直接搬过来。
Standalone:docker compose 一条命令起
官方仓库提供了 docker compose 文件,Standalone 会连同它的依赖一起拉起来。典型流程是下载 compose 文件后启动:
wget https://github.com/milvus-io/milvus/releases/download/v2.4.0/milvus-standalone-docker-compose.yml -O docker-compose.yml
docker compose up -d
docker compose ps
上面的版本号只是示例,实际请到官方 Releases 页面取当前稳定版本。启动后容器列表里应该能看到三个服务:milvus-standalone,以及它依赖的 etcd 和对象存储(MinIO)。部分版本还会再起一个消息队列组件——早期是 Pulsar,较新版本改为更轻的 Woodpecker,具体以你下载到的那份 compose 文件为准。
这三个依赖各自干什么:
- etcd:存元数据,包括 collection 定义、索引信息、节点状态、通道分配等。etcd 挂了,Milvus 基本等于失联。
- MinIO(或任意 S3 兼容对象存储):存真正的数据文件,包括 binlog、索引文件、删除记录。Standalone 场景下就是本地一个桶。
- 消息队列:承担写入日志(WAL)与内部流转,保证写入的顺序性和可回放。
端口方面,日常打交道的主要是两个:19530 是 gRPC/SDK 端口,Python、Java、Go、Node 的客户端都连它;9091 是健康检查与指标端口,用来探测存活、暴露 Prometheus 指标,较新版本的 Milvus 还在这里提供了内置的 WebUI(路径通常是 /webui),可以在浏览器里直接看 collection、索引状态和慢查询。
如果想要图形化客户端,可以用 Attu。它可以通过 Docker 单独起一个容器,连接到 19530 端口,界面上能建 collection、插数据、跑向量检索、看索引构建进度。Attu 的默认监听端口在不同版本和镜像里不一致,以你使用的镜像说明为准。
Standalone 常用的环境变量包括:ETCD_ENDPOINTS 指定 etcd 地址,MINIO_ADDRESS、MINIO_ACCESS_KEY_ID、MINIO_SECRET_ACCESS_KEY 指定对象存储,COMMON_STORAGETYPE 用于切换到 S3 等后端。生产部署时这些值不要用默认的,尤其是对象存储的密钥。
常见报错与排查
| 现象 | 常见原因 | 处理办法 |
|---|---|---|
| 容器反复重启或直接被 OOM Kill | Milvus 默认会尽量把数据缓存在内存,宿主机内存不足;或者 nlist、M 等参数设得过大导致索引膨胀 | 调大 Docker 可用内存;改用 DiskANN 或开启 mmap 降低内存占用;把 nlist 从默认值往下调 |
| etcd 健康检查失败,Milvus 起不来 | etcd 数据目录权限问题,或上一次非正常退出留下脏数据;也可能是磁盘写满 | 看 etcd 容器日志定位;检查磁盘余量;确认数据卷挂载与权限正确 |
| 客户端连接超时 | 19530 端口没映射出来、防火墙拦截、或容器还没真正就绪就发起了连接 | 用 docker compose ps 确认状态,用 curl 探 9091/healthz 确认就绪,再检查端口映射与安全组 |
| 搜索报错说索引不存在或不匹配 | collection 建好但索引还在 building,或查询的 metric type 与建索引时不一致 | 查询索引构建进度,等状态变为完成再检索;统一 metric type |
| 向量维度不匹配 | 写入的数据维度与 schema 中 dim 定义不一致,通常是换了 embedding 模型没同步改 schema | 维度不可改,只能新建 collection 并重新导入;上线前把模型版本与维度写进配置做校验 |

