不能只看db.stats()因它不反映真实磁盘剩余空间,分片集群中需监控各Shard节点操作系统级磁盘使用率,依赖node_exporter采集文件系统指标并协同mongodb_exporter实现告警与下钻分析。

磁盘空间告警为什么不能只看 db.stats()?
因为 db.stats() 返回的是逻辑数据库大小(dataSize + storageSize),不反映底层文件系统真实剩余空间。分片集群中,每个 mongod 节点(Shard、Config Server)都独立挂载磁盘,一旦某 Shard 的磁盘写满,整个分片路由会失败,写入阻塞,但 db.stats() 完全感知不到。必须监控操作系统级磁盘使用率。
Exporter 怎么暴露磁盘指标?关键在 node_exporter + mongodb_exporter 协同
单纯靠 mongodb_exporter 无法获取磁盘空间数据——它只采集 MongoDB 内部指标(如 mongodb_mongod_dbstats_dataSize_bytes)。真实磁盘空间得靠 node_exporter 提供的 node_filesystem_avail_bytes 和 node_filesystem_size_bytes。
实操要点:
- 确保
node_exporter在每个 MongoDB 节点(Shard、Config、Mongos 所在机器)上运行,且启用--collector.filesystem.mount-points指定 MongoDB 数据目录挂载点(例如/var/lib/mongodb) -
mongodb_exporter需用--collectors.enabled=standard,dbstats,collstats启动,但别指望它报磁盘满 - Prometheus 抓取配置里必须同时包含
node和mongodb两个 job,否则无法关联节点与实例
如何写 PromQL 告警规则识别「即将写满」的 Shard?
不能等 node_filesystem_avail_bytes == 0 才触发——那时已晚。要提前预警,且区分不同节点角色。
推荐规则(适用于分片集群):
ALERT MongoDBShardDiskFull
IF 100 * (1 - node_filesystem_avail_bytes{mountpoint="/var/lib/mongodb",fstype=~"xfs|ext4"} / node_filesystem_size_bytes{mountpoint="/var/lib/mongodb",fstype=~"xfs|ext4"}) > 90
FOR 5m
LABELS { severity = "critical" }
ANNOTATIONS {
summary = "Shard disk usage > 90% on {{ $labels.instance }}",
description = "Mount point {{ $labels.mountpoint }} is filling up. Check shard data growth or TTL policies."
}
注意点:
- 用
mountpoint标签精准匹配 MongoDB 数据目录,避免误报系统盘 - 加
FOR 5m防抖,排除瞬时日志刷盘干扰 - 若 Config Server 和 Shard 共用同一挂载点,需通过
instance标签或 Prometheus 服务发现标签(如__meta_consul_tags)进一步区分角色
Grafana 仪表盘里怎么快速定位哪个 Shard 磁盘最紧张?
单靠一个大盘数字没用,得支持下钻。核心是利用 Prometheus 的多维标签和 Grafana 变量。
建议做法:
- 创建 Grafana 变量
$shard_node,数据源为label_values(node_filesystem_avail_bytes{mountpoint="/var/lib/mongodb"}, instance) - 主图表用
100 - 100 * avg by(instance) (node_filesystem_avail_bytes{mountpoint="/var/lib/mongodb"} / node_filesystem_size_bytes{mountpoint="/var/lib/mongodb"}),按instance分组显示各节点使用率 - 点击某个高值条形图,自动跳转到该
$shard_node的详情页,叠加显示:mongodb_mongod_dbstats_storageSize_bytes(实际占用)、rate(mongodb_mongod_op_counters_insert_total[1h])(写入速率)、mongodb_mongod_metrics_record_moves_total(数据迁移频次)
真正容易被忽略的是:分片集群中,mongos 节点本身不存数据,但它的日志和审计文件也可能占满磁盘;而 Config Server 的 config 库增长缓慢,但一旦磁盘满,整个集群元数据更新就卡死——这两类节点的磁盘告警阈值建议设得比 Shard 更宽松(比如 85%),但绝不能漏掉。











