企业级 Milvus 部署全攻略:Docker Compose 安装 + 外部访问 + 持久化存储

企业级 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

解决方案:

  1. 检查防火墙设置: sudo ufw status
  2. 确认 Milvus 监听所有 IP: docker logs milvus-standalone | grep "bind"
  3. 测试本地连接: telnet localhost 19530

性能问题

问题: 搜索响应时间过长

解决方案:

  1. 增加 Milvus 资源限制
  2. 优化索引类型和参数
  3. 监控系统资源使用情况: htop

数据持久化问题

问题: 重启后数据丢失

解决方案:

  1. 检查卷映射配置: docker-compose config
  2. 检查存储权限: ls -la /data/milvus/
  3. 从备份恢复: 执行恢复脚本

内存溢出问题

问题: 容器因内存不足而崩溃

解决方案:

  1. 增加 Docker 分配的内存
  2. 监控内存使用情况: docker stats
  3. 调整 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
内容概要:文章详细介绍了渤海大学首胜队参加第九届“飞思卡尔”杯全国大学生智能汽车竞赛的情况。该竞赛涵盖控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科,旨在推动汽车智能化技术的发展。文中首先阐述了智能汽车的研究背景及其重要性,强调智能化是未来汽车发展的趋势。接着介绍了基于MK60DN512VLQ10微处理器的智能车设计方案,包括机械设计(悬挂、轮胎、舵机等)、电路设计(电源管理、电机驱动、红外检测、摄像头、编码器等)和动作设计(腾空飞跃、漂移过弯、走双边桥、过转盘、侧边行车、漂移入位)。文章还展示了系统框图,详细列出了各模块的功能和连接方式。最后总结了团队在整个项目中的收获,包括遇到的问题、解决方案以及团队协作的经验。 适合人群:对智能汽车竞赛感兴趣的学生和技术爱好者,尤其是参与类似竞赛或研究项目的人员。 使用场景及目标:①帮助读者了解智能汽车竞赛的具体流程和技术要求;②为准备参加此类竞赛的团队提供参考案例和技术支持;③展示如何将多学科知识融合应用于实际工程项目中。 其他说明:本文不仅提供了详细的硬件设计和软件编程指导,还分享了团队在比赛过程中积累的经验教训,强调了团队合作的重要性。此外,文章附有详细的参考文献列表,方便读者进一步查阅相关资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI Agent首席体验官

您的打赏是我继续创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值