MongoDB 监控(九)dbStats
这是 MongoDB 监控系列文章的第九篇,前面几篇文章的链接如下:
- MongoDB 监控(一)
- MongoDB 监控(二)
- MongoDB 监控(三)
- MongoDB 监控(四)
- MongoDB 监控(五)
- MongoDB 监控(六)
- MongoDB 监控(七)
- MongoDB 监控(八)
上一篇我们通过探索 mongostats 命令的输出,了解了 MongoDB 常用的监控指标。实际上各个监控工具都是作为一个 client 连到 MongoDB 实例然后执行一些命令获取 MongoDB 实例的监控数据,本文我们会介绍 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 库的统计信息。
实际上,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
:缩放因子。fsUsedSize
:文件系统使用大小。fsTotalSize
:文件系统总大小。ok
:命令执行结果。
其中,storageSize + indexSize = totalSize
。从监控的角度,上面的内容价值并没有太大,看起来只需要关注 fsUsedSize / fsTotalSize
即可,即磁盘使用率,如果磁盘使用率过高,就需要考虑扩容磁盘了。当然了,这个数据不从 MongoDB 中获取也是 OK 的,一般 agent 都会默认采集各个磁盘的使用率。
总结
通过 dbStats 命令可以获取 MongoDB 实例的使用情况,包括数据大小、索引大小、对象数量、文件系统占用大小等等。通过 dbStats 可以使我们对 MongoDB 实例的使用情况有一个大概的了解。