avatar

超级赛亚人技术站

保持饥饿,保持战斗

  • 首页
主页 Docker 部署 Milvus 日志把磁盘写满?排查与解决全攻略
文章

Docker 部署 Milvus 日志把磁盘写满?排查与解决全攻略

发表于 26天前 更新于 26天前
作者 Administrator
51~66 分钟 阅读

背景

在 Docker 环境中部署 Milvus 向量数据库后,运行一段时间后发现磁盘空间告急。排查发现罪魁祸首是 Milvus 的日志文件占用了大量空间。本文记录完整的问题排查思路与解决方案。


一、问题现象

部署命令使用了 milvus-stack-2.6.6.compose.yaml,使用默认配置启动后,服务器磁盘空间持续下降,最终导致写入失败甚至服务异常。

cd /ragent/环境部署脚本 && docker compose -f milvus-stack-2.6.6.compose.yaml up -d

典型的告警信号:

  • 服务器磁盘使用率从 30% 飙升至 90%+

  • 容器状态显示 unhealthy

  • 写入向量数据时报错 no space left on device


二、问题根因分析

2.1 Milvus 的多组件架构是日志爆炸的根源

Milvus 虽然以 standalone 模式运行,但内部包含了 6~7 个微服务进程:

组件

职责

Proxy

客户端请求代理

QueryCoord / QueryNode

查询协调与执行

DataCoord / DataNode

数据协调与写入

IndexCoord / IndexNode

索引构建

RootCoord

元数据管理

每个组件都会独立写日志,这在 Docker 容器环境下直接表现为多个日志流同时向磁盘写入。相比之下,MySQL、Redis 等是单进程,日志量级不在同一水平。

2.2 Milvus 默认无日志轮转

Milvus 默认没有配置日志轮转(log rotation),每个组件的日志文件会无限增长。加之向量数据库在处理 ANN 搜索、segment compaction、索引构建等操作时日志密度极高,日志文件体积增长速度远超传统关系数据库。

2.3 两层日志需要分别管理

Milvus 日志实际上分两层:

  1. Milvus 进程日志 — 写入容器内的 /var/lib/milvus/logs/,由 Milvus 自身管理

  2. Docker 容器日志 — 由 Docker Engine 管理,写入宿主机 /var/lib/docker/containers/

只配置其中一层是不够的,两层都可能把磁盘撑满。


三、排查步骤

3.1 检查磁盘使用情况

# 查看根目录磁盘占用

df -h /

# 定位最大的目录

du -sh /* 2>/dev/null | sort -rh | head -10

# 进入 Docker 数据目录深入查看

du -sh /var/lib/docker/containers/* 2>/dev/null | sort -rh | head -10

3.2 查看 Milvus 各组件日志

# 查看 Milvus 容器进程日志(Milvus 自身管理的日志)

docker exec milvus-standalone ls -lh /var/lib/milvus/logs/

# 实时查看最新日志

docker logs -f milvus-standalone --tail 100

# 查看各组件日志文件大小

docker exec milvus-standalone du -sh /var/lib/milvus/logs/*

3.3 查看 Docker 容器日志大小

# 查看 Docker 日志文件大小

ls -lh /var/lib/docker/containers/*/*-json.log 2>/dev/null

# 查看 docker-compose 各服务的日志大小

docker compose -f milvus-stack-2.6.6.compose.yaml logs --tail 1

3.4 确认日志来源

# 查看各容器的日志详情

docker inspect --format='{{.LogPath}}' milvus-standalone

docker inspect --format='{{.LogPath}}' etcd-for-milvus


四、解决方案

4.1 方案一:配置 Milvus 自身日志限制(进程级)

在 docker-compose.yml 的 Milvus 服务中添加以下三个环境变量:

services:

milvus-standalone:

environment:

LOG_LEVEL: warning # 日志级别: debug < info < warning < error

LOG_FILE_SIZE: 50MB # 单个日志文件最大体积

LOG_FILE_MAX_NUM: 20 # 最多保留多少个日志文件

重启生效:

docker compose -f milvus-stack-2.6.6.compose.yaml down && \

docker compose -f milvus-stack-2.6.6.compose.yaml up -d

原理: LOG_FILE_MAX_NUM × LOG_FILE_SIZE 决定了 Milvus 进程日志的最大磁盘占用量(约 1GB)。超出限制后,最旧的日志文件会被删除。

4.2 方案二:配置 Docker 容器日志限制(引擎级)

即使 Milvus 进程日志被限制了,Docker 自身的日志仍然会无限增长。需要在 docker-compose 配置中加入 logging 字段:

services:

milvus-standalone:

logging:

driver: json-file

options:

max-size: "100m" # 单个日志文件最大 100MB

max-file: "5" # 最多保留 5 个日志文件

# ... 其他配置保持不变

etcd-for-milvus:

logging:

driver: json-file

options:

max-size: "50m"

max-file: "3"

minio:

logging:

driver: json-file

options:

max-size: "100m"

max-file: "3"

4.3 方案三:全局修改 Docker daemon 配置(推荐)

以上方案只影响新创建的容器。如果要全局生效,需修改 Docker daemon 配置:

# 创建或编辑 Docker 配置

sudo nano /etc/docker/daemon.json

写入以下内容:

{

"log-driver": "json-file",

"log-opts": {

"max-size": "100m",

"max-file": "5"

}

}

然后重启 Docker daemon:

# Linux

sudo systemctl restart docker

# Windows (Docker Desktop)

# 重启 Docker Desktop 应用即可

⚠️ 注意: 修改 daemon 配置后,已有的容器日志不会被清理,只有新创建的容器才会使用新配置。

故障排查
许可协议:  CC BY 4.0
分享

相关文章

下一篇

上一篇

告别镜像配置 IDEA + Gradle/Maven 全局代理终极配置指南

最近更新

  • Docker 部署 Milvus 日志把磁盘写满?排查与解决全攻略
  • 告别镜像配置 IDEA + Gradle/Maven 全局代理终极配置指南
  • RustFS 容器健康检查问题排查文档
  • RPC接口超时怎么解决?
  • 有 MySQL 为什么还要有 MongoDB?游戏业务的主力数据库

热门标签

故障排查

目录

©2026 超级赛亚人技术站. 保留部分权利。

使用 Halo 主题 Chirpy