serverStatus命令可以返回mongoDB数据库服务进程的运行状态。
用户可以直接通过db.runCommand({serverStatus:1})的方式直接调用命令,也可以调用db.serverStatus()这样的wrapper来更方便地获取相关信息。
在mongos、mongod等不同的节点上执行serverStatus命令,返回的结果含意有略微的差别,在实际使用过程中容易造成误导。这里结合具体的源码,讨论serverStatus命令的具体执行过程,梳理具体的执行结果的含意。
serverStatus实现原理
![](https://img.haomeiwen.com/i8560396/4e22a1ced26451ad.png)
与大部分mongoDB提供的命令一样,cmdServerStatus实现了Command虚基类,注册对应的command(如serverStatus、find、count等)到全局(静态)的commandMap中。serverStatus命令的返回结果包含了进程pid、启动时间、操作数统计等诸多数据。对于较为复杂的数据,诸如操作数统计opCounter、连接connection等数据计算方法以称为ServerStatusSection的单元形式注册到静态的sectionMap中,从而在调用继承自基类的run()时,调用相应的数据计算函数。较为简单的例如进程pid、机器host之类的信息则直接在run()中直接计算。
![](https://img.haomeiwen.com/i8560396/67a2128b4a258683.png)
mongod进程申明了一个全局的globalOpCounters,保存了db的操作数信息。其中,_getMore参数表示在游标迭代过程中的getMore操作的数量。_command参数表示除去insert、update、delete的命令数的统计值。所有的统计值都是存储在运行进程的内存中的,所以只会统计自进程启动以来的命令数。
通过客户端直接登录副本集或分片的mongod节点,执行serverStatus命令返回的是对应mongod进程的OpCounter信息。
对于分片集实例,通常我们会登录到mongos上执行命令。在mongos上执行serverStatus命令,获取到的值是mongos上保存的值。对于有多个mongos的mongoDB实例,如果需要统计OpCounter信息,需要累计多个mongos上的数据。
网友评论