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 实例的使用情况有一个大概的了解。

联系我们交流

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