MongoDB 监控(九)dbStats

说明 MongoDB dbStats 的执行方式、scale 与 freeStorage 参数、主要字段含义,以及从监控视角如何理解数据量、索引量、总占用和文件系统使用率。

作者 快猫实习生

MongoDB 监控

这是 MongoDB 监控系列文章的第九篇,前面几篇文章的链接如下:

上一篇我们通过探索 mongostats 命令的输出,了解了 MongoDB 常用的监控指标。实际上各个监控工具都是作为一个 client 连到 MongoDB 实例然后执行一些命令获取 MongoDB 实例的监控数据,本文我们会介绍 dbStats 相关的信息。

核心要点

  • db.stats() 用于查看当前数据库的数据量、索引量、集合数量、文档数量和文件系统占用等信息。
  • db.stats()db.runCommand({ dbStats: 1 }) 的简写;需要参数时,可以使用 db.runCommand()
  • scale 用来调整大小类字段的展示单位;freeStorage 可以输出 free 相关字段,但计算相对更耗时。
  • 从监控角度看,dbStats 更偏容量和空间视角,最直接的关注点是数据库占用、索引占用和文件系统使用率。

dbStats

mongostats 命令的官方文档的最后一句话就提到,如果想了解更多关于 MongoDB 的监控信息,可以参考 serverStatus、replSetGetStatus、dbStats 等,我们先来挑个软柿子捏,看看 dbStats。

dbStats 主要用于统计 MongoDB 的用量,包括数据用量、索引用量、磁盘用量、文档数量等,通过如下命令可以获取 dbStats 信息:

admin> db.stats()
{
  db: 'admin',
  collections: Long('3'),
  views: Long('0'),
  objects: Long('8'),
  avgObjSize: 119.125,
  dataSize: 953,
  storageSize: 94208,
  indexes: Long('4'),
  indexSize: 114688,
  totalSize: 208896,
  scaleFactor: Long('1'),
  fsUsedSize: 435767701504,
  fsTotalSize: 494384795648,
  ok: 1
}

在哪个库里执行这个命令,就是输出哪个库的统计信息,上例中我是在 admin 库中执行的,所以输出的是 admin 库的统计信息。

这点对监控很关键:dbStats 的统计对象是“当前数据库”,不是整个 MongoDB 实例的所有库。如果要覆盖多个业务库,采集逻辑需要明确采哪些库,以及如何在指标标签里区分数据库名称。

实际上,db.stats() 命令是 db.runCommand({ dbStats: 1 }) 的简写,可以通过 db.runCommand() 来执行任何数据库命令,比如:

admin> db.runCommand(
...    {
...      dbStats: 1,
...      scale: 1,
...      freeStorage: 0
...    }
... )
{
  db: 'admin',
  collections: Long('3'),
  views: Long('0'),
  objects: Long('8'),
  avgObjSize: 119.125,
  dataSize: 953,
  storageSize: 94208,
  indexes: Long('4'),
  indexSize: 114688,
  totalSize: 208896,
  scaleFactor: Long('1'),
  fsUsedSize: 435767709696,
  fsTotalSize: 494384795648,
  ok: 1
}

这个命令的输出和 db.stats() 是一样的,只是多了两个参数 scalefreeStoragescale 是一个倍数,freeStorage 是一个布尔值,如果为 1,则会多输出几个 free 指标,我们来测试一下:

admin> db.runCommand(
...    {
...      dbStats: 1,
...      scale: 1,
...      freeStorage: 1
...    }
... )
{
  db: 'admin',
  collections: Long('3'),
  views: Long('0'),
  objects: Long('8'),
  avgObjSize: 119.125,
  dataSize: 953,
  storageSize: 94208,
  freeStorageSize: 32768,
  indexes: Long('4'),
  indexSize: 114688,
  indexFreeStorageSize: 32768,
  totalSize: 208896,
  totalFreeStorageSize: 65536,
  scaleFactor: Long('1'),
  fsUsedSize: 435773595648,
  fsTotalSize: 494384795648,
  ok: 1
}

把 freeStorage 设置为 1,额外输出了 freeStorageSize、indexFreeStorageSize、totalFreeStorageSize 等信息,但是要计算 free 的这几个指标相对来讲会更耗时,这点要注意。另外 scale 是一个倍数,如果设置为 1024,那么输出的数据大小单位就是 KB 了,那时更容易查看一些。样例如下:

admin> db.runCommand(
...    {
...      dbStats: 1,
...      scale: 1024,
...      freeStorage: 1
...    }
... )
{
  db: 'admin',
  collections: Long('3'),
  views: Long('0'),
  objects: Long('8'),
  avgObjSize: 119.125,
  dataSize: 0.9306640625,
  storageSize: 92,
  freeStorageSize: 32,
  indexes: Long('4'),
  indexSize: 112,
  indexFreeStorageSize: 32,
  totalSize: 204,
  totalFreeStorageSize: 64,
  scaleFactor: Long('1024'),
  fsUsedSize: 426610724,
  fsTotalSize: 482797652,
  ok: 1
}

各个字段的含义如下:

基础对象统计

  • db:数据库名称。
  • collections:集合数量。
  • views:视图数量。
  • objects:文档数量。
  • avgObjSize:平均文档大小。

这些字段适合回答“这个库大概有多少对象”。它们对容量规划有帮助,但通常不适合作为高频告警的核心指标。

数据、索引和存储大小

  • dataSize:数据大小。
  • storageSize:存储大小。
  • freeStorageSize:剩余存储大小。
  • indexes:索引数量。
  • indexSize:索引大小。
  • indexFreeStorageSize:剩余索引大小。
  • totalSize:总大小。
  • totalFreeStorageSize:剩余总大小。
  • scaleFactor:缩放因子。

这些字段更适合做容量趋势图。比如数据大小持续增长、索引大小明显大于数据大小、freeStorage 变化异常,都可以作为后续分析入口。是否需要告警,要看业务增长规律和磁盘容量策略。

文件系统字段

  • fsUsedSize:文件系统使用大小。
  • fsTotalSize:文件系统总大小。
  • ok:命令执行结果。

其中,storageSize + indexSize = totalSize。从监控的角度,上面的内容价值并没有太大,看起来只需要关注 fsUsedSize / fsTotalSize 即可,即磁盘使用率,如果磁盘使用率过高,就需要考虑扩容磁盘了。当然了,这个数据不从 MongoDB 中获取也是 OK 的,一般 agent 都会默认采集各个磁盘的使用率。

dbStats 适合回答哪些监控问题

问题 可参考字段 说明
当前库有多少集合和文档 collectionsobjects 用于理解库的规模,不建议单独作为故障告警
数据和索引占用多大 dataSizeindexSizestorageSizetotalSize 适合做容量趋势和空间分析
文件系统空间是否紧张 fsUsedSizefsTotalSize 可计算磁盘使用率,通常也可以由主机监控提供
是否需要查看 free 空间 freeStorageSizeindexFreeStorageSizetotalFreeStorageSize 需要 freeStorage: 1,注意采集成本

使用 dbStats 的注意事项

  1. 先明确统计范围。在哪个数据库执行,就返回哪个数据库的统计信息。
  2. 采集频率不宜过高。dbStats 更偏容量信息,通常不需要像 QPS、连接数那样高频采集。
  3. 慎用 freeStorage: 1。它能提供更细的空间信息,但计算相对更耗时。
  4. 展示时选择合适的 scale。人工排查可以用 1024 让输出更易读,采集器上报时则要保持单位一致。

总结

通过 dbStats 命令可以获取 MongoDB 数据库的使用情况,包括数据大小、索引大小、对象数量、文件系统占用大小等。它不如 serverStatus 那样适合描述实时运行状态,但很适合补齐容量视角。做 MongoDB 监控时,可以把 dbStats 放在“容量和空间”这一类仪表盘里,和主机磁盘使用率、数据库增长趋势一起看。

FAQ

Q1:dbStats 统计的是整个 MongoDB 实例吗? A:不是。它统计的是当前数据库。在哪个库里执行 db.stats(),就返回哪个库的统计信息。

Q2:dbStats 最值得监控的字段是什么? A:从原文视角看,最直接的是 fsUsedSize / fsTotalSize 计算出的磁盘使用率;同时也可以关注 dataSizeindexSizetotalSize 的容量趋势。

Q3:freeStorage: 1 是否应该默认开启? A:不建议无脑开启。它会额外输出 free 相关字段,但计算相对更耗时,是否开启要看容量分析需求。

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云