Milvus 安装与使用

1. Milvus 简介

官网https://milvus.io

GitHubhttps://github.com/milvus-io/milvus


1.1 Milvus 是什么

关于 Milvushttps://milvus.io/docs/zh/overview.md#What-is-Milvus

Milvus 是一个开源的高性能向量数据库,专门用于存储、索引和搜索大规模向量数据,广泛应用于:

  • AI 知识库(RAG)
  • 语义搜索
  • 推荐系统
  • 图像/视频检索
  • 多模态 AI

Milvus 支持:

  • 十亿级向量存储
  • 多种向量索引算法(HNSW / IVF / FLAT)
  • GPU 加速
  • 分布式部署

1.2 为什么选择 Milvus

Milvus 从设计之初就是一个高效的向量数据库系统。在大多数情况下,Milvus 的性能是其他向量数据库的 2-5 倍。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2 Milvus 部署

2.1 Milvus 部署方式选择

Milvus 部署选项概述https://milvus.io/docs/zh/install-overview.md#Overview-of-Milvus-Deployment-Options

目前,Milvus 有三种部署选项:Milvus LiteMilvus StandaloneMilvus Distributed

  • Milvus Lite:Milvus Lite是一个 Python 库,可导入到您的应用程序中。作为 Milvus 的 轻量级版本,它非常适合在 Jupyter 笔记本或资源有限的智能设备上运行快速原型。
  • Milvus 单机版:Milvus Standalone 是 单机服务器部署。Milvus Standalone 的所有组件都打包到一个Docker 镜像中,部署起来非常方便。如果你有生产工作负载,但又不想使用 Kubernetes,在内存充足的单机上运行 Milvus Standalone 是个不错的选择。
  • Milvus Distributed:Milvus Distributed 可部署在Kubernetes 集群 上。这种部署采用云原生架构,摄取负载和搜索查询分别由独立节点处理,允许关键组件冗余。它具有最高的可扩展性和可用性,并能灵活定制每个组件中分配的资源。Milvus Distributed 是在生产中运行大规模向量搜索系统的企业用户的首选。

部署模式的选择通常取决于应用程序的开发阶段:

  • 用于快速原型开发或学习

    如果您想 快速构建原型用于学习,如检索增强生成(RAG)演示、人工智能聊天机器人、多模态搜索,Milvus Lite 本身或 Milvus Lite 与 Milvus Standalone 的组合都很适合。您可以在笔记本中使用 Milvus Lite 进行快速原型开发,并探索各种方法,如 RAG 中的不同分块策略。您可能希望在小规模生产中部署用 Milvus Lite 构建的应用程序,为真正的用户提供服务,或在更大的数据集(例如超过几百万个向量)上验证想法。Milvus Standalone 是合适的选择。Milvus Lite 的应用逻辑仍可共享,因为所有 Milvus 部署都有相同的客户端应用程序接口。Milvus Lite 中存储的数据也可以通过命令行工具移植到 Milvus Standalone 中。

  • 小规模生产部署

    对于早期生产阶段,当项目仍在寻求产品与市场的契合,敏捷性比可扩展性更重要时,Milvus Standalone 是最佳选择。只要有足够的机器资源,它仍然可以扩展到 1 亿向量,同时对 DevOps 的要求也比维护 K8s 集群低得多。

  • 大规模生产部署

    当你的业务快速增长,数据规模超过单台服务器的容量时,是时候考虑 Milvus Distributed 了。你可以继续使用Milvus Standalone作为开发或暂存环境,并操作运行Milvus Distributed的K8s集群。这可以支持你处理数百亿个向量,还能根据你的特定工作负载(如高读取、低写入或高写入、低读取的情况)灵活调整节点大小。

  • 边缘设备上的本地搜索

    对于在边缘设备上通过私有或敏感信息进行搜索,您可以在设备上部署 Milvus Lite,而无需依赖基于云的服务来进行文本或图像搜索。这适用于专有文档搜索或设备上对象检测等情况。

Milvus 部署模式的选择取决于项目的阶段和规模。Milvus 为从快速原型开发到大规模企业部署的各种需求提供了灵活而强大的解决方案。

  • Milvus Lite:建议用于较小的数据集,多达几百万个向量。
  • Milvus Standalone:适用于中型数据集,可扩展至 1 亿向量。
  • Milvus Distributed:专为大规模部署而设计,能够处理从一亿到数百亿向量的数据集。

三种安装方式功能比较

功能 Milvus Lite Milvus 单机版 分布式 Milvus
SDK / 客户端软件 Python
gRPC
Python
Go
Java
Node.js
C#
RESTful
Python
Java
Go
Node.js
C#
RESTful
数据类型 密集向量
稀疏向量
二进制向量
布尔值
整数
浮点
VarChar
数组
JSON
密集向量
稀疏向量
二进制向量
布尔型
整型
浮点型
VarChar
数组
JSON
密集向量
稀疏向量
二进制向量
布尔值
整数
浮点
VarChar
数组
JSON
搜索功能 向量搜索(ANN 搜索)
元数据过滤
范围搜索
标签查询
通过主键获取实体
混合搜索
向量搜索(ANN 搜索)
元数据过滤
范围搜索
标签查询
通过主键获取实体
混合搜索
向量搜索(ANN 搜索)
元数据过滤
范围搜索
标签查询
通过主键获取实体
混合搜索
CRUD 操作符
高级数据管理 不适用 访问控制
分区
分区密钥
访问控制
分区
分区密钥
物理资源分组
一致性级别
有界停滞
会话
最终

有界稳定性
会话
最终

2.2 Milvus Standalone 安装要求

在安装 Milvus Standalone 实例之前,请检查您的硬件和软件是否符合要求。


2.3. 部署架构

Milvus standalone 依赖三个组件:

  • Milvus:向量数据库
  • etcd:元数据存储
  • MinIO:向量文件对象存储

架构:

      Client (SpringBoot / Python)
         │
         ▼
       Milvus
   ┌─────┴─────┐
  etcd       MinIO

2.4 Docker Compose 运行 Milvus

使用 Docker Compose 在 Docker 中启动 Milvus 实例:https://milvus.io/docs/zh/install_standalone-docker-compose.md#Run-Milvus-with-Docker-Compose-Linux
在这里插入图片描述

GitHub compose.ymlhttps://github.com/milvus-io/milvus/blob/master/deployments/docker/standalone/docker-compose.yml

在这里插入图片描述

v 2.6.11 版本的如下:

version: '3.5'

services:
  etcd:
    container_name: milvus-etcd
    image: quay.io/coreos/etcd:v3.5.25
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_AUTO_COMPACTION_RETENTION=1000
      - ETCD_QUOTA_BACKEND_BYTES=4294967296
      - ETCD_SNAPSHOT_COUNT=50000
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
    command: etcd -advertise-client-urls=http://etcd: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.2024-05-28T17-19-04Z
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    ports:
      - "9001:9001"
      - "9000:9000"
    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

  standalone:
    container_name: milvus-standalone
    image: milvusdb/milvus:v2.6.11
    command: ["milvus", "run", "standalone"]
    security_opt:
    - seccomp:unconfined
    environment:
      MINIO_REGION: us-east-1
      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"

networks:
  default:
    name: milvus

2.5 Milvus 常见配置参数查询

通过调整 milvus.yaml 中的相应参数,配置你的 Milvus 实例,以适应你的应用场景。

有关各参数的详细信息,请查看以下链接。https://milvus.io/docs/zh/configure-docker.md#Modify-the-configuration-file

默认配置缺少很多安全方面的配置,如用户名和密码,也可以通过搜索的方式来找到对应的配置信息
在这里插入图片描述

建议添加下面的安全配置
在这里插入图片描述


2.6 实施

2.6.1 目录结构(推荐)
milvus-deploy/
│
├─ docker-compose.yml      # docker compose 主配置
├─ .env                    # 环境变量,挂载目录 + 密码
├─ milvus.yaml             # Milvus 配置文件,开启认证
└─ data/                   # 持久化数据目录
    ├─ etcd
    ├─ minio
    └─ milvus

在这里插入图片描述


2.6.2 .env 文件(跨平台挂载目录常量 + Milvus root 密码)

.envdocker-compose.yml 同目录:

# =====================================================
# Docker Compose Project Name
# =====================================================
# 用于指定 docker compose 的项目名称
#
# 作用:
# 所有资源(network / volume / container)都会加此前缀
#
# 例如:
# network -> milvus_milvus
# volume  -> milvus_xxx
#
# 默认值是当前目录名
# =====================================================

COMPOSE_PROJECT_NAME=milvus


# =====================================================
# 数据目录
# =====================================================
# Linux
# VOLUME_ROOT=/data/milvus
#
# Windows
# VOLUME_ROOT=D:/milvus
#
# 默认当前目录
VOLUME_ROOT=./data


# =====================================================
# 端口配置
# =====================================================

MILVUS_PORT=19530
MILVUS_HEALTH_PORT=9091

MINIO_API_PORT=9000
MINIO_CONSOLE_PORT=9001

ATTU_PORT=3000


# =====================================================
# MinIO 账号
# =====================================================

MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin


# =====================================================
# 镜像版本
# =====================================================

ETCD_IMAGE=quay.io/coreos/etcd:v3.5.25
MINIO_IMAGE=minio/minio:RELEASE.2024-05-28T17-19-04Z
MILVUS_IMAGE=milvusdb/milvus:v2.6.3
ATTU_IMAGE=zilliz/attu:latest

说明:

系统 示例
Linux /data/milvus
Windows D:/milvus
开发环境 ./data

Docker Compose 会自动加载 .env


2.6.3 milvus.yaml(开启 Milvus 认证)
common:
  security:
    # =====================================================
    # 是否开启 Milvus 用户认证
    # =====================================================
    authorizationEnabled: true

    # =====================================================
    # 自定义 root 用户密码
    # 任何客户端或 UI 登录都必须使用 token
    # token 格式:username:password
    # =====================================================
    defaultRootPassword: Pass@8520

Milvus 不会自动解析 env,Milvus 配置文件是 静态配置,更推荐 使用 milvus.yaml

要在 Milvus 中启用认证并使用自定义用户名和密码,需要理解一个关键点:
Milvus 的认证不是通过 docker-compose 直接设置用户名密码,而是通过 Milvus 内部 RBAC(Role-Based
Access Control)系统 和 token 机制实现。
默认用户: root / Milvus


2.6.4 docker-compose.yml(完整注释版)
# =====================================================
# Milvus Standalone 部署
#
# 组件:
# 1 etcd    -> 元数据存储
# 2 MinIO   -> 对象存储(存储向量数据)
# 3 Milvus  -> 向量数据库
# 4 Attu    -> Milvus 图形化管理界面
#
# =====================================================
# Milvus Architecture
#
#                     +----------------------+
#                     |       Attu UI        |
#                     |  Milvus 管理界面     |
#                     +----------+-----------+
#                                |
#                                |
# +------------------+    +------v-------+
# |   Application    | -> |    Milvus    |
# |  向量检索系统    |    | Vector DB    |
# +------------------+    +------+-------+
#                               |
#                +--------------+--------------+
#                |                             |
#           +----v-----+                 +------v------+
#           |   etcd   |                 |     MinIO   |
#           |元数据存储|                 | 向量对象存储|
#           +----------+                 +-------------+
#
# 认证流程:
#
# Attu / Application
#          |
#          | token: username:password
#          v
#       Milvus
#
# =====================================================

services:

  # =====================================================
  # etcd
  # =====================================================
  # 分布式 key-value 数据库
  #
  # 在 Milvus 中用于存储:
  # - collection 元信息
  # - segment 状态
  # - 索引信息
  # - 系统元数据
  #
  # 不对外暴露端口,只在 docker 内部网络使用
  # =====================================================
  etcd:

    container_name: milvus-etcd

    image: ${ETCD_IMAGE}

    restart: unless-stopped

    environment:

      # 自动压缩历史 revision
      # 防止 etcd 数据无限增长
      ETCD_AUTO_COMPACTION_MODE: revision

      # 保留最近 1000 个 revision
      ETCD_AUTO_COMPACTION_RETENTION: 1000

      # etcd 数据库存储上限
      # 4GB
      ETCD_QUOTA_BACKEND_BYTES: 4294967296

      # 每 50000 次写入创建一次 snapshot
      ETCD_SNAPSHOT_COUNT: 50000

    volumes:

      # =================================================
      # etcd 数据持久化
      #
      # ${VOLUME_ROOT:-./data}
      #
      # 含义:
      # 如果定义了 VOLUME_ROOT 就使用 VOLUME_ROOT
      # 否则默认使用 ./data
      #
      # 示例:
      #
      # Linux
      # /data/milvus/etcd
      #
      # Windows
      # D:/milvus/etcd
      # =================================================
      - ${VOLUME_ROOT:-./data}/etcd:/etcd

    command: >
      etcd
      --advertise-client-urls=http://etcd:2379
      --listen-client-urls=http://0.0.0.0:2379
      --data-dir=/etcd

    healthcheck:

      # 检查 etcd 是否健康
      test: ["CMD", "etcdctl", "endpoint", "health"]

      interval: 30s
      timeout: 20s
      retries: 3

    networks:
      - milvus


  # =====================================================
  # MinIO
  # =====================================================
  #
  # 对象存储系统(兼容 S3)
  #
  # 在 Milvus 中存储:
  # - 向量数据
  # - segment 文件
  # - index 文件
  #
  # =====================================================
  minio:

    container_name: milvus-minio

    image: ${MINIO_IMAGE}

    restart: unless-stopped

    environment:

      # MinIO root 用户
      MINIO_ROOT_USER: ${MINIO_ROOT_USER}

      # MinIO root 密码
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}

    volumes:

      # MinIO 数据存储目录
      - ${VOLUME_ROOT:-./data}/minio:/minio_data

    command: minio server /minio_data --console-address ":9001"

    ports:

      # S3 API
      - "${MINIO_API_PORT}:9000"

      # MinIO 控制台
      - "${MINIO_CONSOLE_PORT}:9001"

    healthcheck:

      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]

      interval: 30s
      timeout: 20s
      retries: 3

    networks:
      - milvus


  # =====================================================
  # Milvus
  # =====================================================
  #
  # 向量数据库核心服务
  #
  # Standalone 模式适用于:
  # - 开发
  # - 中小规模生产
  #
  # 如果是超大规模生产
  # 推荐 Milvus Cluster 模式
  # =====================================================
  milvus:

    container_name: milvus-standalone

    image: ${MILVUS_IMAGE}

    restart: unless-stopped

    command: ["milvus", "run", "standalone"]

    security_opt:
      - seccomp:unconfined

    environment:

      # etcd 地址
      ETCD_ENDPOINTS: etcd:2379

      # MinIO 地址
      MINIO_ADDRESS: minio:9000

      # MinIO access key
      MINIO_ACCESS_KEY_ID: ${MINIO_ROOT_USER}

      # MinIO secret key
      MINIO_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD}

      # S3 region
      MINIO_REGION: us-east-1

    volumes:

      # Milvus 本地存储
      # 存储 WAL、缓存等
      - ${VOLUME_ROOT:-./data}/milvus:/var/lib/milvus

    ports:

      # Milvus gRPC API
      - "${MILVUS_PORT}:19530"

      # 健康检查接口
      - "${MILVUS_HEALTH_PORT}:9091"

    depends_on:
      - etcd
      - minio

    healthcheck:

      test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]

      interval: 30s
      start_period: 90s
      timeout: 20s
      retries: 3

    networks:
      - milvus


  # =====================================================
  # Attu
  # =====================================================
  #
  # Milvus 官方图形管理界面
  #
  # 可以进行:
  # - collection 管理
  # - 向量插入
  # - 向量搜索
  # - index 创建
  # =====================================================
  attu:

    container_name: milvus-attu

    image: ${ATTU_IMAGE}

    restart: unless-stopped

    ports:
      - "${ATTU_PORT}:3000"

    environment:

      # Milvus 地址
      MILVUS_URL: milvus:19530

    depends_on:
      - milvus

    networks:
      - milvus


# =====================================================
# Docker 网络
# =====================================================
# 所有服务运行在同一个 bridge 网络
# 可以通过 service name 互相访问
#
# 例如:
# milvus -> etcd:2379
# milvus -> minio:9000
# =====================================================
networks:

  milvus:

    name: milvus-network

    driver: bridge

2.6.5 启动

进入当前目录:

docker compose up -d

在这里插入图片描述

查看:

docker ps

在这里插入图片描述

查看网络:

docker network ls

在这里插入图片描述


2.6.6 访问地址

使用默认的端口号

服务 地址 说明 类型
Attu http://localhost:3000 Milvus Web 管理界面 Web UI
MinIO Console http://localhost:9001 对象存储管理界面 Web UI
Milvus gRPC localhost:19530 向量数据库 API gRPC 是一种 RPC 通信协议:
• 基于 HTTP/2
• 使用 Protocol Buffers
• 供程序调用(Python / Java / Go / Node)
• 不能通过浏览器直接访问

在这里插入图片描述
在这里插入图片描述


Logo

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

更多推荐