企业级 Milvus 部署全攻略:Docker Compose 安装 + 外部访问 + 持久化存储
前言
Milvus 是一个开源的向量数据库,专为嵌入式向量相似度搜索和 AI 应用设计。本指南将详细介绍如何通过 Docker Compose 进行企业级部署,包括持久化存储配置和外部访问设置。
环境准备
硬件推荐配置
- CPU: 8+ 核
- 内存: 16+ GB
- 存储: SSD 或高性能云存储
- 网络: 千兆网络或更高
软件要求
- Docker Engine (20.10.0+)
- Docker Compose (1.28.0+)
- Linux 操作系统 (推荐 Ubuntu 20.04 LTS 或更高版本)
安装 Docker 和 Docker Compose
# 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.18.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker --version
docker-compose --version
使用 Docker Compose 部署 Milvus
创建项目目录
mkdir -p ~/milvus-cluster
cd ~/milvus-cluster
创建 Docker 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_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://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.3.3
command: ["milvus", "run", "standalone"]
environment:
- ETCD_ENDPOINTS=etcd:2379
- MINIO_ADDRESS=minio:9000
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
ports:
- "19530:19530"
- "9091:9091"
depends_on:
- "etcd"
- "minio"
networks:
default:
name: milvus
启动 Milvus
docker-compose up -d
验证部署
# 检查容器状态
docker-compose ps
# 检查 Milvus 日志
docker-compose logs -f standalone
配置持久化存储
Milvus 使用 MinIO 作为对象存储,用于存储向量数据,使用 etcd 存储元数据。前面的 Docker Compose 配置已经包含了持久化的设置,但我们可以进一步增强和优化:
创建专用存储目录
# 创建专用目录并设置权限
sudo mkdir -p /data/milvus/{etcd,minio,milvus}
sudo chown -R 1000:1000 /data/milvus/
更新 Docker Compose 配置
修改 docker-compose.yml
中的卷映射:
volumes:
- /data/milvus/etcd:/etcd # etcd 服务
- /data/milvus/minio:/minio_data # MinIO 服务
- /data/milvus/milvus:/var/lib/milvus # Milvus 服务
配置备份策略
创建备份脚本 backup.sh
:
#!/bin/bash
# Milvus 数据备份脚本
BACKUP_DIR="/backup/milvus/$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR
# 停止 Milvus 服务
cd ~/milvus-cluster
docker-compose stop
# 备份数据
cp -r /data/milvus/etcd $BACKUP_DIR/
cp -r /data/milvus/minio $BACKUP_DIR/
cp -r /data/milvus/milvus $BACKUP_DIR/
# 重启 Milvus 服务
docker-compose start
echo "Backup completed: $BACKUP_DIR"
设置权限并配置定时任务:
chmod +x backup.sh
sudo crontab -e
# 添加以下行,每天凌晨 2 点执行备份
0 2 * * * /home/user/milvus-cluster/backup.sh >> /var/log/milvus-backup.log 2>&1
配置外部访问
配置 Milvus 监听所有 IP
修改 Docker Compose 配置,添加环境变量:
environment:
- ETCD_ENDPOINTS=etcd:2379
- MINIO_ADDRESS=minio:9000
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
- PROXY_PORT=19530
- PROXY_EXTERNAL_IP=0.0.0.0 # 允许外部访问
配置防火墙
# 允许 Milvus 端口通过防火墙
sudo ufw allow 19530/tcp
sudo ufw allow 9091/tcp
配置 Nginx 反向代理(可选)
安装 Nginx:
sudo apt update
sudo apt install nginx -y
创建 Nginx 配置文件 /etc/nginx/sites-available/milvus
:
server {
listen 80;
server_name milvus.yourdomain.com;
location / {
proxy_pass http://localhost:19530;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /metrics {
proxy_pass http://localhost:9091/metrics;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
启用配置:
sudo ln -s /etc/nginx/sites-available/milvus /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
配置 SSL/TLS(推荐)
使用 Let’s Encrypt 获取证书:
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d milvus.yourdomain.com
性能调优
调整系统参数
创建 /etc/sysctl.d/99-milvus.conf
文件:
# 增加文件打开数量限制
fs.file-max = 1000000
# 增加 TCP 连接数
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_syncookies = 1
# 提高网络性能
net.core.netdev_max_backlog = 65536
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 5000
应用系统参数:
sudo sysctl -p /etc/sysctl.d/99-milvus.conf
调整容器资源限制
更新 Docker Compose 配置,添加资源限制:
services:
standalone:
# 其他配置...
deploy:
resources:
limits:
cpus: '8'
memory: 32G
reservations:
cpus: '2'
memory: 8G
监控与维护
设置 Prometheus 和 Grafana 监控
创建 monitoring/prometheus.yml
配置文件:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'milvus'
static_configs:
- targets: ['milvus-standalone:9091']
创建监控用的 Docker Compose 文件 monitoring/docker-compose.yml
:
version: '3.5'
services:
prometheus:
image: prom/prometheus:v2.45.0
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
ports:
- "9090:9090"
networks:
- milvus
grafana:
image: grafana/grafana:10.0.3
volumes:
- grafana_data:/var/lib/grafana
ports:
- "3000:3000"
networks:
- milvus
volumes:
prometheus_data:
grafana_data:
networks:
milvus:
external: true
启动监控服务:
cd monitoring
docker-compose up -d
访问 Grafana (http://your-server-ip:3000),默认用户名和密码为 admin/admin。添加 Prometheus 数据源并导入 Milvus 仪表板。
日志管理
配置日志轮转,创建 /etc/logrotate.d/milvus
文件:
/data/milvus/logs/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
}
常见问题与解决方案
连接问题
问题: 无法从外部连接 Milvus
解决方案:
- 检查防火墙设置:
sudo ufw status
- 确认 Milvus 监听所有 IP:
docker logs milvus-standalone | grep "bind"
- 测试本地连接:
telnet localhost 19530
性能问题
问题: 搜索响应时间过长
解决方案:
- 增加 Milvus 资源限制
- 优化索引类型和参数
- 监控系统资源使用情况:
htop
数据持久化问题
问题: 重启后数据丢失
解决方案:
- 检查卷映射配置:
docker-compose config
- 检查存储权限:
ls -la /data/milvus/
- 从备份恢复: 执行恢复脚本
内存溢出问题
问题: 容器因内存不足而崩溃
解决方案:
- 增加 Docker 分配的内存
- 监控内存使用情况:
docker stats
- 调整 Milvus 缓存配置
Milvus 企业级部署 docker-compose.yml
version: '3.5'
services:
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
- ETCD_SNAPSHOT_COUNT=50000
volumes:
- /data/milvus/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
restart: always
networks:
- milvus-network
minio:
container_name: milvus-minio
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
environment:
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
volumes:
- /data/milvus/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
restart: always
networks:
- milvus-network
standalone:
container_name: milvus-standalone
image: milvusdb/milvus:v2.3.3
command: ["milvus", "run", "standalone"]
environment:
- ETCD_ENDPOINTS=etcd:2379
- MINIO_ADDRESS=minio:9000
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
- PROXY_PORT=19530
- PROXY_EXTERNAL_IP=0.0.0.0 # 允许外部访问
volumes:
- /data/milvus/milvus:/var/lib/milvus
ports:
- "19530:19530" # Milvus 服务端口
- "9091:9091" # 监控指标端口
depends_on:
- "etcd"
- "minio"
deploy:
resources:
limits:
cpus: '8'
memory: 32G
reservations:
cpus: '2'
memory: 8G
restart: always
networks:
- milvus-network
networks:
milvus-network:
name: milvus
driver: bridge