MongoDB 监控(九)dbStats

快猫实习生 2024-11-16 20:05:55

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() 是一样的,只是多了两个参数 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:缩放因子。
  • fsUsedSize:文件系统使用大小。
  • fsTotalSize:文件系统总大小。
  • ok:命令执行结果。

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

总结

通过 dbStats 命令可以获取 MongoDB 实例的使用情况,包括数据大小、索引大小、对象数量、文件系统占用大小等等。通过 dbStats 可以使我们对 MongoDB 实例的使用情况有一个大概的了解。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat