云服务器部署 Milvus 向量数据库完整指南:从零到成功运行

前言

Milvus 是一个开源的向量数据库,专为 AI 应用和机器学习工作负载而设计。它能够高效地存储、索引和搜索大规模向量数据,是构建推荐系统、图像搜索、自然语言处理等 AI 应用的重要基础设施。

本文将详细介绍如何在云服务器上部署 Milvus v2.6.2,包括完整的部署过程、遇到的问题及解决方案,以及部署后的验证和使用方法。

环境准备

服务器配置要求

  • 操作系统: Linux (本文使用 CentOS/Ubuntu)

  • 内存: 建议至少 4GB (我的环境是16GB阿里云云服务器)

  • 存储: 建议至少 20GB 可用空间

  • 网络: 稳定的互联网连接

  • Docker: 已安装 Docker 和 Docker Compose

检查服务器资源

# 检查内存使用情况
free -h
​
# 检查磁盘空间
df -h
​
# 检查 Docker 状态
sudo systemctl status docker

部署尝试历程

第一次尝试:Docker Compose 部署(失败)

最初,我尝试使用 Docker Compose 方式部署 Milvus,这是官方推荐的另一种部署方式。

1. 下载 docker-compose.yml

# 下载 Milvus Docker Compose 配置文件
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
# 或者直接下载 docker-compose.yml
wget https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh

2. 遇到的问题

使用 Docker Compose 部署时遇到了以下问题:

问题1: etcd 连接超时

 

问题2: Milvus 启动失败

panic: failed to create etcd client: context deadline exceeded

3. 失败原因分析

  1. etcd 服务未正确启动: Docker Compose 中的 etcd 服务可能没有正确配置或启动

  2. 网络连接问题: 容器间网络通信出现问题

  3. 配置复杂: Docker Compose 需要配置多个服务(Milvus、etcd、MinIO 等)

4. 解决方案尝试

尝试了以下方法但都未成功:

# 尝试重启 Docker Compose 服务
docker-compose down
docker-compose up -d
​
# 检查容器状态
docker-compose ps
​
# 查看日志
docker-compose logs milvus
docker-compose logs etcd

第二次尝试:官方脚本部署(成功)

由于 Docker Compose 部署遇到问题,转而使用官方提供的 standalone_embed.sh 脚本部署。官方文档:快速入门 | Milvus 文档

成功部署步骤

1. 下载安装脚本

# 下载 Milvus 安装脚本
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
​
# 给脚本执行权限
chmod +x standalone_embed.sh

2. 启动 Milvus 部署

# 启动 Milvus 部署
bash standalone_embed.sh start

3. 部署过程详解

3.1 镜像下载阶段

部署脚本会自动下载 Milvus v2.6.2 镜像,这个过程可能需要 10-30 分钟,具体时间取决于网络速度:

Unable to find image 'milvusdb/milvus:v2.6.2' locally
v2.6.2: Pulling from milvusdb/milvus
7646c8da3324: Already exists 
232928bf0cec: Pull complete 
d0c0ceb106a0: Pull complete 
7dfb73baa5d3: Pull complete 
c982406aa267: Pull complete 
d7388a78c1a2: Pull complete 
ab1c981276db: Pull complete 
Digest: sha256:215400dc74c03393e4c28d808c1efbbbd7f1f46e94ba73b4e583df3ccd81105e
Status: Downloaded newer image for milvusdb/milvus:v2.6.2

3.2 配置文件自动生成

脚本会自动创建必要的配置文件:

  • embedEtcd.yaml: etcd 数据库配置

  • user.yaml: Milvus 用户自定义配置

3.3 容器启动阶段

Wait for Milvus Starting...
Start successfully.
To change the default Milvus configuration, add your settings to the user.yaml file and then restart the service.

遇到的问题及解决方案

问题1: 镜像下载缓慢

现象: 下载卡在某个进度,长时间无响应

解决方案:

  1. 配置国内镜像源:

# 创建 Docker 配置目录
sudo mkdir -p /etc/docker
​
# 配置镜像源
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}
EOF
​
# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 中断并重新下载:

# 按 Ctrl+C 中断当前下载
# 重新运行部署脚本
bash standalone_embed.sh start

问题2: 网络连接不稳定

现象: 下载过程中断,需要重新开始

解决方案:

  • 确保服务器网络连接稳定

  • 使用 screentmux 保持会话:

# 使用 screen 保持会话
screen -S milvus
bash standalone_embed.sh start
# 按 Ctrl+A+D 分离会话

问题3: 版本冲突

现象: 服务器上已有旧版本 Milvus 镜像

解决方案:

# 查看现有镜像
sudo docker images | grep milvus
​
# 删除旧版本(可选)
sudo docker rmi milvusdb/milvus:v2.6.0-rc1
​
# 继续下载新版本
bash standalone_embed.sh start

Docker Compose vs 官方脚本对比

特性 Docker Compose 官方脚本
配置复杂度 高,需要配置多个服务 低,一键部署
稳定性 依赖多个服务协调 高,嵌入式 etcd
资源占用 高,多个容器 低,单容器
维护难度 高,需要管理多个服务 低,统一管理
适用场景 生产环境,需要高可用 开发测试,快速部署

部署验证

1. 检查容器状态

# 查看 Milvus 容器状态
sudo docker ps | grep milvus
​
# 预期输出
dd56dc7401fb   milvusdb/milvus:v2.6.2   "/tini -- milvus run…"   59 seconds ago   Up 59 seconds (healthy)   0.0.0.0:2379->2379/tcp, :::2379->2379/tcp, 0.0.0.0:9091->9091/tcp, :::9091->9091/tcp, 0.0.0.0:19530->19530/tcp, :::19530->19530/tcp   milvus-standalone

2. 健康检查

# 检查服务健康状态
curl -f http://localhost:9091/healthz
​
# 预期输出
OK

3. 查看容器日志

# 查看 Milvus 启动日志
sudo docker logs milvus-standalone

服务配置

端口说明

  • 19530: Milvus 服务端口,用于客户端连接

  • 9091: Milvus WebUI 端口,用于管理界面

  • 2379: etcd 端口,用于分布式协调

安全组配置

在云服务器控制台配置安全组,开放必要端口:

# 阿里云/腾讯云安全组规则
# 入方向规则:
# 端口: 19530, 协议: TCP, 源: 0.0.0.0/0
# 端口: 9091, 协议: TCP, 源: 0.0.0.0/0
# 端口: 2379, 协议: TCP, 源: 0.0.0.0/0 (可选)

防火墙配置

# Ubuntu/Debian
sudo ufw allow 19530
sudo ufw allow 9091
sudo ufw allow 2379
​
# CentOS/RHEL
sudo firewall-cmd --permanent --add-port=19530/tcp
sudo firewall-cmd --permanent --add-port=9091/tcp
sudo firewall-cmd --permanent --add-port=2379/tcp
sudo firewall-cmd --reload

使用 Milvus

1. 访问 WebUI

部署成功后,可以通过浏览器访问 Milvus WebUI:

http://your-server-ip:9091/webui/

2. Python 客户端连接

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
​
# 连接到 Milvus
connections.connect(
    alias="default",
    host='your-server-ip',  # 替换为你的服务器IP
    port='19530'
)
​
print("Successfully connected to Milvus!")
​
# 创建集合示例
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)
]
schema = CollectionSchema(fields, "test collection")
collection = Collection("test_collection", schema)
​
print("Collection created successfully!")

3. 基本操作示例

import numpy as np
from pymilvus import Collection
​
# 获取集合
collection = Collection("test_collection")
​
# 插入向量数据
vectors = np.random.random((1000, 128)).tolist()
collection.insert([vectors])
​
# 创建索引
index_params = {
    "metric_type": "L2",
    "index_type": "IVF_FLAT",
    "params": {"nlist": 128}
}
collection.create_index("embedding", index_params)
​
# 加载集合到内存
collection.load()
​
# 搜索向量
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = collection.search(
    data=[vectors[0]], 
    anns_field="embedding", 
    param=search_params, 
    limit=10
)
​
print(f"Search results: {results}")

管理命令

常用管理操作

# 启动服务
bash standalone_embed.sh start
​
# 停止服务
bash standalone_embed.sh stop
​
# 重启服务
bash standalone_embed.sh restart
​
# 升级到最新版本
bash standalone_embed.sh upgrade
​
# 删除容器和数据(谨慎使用)
bash standalone_embed.sh delete

数据备份

# 备份数据目录
tar -czf milvus_backup_$(date +%Y%m%d).tar.gz volumes/
​
# 恢复数据
tar -xzf milvus_backup_20231201.tar.gz

性能优化建议

1. 资源配置

  • 内存: 根据数据量调整,建议至少 8GB

  • CPU: 多核 CPU 有助于并行处理

  • 存储: 使用 SSD 提高 I/O 性能

2. 索引优化

# 选择合适的索引类型
index_params = {
    "metric_type": "L2",  # 或 "IP", "COSINE"
    "index_type": "IVF_PQ",  # 或 "HNSW", "IVF_FLAT"
    "params": {"nlist": 1024, "m": 8, "nbits": 8}
}

3. 查询优化

# 调整搜索参数
search_params = {
    "metric_type": "L2",
    "params": {"nprobe": 16}  # 增加 nprobe 提高召回率
}

监控和维护

1. 系统监控

# 监控容器资源使用
docker stats milvus-standalone
​
# 监控系统资源
htop

2. 日志管理

# 查看实时日志
docker logs -f milvus-standalone
​
# 清理旧日志
docker system prune -f

3. 健康检查

# 定期健康检查脚本
#!/bin/bash
if curl -f http://localhost:9091/healthz > /dev/null 2>&1; then
    echo "Milvus is healthy"
else
    echo "Milvus is down, restarting..."
    bash standalone_embed.sh restart
fi

常见问题排查

1. 连接失败

# 检查端口是否开放
netstat -tulpn | grep 19530
​
# 检查防火墙状态
sudo ufw status

2. 内存不足

# 检查内存使用
free -h
​
# 清理 Docker 缓存
docker system prune -a

3. 磁盘空间不足

# 检查磁盘使用
df -h
​
# 清理 Docker 镜像
docker image prune -a

经验总结

部署方式选择建议

  1. 开发测试环境: 推荐使用官方脚本 standalone_embed.sh

    • 配置简单,一键部署

    • 资源占用少

    • 维护方便

  2. 生产环境: 可以考虑 Docker Compose 或 Kubernetes

    • 需要更多配置和调试

    • 支持高可用和负载均衡

    • 需要专业的运维知识

关键成功因素

  1. 网络稳定性: 确保下载过程中网络连接稳定

  2. 资源配置: 根据实际需求调整服务器配置

  3. 安全设置: 正确配置安全组和防火墙

  4. 监控维护: 定期检查服务状态和资源使用

  5. 版本选择: 使用稳定版本而非候选版本

下一步

部署完成后,你可以:

  1. 通过 WebUI 管理 Milvus,我用的是attu,同样通过docker部署

  2. 使用 Python/Java 等客户端进行开发

  3. 根据业务需求调整配置参数

  4. 建立监控和备份机制

Milvus 作为强大的向量数据库,为 AI 应用提供了坚实的基础设施支持。本文能够帮助你顺利部署和使用 Milvus!


 

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐