Docker 部署 Milvus 日志把磁盘写满?排查与解决全攻略
背景
在 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 个微服务进程:
每个组件都会独立写日志,这在 Docker 容器环境下直接表现为多个日志流同时向磁盘写入。相比之下,MySQL、Redis 等是单进程,日志量级不在同一水平。
2.2 Milvus 默认无日志轮转
Milvus 默认没有配置日志轮转(log rotation),每个组件的日志文件会无限增长。加之向量数据库在处理 ANN 搜索、segment compaction、索引构建等操作时日志密度极高,日志文件体积增长速度远超传统关系数据库。
2.3 两层日志需要分别管理
Milvus 日志实际上分两层:
Milvus 进程日志 — 写入容器内的
/var/lib/milvus/logs/,由 Milvus 自身管理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 配置后,已有的容器日志不会被清理,只有新创建的容器才会使用新配置。