1.Mongodb的监控
在Mongodb自带的命令行监控命令有两种,一个是mongostat,一个是mongotop,除了这个两个之外还有常用的db.serverStatus()、db.stats()、db.coll.stats()以及rs.status()
1. mongostat :监控数据实例中各种操作,包含mongod和mongos实例
这里做一个简单的输出:
[mongod@mongodb ~]$ mongostat --port 27017 insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn set repl time *0 *0 *0 *0 0 4|0 0.1% 0.2% 0 1.82G 109M 0|0 1|0 1.44k 48.4k 8 rs0 PRI May 6 20:36:13.574 *0 *0 *0 *0 0 4|0 0.1% 0.2% 0 1.82G 109M 0|0 1|0 1.44k 48.5k 8 rs0 PRI May 6 20:36:14.577 *0 *0 *0 *0 0 5|0 0.1% 0.2% 0 1.82G 109M 0|0 1|0 1.45k 48.9k 8 rs0 PRI May 6 20:36:15.573 *0 *0 *0 *0 0 4|0 0.1% 0.2% 0 1.82G 109M 0|0 1|0 1.44k 48.6k 8 rs0 PRI May 6 20:36:16.574 *0 *0 *0 *0 0 5|0 0.1% 0.2% 0 1.82G 109M 0|0 1|0 1.44k 48.7k 8 rs0 PRI May 6 20:36:17.573 *0 *0 *0 *0 0 4|0 0.1% 0.2% 0 1.82G 109M 0|0 1|0 1.44k 48.6k 8 rs0 PRI May 6 20:36:18.574 *0 *0 *0 *0 0 4|0 0.1% 0.2% 0 1.82G 109M 0|0 1|0 1.44k 48.6k 8 rs0 PRI May 6 20:36:19.575 *0 *0 *0 *0 0 5|0 0.1% 0.2% 0 1.82G 109M 0|0 1|0 1.45k 48.8k 8 rs0 PRI May 6 20:36:20.573
其中:mongostat -n 30 10 --port 27017 表示每10打印一次,一共答应30次
insert:表示每秒插入次数 query:表示每秒查询次数 update:表示每秒更新次数 delete:表示每秒删除的次数
getmore:表示每秒执行getmore命令的次数,如游标的批量遍历
command:代表primary和secondary的节点指令个数,如果是在从库上执行,则代表从库执行的命令数据以及复制冲库的其它实例的命令执行情况,二者通过|分割
dirty:代表wiredTiger存储引擎的缓冲中脏字节的百分比。
used:代表已经使用的wiredTiger存储引擎缓存比例
flushed:表示在每次轮询间隔之间checkpoint触发的次数,对于MMAPv1存储引擎,表示当前将数据写入磁盘的次数
vsize:表示在最后一次执行mogostat命令时,运行实例所占虚拟内存大小。
res:表示在最后一次执行mogostat命令时,运行实例实际占用的物理内存大小。
qrw:等待读取文档和写入文档的客户端数量(当前等待),这里可以看成是一个等待的队列长度
arw:正在执行读取文档和执行写入文档的客户端数量(当前活跃)
net_in|net_out:表示mongod实例接受和发送的总的数据流量,单位为byte
conn:表示mongod运行实例当前打开的连接次数
set:表示mongod运行实例所在的复制集名称
repl:表示mongod运行实例在复制集的身份,如primary节点或者secondary节点
2. mongotop
该工具用来监控mongdb数据库实例消耗在读/写操作上的时间量,统计粒度精确到数据库中的每个集合,由于mongotop工具只能连接具体的mongod实例,因此对于分片集群来说,不能直接连接mongos获取监控信息,只能连接每个分片对应的复制集或者直接连接复制集中的primary节点。默认也是连接该复制集中的primary节点,因此监控返回的统计数据也是针对复制集中的primary节点的。
这里是做一个简单的输出
[mongod@mongodb ~]$ mongotop --port 27017 2022-05-06T22:01:11.682+0800 connected to: mongodb://localhost:27017/ ns total read write 2022-05-06T22:01:12+08:00 admin.system.keys 0ms 0ms 0ms admin.system.roles 0ms 0ms 0ms admin.system.version 0ms 0ms 0ms config.settings 0ms 0ms 0ms config.system.sessions 0ms 0ms 0ms config.transactions 0ms 0ms 0ms local.oplog.rs 0ms 0ms 0ms local.replset.election 0ms 0ms 0ms local.system.replset 0ms 0ms 0ms
ns:表示集合的命令空间,统计的数据针对那个集合
read:表示运行实例消耗在这个集合中的"读操作"总时间
write:表示运行实例消耗在这个集合中的"写操作"总时间
total:表示运行实例消耗在这个集合中的"读/写操作"总时间
3. db.stats()
该命令为数据库命令,用于显示具体某个数据库的统计信息
rs0:PRIMARY> db.stats() { "db" : "test", "collections" : 1, "views" : 0, "objects" : 2, "avgObjSize" : 33, "dataSize" : 66, "storageSize" : 36864, "indexes" : 1, "indexSize" : 36864, "totalSize" : 73728, "scaleFactor" : 1, "fsUsedSize" : 3053395968, "fsTotalSize" : 18238930944, "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1651868399, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1651868399, 1) }
db:代表当前数据库的命令
collections:当前数据库集合的数量
view:当前数据库中视图的数量
objects:当前数据库中所有文档的数量
avgObjSize:数据库中文档的平均大小,单位字节
dataSize:当前数据库的数据大小,单位是byte
storageSize:当前数据库占用硬盘空间的大小,单位是byte
numExtents:当前数据库中所有集合Extents扩展的数量统计
indexes:当前数据库中的索引数量
indexSize:当前数据库中中索引占用的存储空间
fsUsedSize:当前Mongodb使用了多少磁盘空间,与指定的dbPath对应的路径有关
fsTotalSize:当前Mongodb所在的硬盘总共的空间大小
4.db.coll.stats()
这个函数返回的是集合的状态信息,这里输出的信息太多,这里只输出部分信息
rs0:PRIMARY> db.test.stats() { "ns" : "test.test", "size" : 66, "count" : 2, "avgObjSize" : 33, "storageSize" : 36864, "freeStorageSize" : 16384, "capped" : false, "wiredTiger" : { "metadata" : { "formatVersion" : 1 },
ns:当前集合的名称
size:当前集合的大小,单位是byte
count:当前集合的文档数量
size:集合中数据占用空间大小,不包括大小
storagesize:分配的存储空间,当删除集合中的文档时,这个值不会降低
nindexes:索引数量
totallindexSize:索引占用的空间总大小
以kb单位显示:db.test.stats(1024)
显示所有集合的统计信息:db.printCollectionStats()
5.db.serverStatus()
db.serverStatus()数据库命令用户显示具体某个实例上的统计信息,实例可以为mongod或mongos。例如,通过mongo连接分片集群mongos,当执行sb.serverStatus()命令后输出mongos相关的统计信息。
如果mongo连接的是某个分片中的mongod实例,则输出mongod相关统计信息。不同类型的实例,返回的信息不一样。使用db.serverStatus()命令返回的指标信息较多。
5.1 查看mongod实例中连接数相关信息:
db.serverStatus().connections
rs0:PRIMARY> db.serverStatus().connections { "current" : 18, //表示该数据库实例中当前客户端的连接数,包括复制集之间的连接数。 "available" : 801, //表示该数据库实例中还可用的客户端连接数 "totalCreated" : 101, //表示该数据库实例中所有已创建的连接数,包括已经关闭的。 "active" : 8, //表示该数据库实例中当前活跃的,有读/写等操作的客户端连接数 "exhaustIsMaster" : 6, "exhaustHello" : 0, "awaitingTopologyChanges" : 6 }
5.2 查看mongod实例中的内存相关信息
db.serverStatus().mem
rs0:PRIMARY> db.serverStatus().mem { "bits" : 64, "resident" : 109, "virtual" : 1889, "supported" : true }
- bis:表示mongodb运行实例的编译架构
- resident:表示数据库实例进程使用的物理内存大小,单位为MB
- virtual:表示数据库实例进程使用的虚拟内存大小,单位为MB
- supported:表示数据库实例进程所依赖的底层操作系统是否支持扩展的内存信息
5.3 查看mongod实例中WireTiger存储引擎的cache相关信息
db.serverStatus().wiredTiger.cache
db.serverStatus().wiredTiger.cache
这里主要对输出结果的几个关键参数进行说明:
- maximum bytes configured:分配给cache的最大内存,单位为byte
- bytes currently in the cache:在cache中,当前数据占用的内存大小,单位为byte,取值应该小于maximum bytes configured
- tracked dirty bytes in the cache:在cache中,当前脏数据占用的内存大小,单位byte
- pages read into cache:读取cache中pages数量
- pages written from cache:从cache中写入磁盘中的pages数量
5.4查看mongod实例中的锁相关信息
db.serverStaus().globalLock
rs0:PRIMARY> db.serverStatus().globalLock { "totalTime" : NumberLong("113573673000"), //约等于服务器上线总时长,单位为微妙 "currentQueue" : { "total" : 0, //当前排队等待锁的操作总数 "readers" : 0, //当前排队等待读锁的操作数 "writers" : 0 //当前排队等待写锁的操作数 }, "activeClients" : { "total" : 0, "readers" : 0, //执行读操作的活跃客户端连接数 "writers" : 0 //执行写操作的活跃客户端连接数 } }
db.serverStatus().locks:获取锁相关的详细信息,这里输出结果有些多,不再一一写了。
6.关于db.serverStatus()的总结:
1.connections:关于连接数的信息
2.locks:关于mongodb使用的锁情况
3.network:网络使用情况统计
4.opcounters:crud的执行次数统计
5.repl:复制集配置信息
6.wiredTiger:包含大量WirdTiger执行情况的信息
. block-manager:wt数据块的读写情况
. session:session使用数量
. concurrentTransactins:Ticket使用情况
. metrics:一系列性能指标统计信息
7. 再补充几个有用的监控指标:
7.1 db.serverStatus().opcounters:查询、更新、插入、删除、getmore和其它命令数量
rs0:PRIMARY> db.serverStatus().opcounters { "insert" : NumberLong(0), "query" : NumberLong(117), "update" : NumberLong(13), "delete" : NumberLong(0), "getmore" : NumberLong(5790), "command" : NumberLong(79399), "deprecated" : { "total" : NumberLong(1), "insert" : NumberLong(0), "query" : NumberLong(0), "update" : NumberLong(0), "delete" : NumberLong(0), "getmore" : NumberLong(0), "killcursors" : NumberLong(1) }
2. db.serverStatus().wiredTiger.concurrentTransactions
对wiredTiger存储引擎的读/写令牌数量。令牌数量表示了可以进入存储引擎的并发操作数量。
rs0:PRIMARY> db.serverStatus().wiredTiger.concurrentTransactions { "write" : { "out" : 0, "available" : 128, "totalTickets" : 128 }, "read" : { "out" : 1, "available" : 127, "totalTickets" : 128 } }
3.db.adminCommand({'replSetGetStatus':1})
这个指标代表了写操作到达从节点需要的最小时间。过高的replication lag会减小从节点的价值并且不利于配置了写关注w>1的那些操作
4.db.printReplicationInfo()
rs0:PRIMARY> db.printReplicationInfo() configured oplog size: 1000MB //这里表示oplog的大小 log length start to end: 1697488secs (471.52hrs) //这里表示oplog可以容纳多长时间的写操作,表示一个从节点可以离线多长时间追上主节点 oplog first event time: Mon Apr 18 2022 22:14:02 GMT+0800 (CST) oplog last event time: Sun May 08 2022 13:45:30 GMT+0800 (CST) now: Sun May 08 2022 13:45:31 GMT+0800 (CST)
5.db.runCommand("isMaser")
描述每个节点的运行状态,如果节点状态不是primary、secondary、arbiter中的一个,或无法执行上述命令则报警
rs0:PRIMARY> db.runCommand("isMaster") { "topologyVersion" : { "processId" : ObjectId("627582969df9c82480064892"), "counter" : NumberLong(32) }, "hosts" : [ "127.0.0.1:27017", "127.0.0.1:27018", "127.0.0.1:27019" ], "setName" : "rs0", "setVersion" : 6, "ismaster" : true, "secondary" : false, "primary" : "127.0.0.1:27017", "me" : "127.0.0.1:27017", "electionId" : ObjectId("7fffffff000000000000004a"), "lastWrite" : { "opTime" : { "ts" : Timestamp(1651990171, 1), "t" : NumberLong(74) }, "lastWriteDate" : ISODate("2022-05-08T06:09:31Z"), "majorityOpTime" : { "ts" : Timestamp(1651990171, 1), "t" : NumberLong(74) }, "majorityWriteDate" : ISODate("2022-05-08T06:09:31Z") }, "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 100000, "localTime" : ISODate("2022-05-08T06:09:34.089Z"), "logicalSessionTimeoutMinutes" : 30, "connectionId" : 179, "minWireVersion" : 0, "maxWireVersion" : 9, "readOnly" : false, "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1651990171, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1651990171, 1) }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库