MongoDB 监控(十一)serverStatus

快猫实习生 2024-11-19 14:51:45

MongoDB 监控

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

各类数据库的监控方法都很类似,都是 agent 作为 client 连上去,执行一些命令获取各类指标。即:数据库本身提供了各类指标,但是不会直接暴露为 Prometheus metrics 等固定规范格式。通常每个库都是按照自己的格式输出,MongoDB 的话就是输出位 BSON 格式的数据。

之前系列的文章,我们已经介绍了诸如 db.stats()rs.status() 这样的命令,本文介绍 db.serverStatus(),serverStatus 提供了非常多的指标,我甚至怀疑 MongoDB 自己的某个研发人员都未必能搞明白所有指标。本文我们挑选一部分比较重要的指标做简要说明。

参考文章:https://developer.aliyun.com/article/405274

Connection

mongos [direct: primary] admin> db.serverStatus().connections
{
  current: 56,
  available: 838804,
  totalCreated: 203,
  rejected: 0,
  active: 10,
  threaded: 56,
  exhaustIsMaster: Long('0'),
  exhaustHello: Long('7'),
  awaitingTopologyChanges: Long('7'),
  loadBalanced: Long('0')
}

作为一款 DB,连接数是肯定要监控的,当前连接数、可用连接数、总创建连接数、被拒绝连接数、活跃连接数等都是比较重要的指标。你可以配置一些告警规则,在可用连接数低于某个阈值时报警,另外也建议配置某个时间出现拒绝连接的时候告警。

Asserts

mongos [direct: primary] admin> db.serverStatus().asserts
{
  regular: 0,
  warning: 0,
  msg: 0,
  user: 1762,
  tripwire: 0,
  rollovers: 0
}

上例中 user 的 asserts 是 1762,表示用户操作引起的异常,比如你敲错了命令之类的。regular 和 warning 通常是 0,如果不为 0 需要关注,可以配置告警规则。

globalLock

mongos [direct: primary] admin> db.serverStatus().globalLock
{
  totalTime: Long('82471123000'),
  currentQueue: { total: 0, readers: 0, writers: 0 },
  activeClients: { total: 0, readers: 0, writers: 0 }
}

globalLock 是 MongoDB 的全局锁,totalTime 是全局锁的总时间,currentQueue 是当前队列的情况,activeClients 是当前活跃的客户端情况。如果 currentQueue 较高表示有锁等待。

Locks

mongos [direct: primary] admin> db.serverStatus().locks
{
  MultiDocumentTransactionsBarrier: { acquireCount: { W: Long('8') } },
  ReplicationStateTransition: {
    acquireCount: { w: Long('1877920'), W: Long('2') },
    acquireWaitCount: { w: Long('1') },
    timeAcquiringMicros: { w: Long('9683') }
  },
  Global: {
    acquireCount: { r: Long('2120459'), w: Long('900278'), W: Long('8') },
    acquireWaitCount: { r: Long('1') },
    timeAcquiringMicros: { r: Long('553') }
  },
  Database: {
    acquireCount: { r: Long('11282'), w: Long('809626'), R: Long('1'), W: Long('1') }
  },
  Collection: {
    acquireCount: { r: Long('56627'), w: Long('809612'), W: Long('9') }
  },
  Mutex: { acquireCount: { r: Long('19') } },
  oplog: { acquireCount: { r: Long('2834'), w: Long('2') } }
}

Locks 是颗粒度更小的锁,其中小写的 r、w 表示意向锁,类似乐观锁,即虽然使用了锁但事实上并没有锁住数据。大写的 R、W 是排它锁,它们的值也是累计值,通过它们每秒的增值,我们可以判断出我们系统的健康状况及业务访问的合理程度。

Network

mongos [direct: primary] admin> db.serverStatus().network
{
  bytesIn: Long('138851496'),
  bytesOut: Long('1311199561'),
  physicalBytesIn: Long('70953833'),
  physicalBytesOut: Long('1269348251'),
  numSlowDNSOperations: Long('0'),
  numSlowSSLOperations: Long('0'),
  numRequests: Long('322757'),
  tcpFastOpen: {
    kernelSetting: Long('1'),
    serverSupported: false,
    clientSupported: false,
    accepted: Long('0')
  },
  compression: {
    snappy: {
      compressor: { bytesIn: Long('169469387'), bytesOut: Long('120402691') },
      decompressor: { bytesIn: Long('118296614'), bytesOut: Long('206296460') }
    },
    zstd: {
      compressor: { bytesIn: Long('0'), bytesOut: Long('0') },
      decompressor: { bytesIn: Long('0'), bytesOut: Long('0') }
    },
    zlib: {
      compressor: { bytesIn: Long('0'), bytesOut: Long('0') },
      decompressor: { bytesIn: Long('0'), bytesOut: Long('0') }
    }
  },
  serviceExecutors: {
    passthrough: {
      threadsRunning: 56,
      clientsInTotal: 56,
      clientsRunning: 56,
      clientsWaitingForData: 0
    },
    inline: {
      threadsRunning: 0,
      clientsInTotal: 0,
      clientsRunning: 0,
      clientsWaitingForData: 0
    }
  },
  listenerProcessingTime: { durationMicros: Long('280117') }
}

某个时刻如果发现 MongoDB 访问慢,就可以来查看 network 相关的指标,是不是突发流量导致的。这里的值基本都是累加值,单调递增,需要使用 irate、rate 等函数来计算每秒的增量才比较有价值。

Opcounters

mongos [direct: primary] admin> db.serverStatus().opcounters
{
  insert: Long('2'),
  query: Long('6445'),
  update: Long('1071'),
  delete: Long('70'),
  getmore: Long('50466'),
  command: Long('279910')
}

opcounters 是操作计数器,包括 insert、query、update、delete、getmore、command 等,这些值是累加值,可以通过计算每秒的增量来判断系统的健康状况。command 是除了 insert、query、update、delete、getmore 之外的操作,比如创建索引、删除索引、执行 db.runCommand() 等。

Memory

mongos [direct: primary] admin> db.serverStatus().mem
{
  bits: 64,
  resident: 151,
  virtual: 2941,
  supported: true,
  secureAllocByteCount: 288,
  secureAllocBytesInPages: 4096
}

Memory 是内存相关的指标,resident 是 MongoDB 进程占用的常驻内存,virtual 是 MongoDB 进程占用的虚拟内存。

Metrics

db.serverStatus().metrics

这个结果太多了,就不贴了。就是各种命令执行的数量统计,比如 metrics | command | failed 记录了命令失败的总次数,metrics | command | total 记录了命令执行的总次数。metrics | document | delete 等记录了对 Document 操作的次数。

wiredTiger

db.serverStatus().wiredTiger

这个结果也太多了,就不贴了。主要是关于 WiredTiger 存储引擎的指标,比如 wiredTiger | cache | bytes currently in the cache 记录了当前缓存的字节数,wiredTiger | cache | maximum bytes configured 记录了最大缓存的字节数。

总结

serverStatus 是 MongoDB 监控最关键的命令,内容较多,可以分成多个类别,本文只能算是让大家有个概要认识,具体细节我也还需要再研究。如果你对这块比较熟悉,欢迎分享你的 MongoDB 监控经验呀。

联系我们交流

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