1. MongoDB 系统运行状态介绍
MongoDB 是一个流行的非关系型数据库,主要用于大型 Web 应用程序和其他高容量数据存储应用程序。它采用分布式文件存储方式,数据结构是面向文档的,采用 BSON 格式(Binary JSON)。MongoDB 的系统状态可以通过以下方式进行检查:
2. 检查 MongoDB 系统状态
2.1 使用 mongostat 命令检查
mongostat 是 MongoDB 的一个自带命令,可以查看 MongoDB 运行状态的实时信息,其中包括数据库的连接数、操作数、读写锁状态、内存使用情况等数据。
mongostat
输出结果如下:
connected to: 127.0.0.1
dbname collections dur q set query insert update delete getmore command flushes mapped vsize res faults qr|qw ar|aw netIn netOut conn time
test 1 0ms 0 2.5k 0 20 0 0 0 20 0 130M 5.38G 1.15G 1 0 0|0 0|0 0.06k 0.20k 1.02k 0.84k 127.0.0.1:27017 2020-08-11T07:50:40.329+0000
其中各个字段的含义如下:
dbname:MongoDB 数据库名称;
collections:当前数据库所包含的集合总数;
dur:每秒钟写入磁盘的文档数量,单位为毫秒;
q:等待执行的操作数量;
set:此服务器所属集合名称;
query:每秒钟发出的查询数量;
insert:每秒钟写入的文档数量;
update:每秒钟更新的文档数量;
delete:每秒钟删除的文档数量;
getmore:每秒钟得到的文档数量;
command:每秒钟得到的命令数量;
flushes:每秒钟写入磁盘的数据刷新数量;
mapped:当前使用的物理内存大小;
vsize:C++ 进程内存大小;
res:已被分配且未被交换出的物理内存;
faults:每秒钟产生的页错误数量;
qr|qw:读/写锁状态;
ar|aw:日志记录器锁的状态;
netIn:每秒钟从网络实例读入的数据量(单位为 kb);
netOut:每秒钟从网络实例发送的数据量(单位为 kb);
conn:当前连接数量;
time:当前时间戳。
在 mongostat 命令执行期间,可以使用相应的选项,例如 -h 选项指定 MongoDB 实例的主机名或 IP 地址,-u 选项指定连接 MongoDB 实例时使用的用户名,-p 选项指定密码。
2.2 使用 mongotop 命令检查
mongotop 是 MongoDB 的一个自带命令,可以查看 MongoDB 的读写操作情况和其他操作计数器的情况。
mongotop
输出结果如下:
database collection total read write
test users 7ms 0ms 7ms
其中各个字段的含义如下:
database:包含正在运行的操作的数据库名称;
collection:正在运行的操作所属的集合名称;
total:各集合中包含的操作总数;
read:正在进行的读操作的数量;
write:正在进行的写操作的数量。
在 mongotop 命令执行期间,可以使用相应的选项,例如 -h 选项指定 MongoDB 实例的主机名或 IP 地址,-u 选项指定连接 MongoDB 实例时使用的用户名,-p 选项指定密码。
2.3 使用 db.currentOp() 检查
db.currentOp() 是 MongoDB 的一个方法,可以用于显示正在运行的操作情况。
db.currentOp()
输出结果如下:
{
"inprog" : [
{
"active" : true,
"opid" : 8976675,
"secs_running" : 60,
"op" : "query",
"ns" : "test.cities",
"numYield" : 0,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(8886),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(625636),
"w" : NumberLong(0)
}
},
"waitingForLock" : false,
"msg" : "query",
"client" : "127.0.0.1:54758",
"desc" : "conn2",
"threadId" : "140176668983296",
"connectionId" : 2,
"opNum" : 0,
"syncMillis" : 0,
"opId" : 8976675,
"readOnly" : false,
"execStats" : {
"stage" : "FETCH",
"nReturned" : 1000,
"executionTimeMillisEstimate" : 1,
"works" : 1407,
"advanced" : 1000,
"needTime" : 406,
"needYield" : 0,
"saveState" : 11,
"restoreState" : 11,
"isEOF" : 1,
"invalidates" : 0,
"docsExamined" : 1000,
"alreadyHasObj" : 0,
"inputStage" : {
"stage" : "LIMIT",
"nReturned" : 1000,
"executionTimeMillisEstimate" : 1,
"works" : 1407,
"advanced" : 1000,
"needTime" : 406,
"needYield" : 0,
"saveState" : 11,
"restoreState" : 11,
"isEOF" : 1,
"invalidates" : 0,
"worksMinimal" : 1407,
"needTimeMinimal" : 406,
"nLimitAmount" : 1000,
"limitAmountHasBeenApplied" : true,
"inputStage" : {
"stage" : "COLLSCAN",
"nReturned" : 621788,
"executionTimeMillisEstimate" : 1,
"works" : 621789,
"advanced" : 621788,
"needTime" : 0,
"needYield" : 0,
"saveState" : 7,
"restoreState" : 7,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 621788
}
}
}
}
],
"ok" : 1
}
其中各个字段的含义如下:
inprog:正在运行的操作列表;
active:表示该操作是否正在执行;
opid:操作 ID;
op:操作类型;
ns:操作的命名空间;
secs_running:操作运行的持续时间(以秒为单位);
lockStats:关于操作的锁定统计信息;
waitingForLock:如果操作在等待锁定,该值为 true;
msg:如果存在,则为正在执行的消息类型;
client:客户端信息;
desc:关于这个连接的描述信息;
connectionId:操作的连接 ID;
opNum:操作的执行次数;
syncMillis:操作在磁盘同步之前持续的总时间(以毫秒为单位);
opId:操作 ID;
readOnly:如果操作是只读的,则为 true;
execStats:有关查询操作的执行统计信息的特定对象。
在执行 db.currentOp() 方法时,如果向该方法传递 { "allUsers" : true } 选项,则可以获取到当前实例上的所有连接。
3. 系统运行状态分析
通过检查 MongoDB 系统运行状态,可以获取到大量实时运行数据。这些数据对于分析系统的实际运行情况、定位性能问题和评估系统可用性非常有帮助。例如,mongostat 命令提供了读写操作的数量,提供有关系统运行情况的详细信息,而 mongotop 命令则提供了有关读写操作数量的详细信息。
使用 db.currentOp() 命令可以获取当前操作的详细信息,包括操作的 ID、运行时间、操作类型等等。这些信息对于跟踪和调试数据库中发生的事情以及定位性能问题非常有用。
通过分析这些系统数据,可以确定 MongoDB 是否按预期运行。如果发现性能下降的迹象,则可以分析 mongostat 或 mongotop 的输出,以确定是读操作、写操作或其他类型的操作在影响性能。如果发现操作经常堵塞,则可以使用 db.currentOp() 查看正在运行的操作,以确定哪个操作阻塞了其他操作。
4. 总结
通过本文的介绍,我们可以了解到如何检查 MongoDB 的运行状态。mongostat 和 mongotop 命令可以查看 MongoDB 的实时运行状态信息,而 db.currentOp() 方法可以查看正在运行的操作详细信息。这些信息对于跟踪 MongoDB 系统、解决性能问题以及评估系统可用性非常有用。