
这是 MongoDB 监控系列文章的第九篇,前面几篇文章的链接如下:
- MongoDB 监控(一)
- MongoDB 监控(二)
- MongoDB 监控(三)
- MongoDB 监控(四)
- MongoDB 监控(五)
- MongoDB 监控(六)
- 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() 是一样的,只是多了两个参数 scale 和 freeStorage,scale 是一个倍数,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 适合回答哪些监控问题
| 问题 | 可参考字段 | 说明 |
|---|---|---|
| 当前库有多少集合和文档 | collections、objects |
用于理解库的规模,不建议单独作为故障告警 |
| 数据和索引占用多大 | dataSize、indexSize、storageSize、totalSize |
适合做容量趋势和空间分析 |
| 文件系统空间是否紧张 | fsUsedSize、fsTotalSize |
可计算磁盘使用率,通常也可以由主机监控提供 |
| 是否需要查看 free 空间 | freeStorageSize、indexFreeStorageSize、totalFreeStorageSize |
需要 freeStorage: 1,注意采集成本 |
使用 dbStats 的注意事项
- 先明确统计范围。在哪个数据库执行,就返回哪个数据库的统计信息。
- 采集频率不宜过高。dbStats 更偏容量信息,通常不需要像 QPS、连接数那样高频采集。
- 慎用
freeStorage: 1。它能提供更细的空间信息,但计算相对更耗时。 - 展示时选择合适的
scale。人工排查可以用 1024 让输出更易读,采集器上报时则要保持单位一致。
总结
通过 dbStats 命令可以获取 MongoDB 数据库的使用情况,包括数据大小、索引大小、对象数量、文件系统占用大小等。它不如 serverStatus 那样适合描述实时运行状态,但很适合补齐容量视角。做 MongoDB 监控时,可以把 dbStats 放在“容量和空间”这一类仪表盘里,和主机磁盘使用率、数据库增长趋势一起看。
FAQ
Q1:dbStats 统计的是整个 MongoDB 实例吗?
A:不是。它统计的是当前数据库。在哪个库里执行 db.stats(),就返回哪个库的统计信息。
Q2:dbStats 最值得监控的字段是什么?
A:从原文视角看,最直接的是 fsUsedSize / fsTotalSize 计算出的磁盘使用率;同时也可以关注 dataSize、indexSize 和 totalSize 的容量趋势。
Q3:freeStorage: 1 是否应该默认开启?
A:不建议无脑开启。它会额外输出 free 相关字段,但计算相对更耗时,是否开启要看容量分析需求。
