未记录事实核验 · 状态:维护中

记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。

warning 适用边界与维护说明

本文适合了解 Lite、Standalone、Distributed 三种模式,并参考所列 Milvus 2.4.9 Compose 示例开展开发与集成测试;本次仅作全文结构审阅,未进行外部事实核验或实际部署验证。正文所称“完整操作步骤”不代表完整生产方案:Helm 未固定 chart 版本及配置匹配范围,鉴权、备份恢复与故障验证尚未覆盖;Lite 的 ":memory:" 用法、pool_size 连接池参数及 memoryWatermark 触发 LRU 驱逐的支持范围和生效条件仍待确认。决策树数量阈值、资源表、内存系数和扩容指标仅作规划参考,须结合维度、索引、并发及可用性目标压测。Compose 实际还发布 MinIO 9000、9001 和 Milvus 9091 端口,并使用默认 MinIO 凭据,不应按“只暴露 Milvus 端口”的文字描述判断网络安全边界。磁盘排障已改为对现存 Collection 请求压缩并说明回收限制,不再沿用旧说明中“磁盘清理代码不能直接照抄”的警告。 已取消无法确定目标的可点击引用「02-核心概念与数据模型」,保留原提及;Missing link target: 02-核心概念与数据模型 已取消无法确定目标的可点击引用「03-索引原理与选型」,保留原提及;Missing link target: 03-索引原理与选型

Milvus 安装与部署

info 文档定位

本文覆盖 Milvus 三种部署模式的完整操作步骤——Lite(嵌入式)、Standalone(单机)、Distributed(分布式)。无论你是在 Jupyter Notebook 里探索,还是要上线一个支撑亿级向量的生产系统,都能在这里找到对应的部署方案。

目录


部署模式选择:先做决策,再动手

Milvus 有三种部署模式,复杂度和能力依次递增。错误的模式选择会让你在不必要的地方浪费大量时间——在生产里用 Lite,或者在本地开发时折腾分布式集群,都是常见的踩坑。

下面这个决策树帮你在 2 分钟内完成选型:

%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
flowchart TD
    Start([开始选择部署模式]) --> Q1{数据规模?}

    Q1 -->|"< 100 万向量"| Q2{用途是?}
    Q1 -->|"100 万 ~ 1 亿"| Q3{团队有 K8s 经验?}
    Q1 -->|"> 1 亿"| Distributed

    Q2 -->|本地开发 / 测试 / Notebook| Lite
    Q2 -->|生产服务 / 需要持久化| Standalone

    Q3 -->|有,且需要水平扩展| Distributed
    Q3 -->|没有,或单机够用| Standalone

    Lite["Milvus Lite<br/>嵌入式模式<br/>pip install 即用<br/>无需任何服务"]
    Standalone["Milvus Standalone<br/>单机生产模式<br/>Docker Compose 部署<br/>适合中小规模"]
    Distributed["Milvus Distributed<br/>分布式生产模式<br/>Kubernetes + Helm<br/>支持水平扩展"]

    style Lite fill:#d4edda,stroke:#28a745,color:#000
    style Standalone fill:#d1ecf1,stroke:#17a2b8,color:#000
    style Distributed fill:#f8d7da,stroke:#dc3545,color:#000

三种模式快速对比

维度 Milvus Lite Standalone Distributed
部署复杂度 极低(pip install) 低(Docker Compose) 高(K8s + Helm)
依赖服务 无 etcd + MinIO etcd + MinIO + Pulsar/Kafka
向量规模 取决于本地资源与负载 取决于单机资源与负载 取决于集群资源与配置(可横向扩展)
高可用 不支持 不支持 支持
适用场景 开发 / 测试 中小规模生产 大规模生产
推荐硬件 笔记本即可 16G 内存起步 多节点集群

tip 建议的学习路径

本地先用 Lite 跑通代码逻辑 → 用 Standalone 做集成测试,并评估其是否满足生产要求 → 当单机容量、吞吐量或可用性不能满足需求时考虑 Distributed。5000 万条向量可作为一个假设性评估点,不是必须达到的门槛;是否需要分布式部署应由负载测试和运维要求决定。


Milvus Lite:嵌入式模式

什么是 Milvus Lite

Milvus Lite 是 Milvus 的嵌入式版本。它把 Milvus 的核心功能打包进 Python 库,数据存在本地文件里,不需要启动任何服务。你可以把它理解成向量数据库领域的 SQLite——轻量、够用、零配置。

note 适用场景

  • 本地开发和原型验证
  • Jupyter Notebook 中的交互式探索
  • 单元测试和集成测试
  • 算法实验,无需运维投入

warning 不适合 Lite 的场景

  • 生产环境(本地文件模式可持久化,但不提供面向生产服务的高可用保障;仅内存模式在进程退出后丢失数据)
  • 多进程并发写入
  • 不能满足本地资源与性能目标的数据集(100 万条可作为假设性测试点,不是统一性能界限)
  • 需要高可用和备份的场景

安装

# 安装 pymilvus,[model] 扩展包含常用向量模型依赖
pip install pymilvus[model]

# 只安装核心库(不需要内置模型时)
pip install pymilvus

info 版本要求

Python >= 3.8,推荐使用 3.10 或 3.11。pymilvus 2.4.x 起支持 Milvus Lite。

5 行代码启动

from pymilvus import MilvusClient

# 连接到本地文件(文件不存在时自动创建)
client = MilvusClient("./milvus_demo.db")

# 创建 collection(简化模式,自动推断 schema)
client.create_collection(
    collection_name="demo",
    dimension=768  # 向量维度,与你的 embedding 模型对齐
)

# 插入一条数据
client.insert(
    collection_name="demo",
    data=[{"id": 1, "vector": [0.1] * 768, "text": "hello milvus"}]
)

# 搜索最相似的 3 条
results = client.search(
    collection_name="demo",
    data=[[0.1] * 768],
    limit=3,
    output_fields=["text"]
)
print(results)

Lite 的数据存储

Milvus Lite 的数据存储在你指定的 .db 文件中,本质是 SQLite 格式。

# 指定不同路径存储数据
client = MilvusClient("/path/to/your/data.db")

# 使用内存模式(程序退出后数据消失)
client = MilvusClient(":memory:")

warning 数据迁移提醒

Milvus Lite 的数据文件格式与 Standalone/Distributed 不兼容,无法直接迁移。从 Lite 升级到 Standalone 时,需要重新导入原始数据并重建向量。规划好了再开始,避免后期数据迁移的麻烦。


Milvus Standalone:单机生产模式

架构说明

Standalone 模式下,Milvus 依赖两个外部服务:

  • etcd:存储元数据(Collection 定义、Schema、节点状态)
  • MinIO:存储向量数据和索引文件

这三个服务用 Docker Compose 统一管理,对外只暴露 Milvus 的端口(默认 19530)。

%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
graph LR
    Client["客户端<br/>pymilvus"] -->|"19530 (gRPC)<br/>9091 (HTTP)"| Milvus["Milvus<br/>Standalone"]
    Milvus -->|"元数据"| etcd["etcd<br/>:2379"]
    Milvus -->|"数据文件<br/>索引文件"| MinIO["MinIO<br/>:9000"]

    style Client fill:#fff3cd,stroke:#ffc107,color:#000
    style Milvus fill:#cce5ff,stroke:#004085,color:#000
    style etcd fill:#d4edda,stroke:#28a745,color:#000
    style MinIO fill:#d4edda,stroke:#28a745,color:#000

Docker Compose 部署

第一步:获取 docker-compose.yml

# 创建工作目录
mkdir milvus-standalone && cd milvus-standalone

# 下载官方 compose 文件(Milvus 2.4.x)
wget https://github.com/milvus-io/milvus/releases/download/v2.4.9/milvus-standalone-docker-compose.yml \
     -O docker-compose.yml

docker-compose.yml 完整内容(建议直接使用以下经过注释的版本):

version: '3.5'

services:
  # ── etcd:Milvus 的元数据存储 ──────────────────────────
  etcd:
    container_name: milvus-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  # 4GB,防止 etcd 空间满
      - ETCD_SNAPSHOT_COUNT=50000
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/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
    healthcheck:
      test: ["CMD", "etcdctl", "endpoint", "health"]
      interval: 30s
      timeout: 20s
      retries: 3

  # ── MinIO:向量数据和索引的对象存储 ─────────────────────
  minio:
    container_name: milvus-minio
    image: minio/minio:RELEASE.2023-03-13T19-46-17Z
    environment:
      MINIO_ACCESS_KEY: minioadmin    # 生产环境务必修改!
      MINIO_SECRET_KEY: minioadmin    # 生产环境务必修改!
    ports:
      - "9001:9001"  # MinIO 控制台,可用浏览器访问
      - "9000:9000"  # MinIO API
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data  # 持久化数据
    command: minio server /minio_data --console-address ":9001"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  # ── Milvus:向量数据库核心服务 ───────────────────────────
  standalone:
    container_name: milvus-standalone
    image: milvusdb/milvus:v2.4.9
    command: ["milvus", "run", "standalone"]
    security_opt:
      - seccomp:unconfined
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus  # 持久化 Milvus 数据
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
      interval: 30s
      start_period: 90s
      timeout: 20s
      retries: 3
    ports:
      - "19530:19530"  # gRPC,pymilvus 默认连接此端口
      - "9091:9091"    # HTTP API 和健康检查
    depends_on:
      - "etcd"
      - "minio"

networks:
  default:
    name: milvus

第二步:启动服务

# 后台启动所有服务
docker compose up -d

# 查看启动状态
docker compose ps

期望看到类似输出:

NAME                 IMAGE                               STATUS
milvus-etcd          quay.io/coreos/etcd:v3.5.5         Up (healthy)
milvus-minio         minio/minio:...                    Up (healthy)
milvus-standalone    milvusdb/milvus:v2.4.9             Up (healthy)

第三步:验证服务正常

# 检查健康状态(返回 {"status":"ok"} 表示正常)
curl -f http://localhost:9091/healthz

# 查看 Milvus 日志(如果启动失败,从这里排查)
docker logs milvus-standalone --tail 50

数据持久化配置

默认情况下,数据存储在 ./volumes/ 目录下。生产环境强烈建议挂载到独立的高速磁盘:

# 启动时指定数据目录
DOCKER_VOLUME_DIRECTORY=/data/milvus docker compose up -d

建议的目录结构:

目录路径 说明
/data/milvus/volumes/etcd/ etcd 元数据,通常很小(< 1GB)
/data/milvus/volumes/minio/ 向量数据和索引,随数据量增长
/data/milvus/volumes/milvus/ Milvus 本地缓存

warning 磁盘选型建议

MinIO 存储向量数据,I/O 是性能瓶颈。推荐使用 SSD,避免将 MinIO 数据放在 NFS 或网络挂载盘上。机械硬盘会导致索引构建和搜索性能大幅下降。

资源配置建议

数据规模 内存 CPU 磁盘
< 100 万向量 16 GB 4 核 100 GB SSD
100 万 ~ 1000 万 32 GB 8 核 500 GB SSD
1000 万 ~ 1 亿 64 GB+ 16 核+ 2 TB SSD

tip 内存估算公式

粗略估算:向量维度 × 4 字节 × 向量数量 × 1.5(索引开销)= 所需内存 例如:1000 万条 768 维向量 ≈ 768 × 4 × 10,000,000 × 1.5 ≈ 46 GB

停止和重启

# 停止服务(数据保留)
docker compose down

# 停止服务并删除 Compose 管理的卷;不会删除本文使用的 ./volumes/ 绑定目录
docker compose down -v

# 重启单个服务
docker compose restart standalone

Milvus Distributed:分布式生产模式

架构组件全景

Distributed 模式将 Milvus 拆分为多个独立服务,每个组件可以独立扩缩容:

%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
graph TB
    subgraph "接入层"
        Proxy["Proxy<br/>(负载均衡 + 路由)"]
    end

    subgraph "协调层"
        RootCoord["RootCoord<br/>(全局协调)"]
        QueryCoord["QueryCoord<br/>(查询协调)"]
        DataCoord["DataCoord<br/>(数据协调)"]
        IndexCoord["IndexCoord<br/>(索引协调)"]
    end

    subgraph "工作层"
        QueryNode["QueryNode<br/>(执行搜索)"]
        DataNode["DataNode<br/>(写入数据)"]
        IndexNode["IndexNode<br/>(构建索引)"]
    end

    subgraph "存储层"
        etcd["etcd<br/>(元数据)"]
        MinIO["MinIO/S3<br/>(对象存储)"]
        Pulsar["Pulsar / Kafka<br/>(消息队列)"]
    end

    Client["客户端"] --> Proxy
    Proxy --> RootCoord & QueryCoord & DataCoord & IndexCoord
    QueryCoord --> QueryNode
    DataCoord --> DataNode
    IndexCoord --> IndexNode
    QueryNode & DataNode & IndexNode --> MinIO
    RootCoord & QueryCoord & DataCoord & IndexCoord --> etcd
    DataNode --> Pulsar
    QueryNode --> Pulsar

    style Client fill:#fff3cd,stroke:#ffc107,color:#000
    style Proxy fill:#cce5ff,stroke:#004085,color:#000

Kubernetes + Helm 部署步骤

前置条件:

  • Kubernetes 集群(1.20+)
  • Helm 3.x
  • kubectl 配置完成
  • 集群总内存 >= 32 GB(最小配置)

第一步:添加 Milvus Helm 仓库

helm repo add milvus https://zilliztech.github.io/milvus-helm/
helm repo update

第二步:最小化配置部署(开发/测试用)

# 创建命名空间
kubectl create namespace milvus

# 使用最小配置部署(所有组件单副本)
helm install milvus milvus/milvus \
  --namespace milvus \
  --set cluster.enabled=true \
  --set etcd.replicaCount=1 \
  --set minio.mode=standalone \
  --set pulsar.enabled=false \
  --set kafka.enabled=true \
  --set kafka.replicaCount=1

第三步:多副本配置示例(生产方案评估起点,不构成高可用保证)

创建 values-production.yaml:

# values-production.yaml - 待匹配 chart 版本并完成故障验证的多副本配置示例
cluster:
  enabled: true

# Proxy:接入层,可水平扩展
proxy:
  replicas: 2
  resources:
    requests:
      memory: "4Gi"
      cpu: "2"
    limits:
      memory: "8Gi"
      cpu: "4"

# QueryNode:负责执行向量搜索,搜索压力大时横向扩展此组件
queryNode:
  replicas: 3
  resources:
    requests:
      memory: "16Gi"  # 索引要加载到内存,给足内存
      cpu: "4"
    limits:
      memory: "32Gi"
      cpu: "8"

# DataNode:负责数据写入
dataNode:
  replicas: 2
  resources:
    requests:
      memory: "4Gi"
      cpu: "2"
    limits:
      memory: "8Gi"
      cpu: "4"

# IndexNode:负责构建索引,CPU 密集型
indexNode:
  replicas: 2
  resources:
    requests:
      memory: "8Gi"
      cpu: "8"
    limits:
      memory: "16Gi"
      cpu: "16"

# etcd:高可用配置
etcd:
  replicaCount: 3
  persistence:
    storageClassName: "fast-ssd"  # 替换为你的 StorageClass

# MinIO:生产用分布式模式
minio:
  mode: distributed
  replicas: 4
  persistence:
    storageClassName: "fast-ssd"
    size: 500Gi

# Kafka(替代 Pulsar;稳定性取决于部署配置和实际负载)
pulsar:
  enabled: false
kafka:
  enabled: true
  replicaCount: 3
# 使用生产配置部署
helm install milvus milvus/milvus \
  --namespace milvus \
  --values values-production.yaml

第四步:验证部署状态

# 查看所有 Pod 状态
kubectl get pods -n milvus

# 期望所有 Pod 状态为 Running
# NAME                                   READY   STATUS    RESTARTS
# milvus-datacoord-xxx                   1/1     Running   0
# milvus-datanode-xxx                    1/1     Running   0
# milvus-indexcoord-xxx                  1/1     Running   0
# milvus-indexnode-xxx                   1/1     Running   0
# milvus-proxy-xxx                       1/1     Running   0
# milvus-querycoord-xxx                  1/1     Running   0
# milvus-querynode-xxx                   1/1     Running   0
# milvus-rootcoord-xxx                   1/1     Running   0

# 检查 Milvus 健康状态
kubectl port-forward svc/milvus 19530:19530 -n milvus &
# 此命令仅转发 19530;不能据此访问本地 9091 健康检查端口

节点扩缩容

# 扩展 QueryNode(搜索压力大时)
kubectl scale deployment milvus-querynode --replicas=6 -n milvus

# 或通过 Helm 更新
helm upgrade milvus milvus/milvus \
  --namespace milvus \
  --reuse-values \
  --set queryNode.replicas=6

tip 扩容时机判断

  • QueryNode CPU 持续 > 70%:扩 QueryNode
  • DataNode 写入延迟增加:扩 DataNode
  • 索引构建队列堆积:扩 IndexNode

Attu:可视化管理工具

Attu 是 Milvus 官方的 Web 管理界面,可以在浏览器中直观地管理 Collection、浏览数据、执行搜索。

启动 Attu

# Standalone 模式(本地)
docker run -d \
  --name attu \
  --network milvus \
  -p 8000:3000 \
  -e MILVUS_URL=milvus-standalone:19530 \
  zilliz/attu:latest

# 访问 http://localhost:8000
# 连接远程 Milvus(生产环境)
docker run -d \
  --name attu \
  -p 8000:3000 \
  -e MILVUS_URL=your-milvus-host:19530 \
  zilliz/attu:latest

Attu 主要功能

功能 说明
Collection 管理 创建、删除、查看 Collection 的 Schema 和统计信息
数据浏览 翻页查看已插入的数据
向量搜索 在界面中直接执行搜索,调试查询参数
索引管理 查看和管理 Collection 的索引状态
系统监控 查看节点状态、内存使用、连接数

note Attu 适合的场景

开发阶段调试和数据验证用。生产环境的监控建议接入 Prometheus + Grafana(Milvus 原生支持 metrics 暴露)。


连接配置与健康检查

pymilvus 连接方式

from pymilvus import MilvusClient, connections

# ── 方式一:MilvusClient(推荐,新版简化 API)──────────────
# 本地 Milvus Lite
client = MilvusClient("./local.db")

# 连接远程 Standalone
client = MilvusClient(
    uri="http://localhost:19530"
)

# 带认证(开启了 Milvus 鉴权时)
client = MilvusClient(
    uri="http://your-host:19530",
    token="root:Milvus"  # 格式:username:password
)

# ── 方式二:connections(旧版 API,兼容性更广)─────────────
from pymilvus import connections

connections.connect(
    alias="default",       # 连接别名,后续操作引用此别名
    host="localhost",
    port="19530",
    user="root",           # 开启鉴权时填写
    password="Milvus"
)

# 断开连接
connections.disconnect("default")

连接池配置

在高并发场景下,合理配置连接池可以显著提升吞吐量:

from pymilvus import connections

connections.connect(
    alias="default",
    host="localhost",
    port="19530",
    pool_size=10,      # 连接池大小,根据并发量调整
    timeout=30         # 连接超时(秒)
)

健康检查代码

from pymilvus import MilvusClient, utility, connections

def check_milvus_health(uri: str) -> dict:
    """
    检查 Milvus 连接状态和服务健康度。
    返回包含版本、状态和 Collection 数量的字典。
    """
    try:
        client = MilvusClient(uri=uri)

        # 获取 Milvus 版本信息
        # 注:utility 函数需要先建立 connections
        connections.connect(uri=uri)
        server_version = utility.get_server_version()

        # 列出所有 Collection
        collections = client.list_collections()

        return {
            "status": "healthy",
            "server_version": server_version,
            "collection_count": len(collections),
            "collections": collections
        }
    except Exception as e:
        return {
            "status": "unhealthy",
            "error": str(e)
        }

# 使用示例
health = check_milvus_health("http://localhost:19530")
print(health)
# {'status': 'healthy', 'server_version': 'v2.4.9', 'collection_count': 3, ...}

常见问题排查

问题 1:Milvus 容器启动后立即退出

# 查看详细日志
docker logs milvus-standalone --tail 100

常见原因:

  • etcd 未就绪:Milvus 启动时 etcd 可能还没准备好。本文列表式 depends_on 仅规定启动顺序,不等待健康检查通过。先检查 etcd 和 MinIO 的健康状态;依赖就绪后可执行 docker compose restart standalone。若要自动等待依赖健康,需使用当前 Compose 实现支持的 condition: service_healthy 长格式配置。
  • MinIO 连接失败:检查 MinIO 的 MINIO_ACCESS_KEY 和 MINIO_SECRET_KEY 是否与 Milvus 配置一致。
  • 端口被占用:lsof -i :19530 检查端口是否被其他进程占用。

问题 2:连接超时(Connection timed out)

# 确认 Milvus 在监听
# 在 Milvus 所在机器上执行
# curl http://localhost:9091/healthz

# 如果是远程连接,检查防火墙规则
# 19530 (gRPC) 和 9091 (HTTP) 需要放通

问题 3:内存不足导致服务崩溃

# 查看内存使用
docker stats milvus-standalone

# 临时解决:限制 Collection 加载到内存的数据量
# 在 milvus.yaml 中配置:
# queryNode:
#   cache:
#     memoryWatermark: 0.8  # 内存使用超过 80% 时触发 LRU 驱逐

问题 4:磁盘空间不足

# 查看 MinIO 数据占用
docker exec milvus-minio du -sh /minio_data

对于仍存在的 Collection,可在建立连接后请求压缩:

from pymilvus import Collection, connections

connections.connect(alias="default", uri="http://localhost:19530")
collection = Collection("your_collection_name", using="default")
collection.compact()

压缩请求不保证立即释放磁盘空间,也不能通过上述方式压缩已经删除的 Collection;对象回收还取决于服务的垃圾回收机制与保留配置。

tip 相关文档

  • 安装完成后,参考 05-第一个Milvus应用 运行你的第一个向量搜索
  • 理解 Collection 和 Schema 设计,参考 02-核心概念与数据模型
  • 索引类型选择,参考 03-索引原理与选型
  • 如果还没确定是否要用 Milvus,先看 00-向量数据库选型指南

#Milvus #向量数据库 #部署 #Docker #Kubernetes #安装配置