一 MongoDB 监控
1.1 监控概述
MongoDB自带了mongostat 和 mongotop 这两个命令来监控MongoDB的运行状况。这两个命令用于处理MongoDB数据库变慢等等问题很是有用,能详细的统计MongoDB当前的状态信息。除此以外,还能够用db.serverStatus()、db.stats()、开启profile功能经过查看日志进行监控分析。
1.2 模拟插入数据
1 [root@client ~]# mongo --host 172.24.8.71 -u admin -p admin
2 > use admin
3 > db.grantRolesToUser( "admin",[{ role: "dbOwner",db:"mydb" }])
4 > for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
二 相关命令
2.1 mongostat 命令
mongostat是mongodb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。捕捉并返回各类类型(如插入、 查询、 更新、 删除等)数据库操做的统计。
相关输出解释:
1 inserts/s #每秒插入次数
2 query/s #每秒查询次数
3 update/s #每秒更新次数
4 delete/s #每秒删除次数
5 getmore/s #每秒执行getmore次数
6 command/s #每秒的命令数,比以上插入、查找、更新、删除的综合还多,还统计了别的命令
7 dirty #仅仅针对WiredTiger引擎,脏数据字节的缓存百分比
8 used #仅仅针对WiredTiger引擎,正在使用中的缓存百分比
9 flushs/s #每秒执行fsync将数据写入硬盘的次数。
注意:flushs通常都是0,间断性会是1,经过计算两个1之间的间隔时间,能够大体了解多长时间flush一次。flush开销较大,若是频繁的flush,可能存在异常。
1 mapped/s #全部的被mmap的数据量,单位是MB,
2 vsize #虚拟内存使用量,单位MB
3 res #物理内存使用量,单位MB
4 faults/s #每秒访问失败数(只有Linux有),数据被交换出物理内存,放到swap。不要超过100,不然就是机器内存过小,形成频繁swap写入。此时要升级内存或者扩展
5 locked % #被锁的时间百分比,尽可能控制在50%如下吧
6 idx miss % #索引不命中所占百分比。若是过高的话就要考虑索引是否是少了
7 q t|r|w #当Mongodb接收到太多的命令而数据库被锁住没法执行完成,它会将命令加入队列。这一栏显示了总共、读、写3个队列的长度,都为0的话表示mongo毫无压力。高并发时,通常队列值会升高。
8 qr #客户端等待从MongoDB实例读数据的队列长度
9 qw #客户端等待从MongoDB实例写入数据的队列长度
10 ar #执行读操做的活跃客户端数量
11 aw #执行写操做的活客户端数量
注意:若是这两个数值很大,即DB的处理速度不及请求速度。可能存在开销很大的慢查询。若是查询一切正常,确实是负载很大,多是资源不够。
1 conn #当前链接数,是qr,qw,ar,aw的总和
2 time #时间戳
3 net_in #MongoDB实例的网络进流量
4 net_out #MongoDB实例的网络出流量
注意:MongoDB为每个链接建立一个线程,线程的建立与释放也会有开销,因此尽可能要适当配置链接数的启动参数,maxIncomingConnections建议在5000如下,基本知足多数场景。
示例:
1 [root@client ~]# mongo --host 172.24.8.71 -u admin -p admin
2 > use admin
3 > db.grantRolesToUser( "admin",[{ role: "clusterMonitor",db:"admin" }])
4 [root@client ~]# mongostat -h 172.24.8.71 -u admin -p admin --authenticationDatabase admin --discover -n 30 3
参数说明
-discover:提供集群中全部节点的状态;
-n 30 3:表示输出30次,每次休眠3秒钟。
2.2 mongotop 命令
mongotop也是mongodb下的一个内置工具,mongotop提供了一个方法,用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据。 追踪并报告MongoDB实例当前的读取和写入活动,并且是基于每一个集合报告这些统计数据。提供每一个集合的水平的统计数据。默认状况下,mongotop返回值的每一秒。
相关输出解释:
1 ns #数据库命名空间,后者结合了数据库名称和集合。
2 db #数据库的名称。名为 . 的数据库针对全局锁定,而非特定数据库。
3 total #mongod在这个命令空间上花费的总时间。
4 read #在这个命令空间上mongod执行读操做花费的时间。
5 write #在这个命名空间上mongod进行写操做花费的时间。
示例:
1 [root@client ~]# mongotop -h 172.24.8.71 -u admin -p admin --authenticationDatabase admin -n 30 3
参数说明
1 -n 30 3:表示输出30次,每次休眠3秒钟。
2.3 profile
mongodb慢查询检查,Profiler默认为关闭状态,能够选择所有开启,或者有慢查询的时候开启。
相关输出解释:
1 ts #时间戳
2 info #具体的操做
3 millis #操做所花时间,毫秒
4 [root@client ~]# mongo --host 172.24.8.71 -u admin -p admin
5 > use mydb
6 > db.setProfilingLevel(2) #开启profile
7 { "was" : 2, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }
8 > db.getProfilingLevel()
9 2
10 > use mydb
11 switched to db mydb
12 > db.system.profile.find().sort({$natural:-1}).pretty() #查看Profile日志
13 > db.system.profile.count() #查看系统中的慢查询数量
14 6
注意:profile操做必须链接mongod进程,而mongos没法执行此类操做;
形成满查询多是索引的问题,也多是数据不在内存形成所以磁盘读入形成。
更多慢查询操做见官方文档:https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/
2.4 serverStatus
serverStatus命令,或mongo shell中的db.serverStatus()返回数据库状态的总览,具体包括磁盘使用情况、内存使用情况、链接、日志和可用的索引。此命令迅速返回,并不会影响MongoDB性能。
1 > use mydb
2 > db.serverStatus() #只显示部份内容
3 {
4 "uptime" : 21.0, #表示此实例进程已激活的总时间,单位是秒
5 "localTime" : ISODate("2017-07-09T05:28:17.007Z"), #表示实例所在服务器的当前时间
6 "globalLock" : {
7 "totalTime" : NumberLong(20935000), #数据库启动后运行的总时间,单位是微秒
8 "currentQueue" : { #表示由于锁引发读写队列数
9 "total" : 0,
10 "readers" : 0, #等待读锁的操做数
11 "writers" : 0 #等待写锁的操做数
12 },
13 "activeClients" : { #链接的激活客户端写操做的总数
14 "total" : 10,
15 "readers" : 0, #激活客户端读操做数
16 "writers" : 0 #激活客户端写操做数
17 }
18 },
19 "mem" : { #表示当前内存使用状况
20 "bits" : 64, #mongod运行的目标机器的架构
21 "resident" : 96, #当前被使用的物理内存总量,单位MB
22 "virtual" : 271, #MongoDB进程映射的虚拟内存大小,单位MB
23 "supported" : true, #表示系统是否支持可扩展内存
24 "mapped" : 0, #映射数据文件所使用的内存大小,单位MB
25 "mappedWithJournal" : 0 #映射journaling所使用的内存大小,单位MB
26 },
27 }
关键输出:
connections:当前链接和可用链接数,设个一个合理值,当到达这个值mongodb就拒绝新的链接请求,避免链接太多而影响性能。
indexCounters:btree:misses 索引的不命中数,和hits的比例高就要考虑索引是否正确创建。
2.5 db.stats()、db.c.stats()
MongoDB数据文件状态指标命令: db.stats(), db.c.stats(),查看文件大小,存储空间大小等。返回一份针对存储使用状况和数据卷的文档,dbStats显示了存储的使用量、包含在数据库中的数据的总量以及对象、集合和索引计数器。
示例:
1 > use mydb
2 > db.stats()
3 {
4 "db" : "mydb", #当前数据库
5 "collections" : 2, #集合数量
6 "views" : 0,
7 "objects" : 50007, #对象(记录)数量
8 "avgObjSize" : 53.88963545103685, #对象平均大小
9 "dataSize" : 2694859, #全部数据总大小
10 "storageSize" : 917504, #数据占磁盘大小
11 "numExtents" : 0, #全部集合占用的区间总数
12 "indexes" : 1, #索引数
13 "indexSize" : 491520, #索引大小
14 "fsUsedSize" : 2733277184,
15 "fsTotalSize" : 27375431680,
16 "ok" : 1
17 }
提示:MongoDB数据库磁盘占用大小=storageSize+indexes,压缩比=dataSize/storageSize。
2.6 db.collection.stats()
在集合级别上提供相似dbStats的统计数据,包括集合中对象的计数、集合的大小、集合占用的硬盘空间总量以及集合索引的相关信息。
1 > use mydb
2 switched to db mydb
3 > db.user.stats()
2.7 db.currentOp()
一般Mongodb的命令通常很快就完成,可是在一台繁忙的机器或者有比较慢的命令时,能够经过db.currentOp()获取当前正在执行的操做。
提示:若发现一个操做太长,致使数据库卡死,可使用db.killOp("110752")杀死。
2.8 rs.status()
MongoDB副本集状态指标命令。
相关输出解释:
分段
|
说明
|
set
|
当前副本集名称
|
date
|
执行命令时间
|
myState
|
当前节点的状态(角色)
|
syncingTo
|
同步源
|
heartbeatIntervalMillis
|
心跳间隔
|
members
|
节点成员
|
members.id
|
成员编号
|
members.name
|
成员名称
|
members.heath
|
健康状态,1-true,0-false
|
members.state
|
成员状态(角色)1-主节点 2-备节点 7-仲裁节点
|
members.stateStr
|
成员状态名
|
members.uptime
|
成员启动运行时长
|
members.optime
|
成员oplog时间戳(字段ts)
|
members.optimeDate
|
成员oplog时间(格式化)
|
members.lastHeartbeat
|
当前节点对成员的最后一个心跳
|
members.lastHeartbeatRecv
|
当前节点收到该成员的最后一个心跳
|
members.pingMs
|
当前节点到该成员的回路时长
|
members.syncingTo
|
成员同步源
|
members.electionTime
|
主节点选举时间戳(ms)
|
members.electionDate
|
主节点选举时间(格式化)
|
- 检查每一个成员的state/stateStr确认是否正常;
提示:state状态字段解释可参考官方:https://docs.mongodb.com/manual/reference/replica-states/或https://yq.aliyun.com/articles/405274。
- 检查每一个成员的optimeDate差别,查看复制延迟;
- 检查lastHeartbeat、pingMs值排查网络延迟问题
使用db.printReplicationInfo()输出节点oplog信息,可在主备节点输出对比
1 configured oplog size: 20480MB
2 log length start to end: 589911secs (163.86hrs)
3 oplog first event time: Tue Apr 03 2018 19:37:14 GMT+0800
4 oplog last event time: Tue Apr 10 2018 15:29:05 GMT+0800
5 now: Tue Apr 10 2018 15:30:18 GMT+0800
主节点使用db.printSlaveReplicationInfo()可输出备节点的同步信息
1 source: 135.177.126.24:10001
2 syncedTo: Tue Apr 10 2018 15:32:45 GMT+0800
3 0 secs (0 hrs) behind the primary
三 motop监控工具
3.1 motop安装
motop是mongodb实时监控工具,能够同时对多个MongoDB服务器进行监控,同时显示当前操做。
语法格式:
motop [-h] [-u USERNAME] [-p PASSWORD] [-c CONF] [-V] [-K AUTOKILLSECONDS] [host [host ...]]
开源项目地址:项目地址:https://github.com/tart/motop
1 [root@client ~]# yum -y install pymongo #安装以来
2 [root@client ~]# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
3 [root@client ~]# python get-pip.py
4 [root@client ~]# yum -y install git
5 [root@client ~]# pip install git+https://github.com/tart/motop.git
3.2 motop操做
q:退出
p:暂停
e:解释查询
k:使用“mongo”执行杀死操做
K:使用“mongo”执行杀死比给定秒数更早的操做
r:尝试从新链接到已断开链接的服务器
R:尝试从新链接到全部服务器
3.3 配置
配置文件:/etc/motop.conf,能够有多个配置段,每一节均可以包含如下参数。
1 address:服务器的地址(必需)
2 username:登录用户名
3 password:登录用户密码
4 status:显示状态(默认开启)
5 replicationInfo:显示复制状态(默认值:开启)
6 replicaSet:显示副本集的状态(默认值:开启)
7 operations:显示操做(默认值:开启)
8 replicationOperations:不断展示主和从的复制操做(默认值:开启)
9 “DEFAULT”:是特殊的部分,参数能够在本节中设置为默认值。
3.4 监控
1 [root@client ~]# motop -h #查看帮助
2 [root@client ~]# vi /etc/motop.conf
3 [MongoDB01]
4 address=172.24.8.71
5 username=admin
6 password=admin
7 replicationInfo=off
8
9 [MongoDB02]
10 address=172.24.8.72
11 username=admin
12 password=admin
13 replicationInfo=off
四 影响性能相关因素
4.1 锁
MongoDB用一个锁确保数据的一致性。但若是某种操做时间运行,其余请求和操做将不得不等待这个锁,致使系统性能下降。为了验证是否因为锁下降了性能,能够坚持serverStatus输出的globalLock部分的数据。若是参数globalLock.currentQueue.total的值一直较大,说明系统中有许多请求在等待锁,同时代表并发问题影响了系统的性能。
4.2 内存
MongoDB经过内存映射数据文件,若是数据集很大,MongoDB将占用全部可用的系统内存。正式因为内存映射机制将内存的管理交给操做系统来完成,简化了MongoDB的内存管理,提升了数据库系统的性能,可是因为不能肯定数据集的大小,须要多少内存也是个未知数。
经过serverStatus输出的关于内存使用状态方面的数据,咱们可以深刻地了解内存使用状况。检查参数mem.resident的值,若是超过了系统内存量而且还有大量的数据文件在磁盘上,代表内存太小。检查mem.mapped的值,若是这个值大于系统内存量,那么针对数据库的一些读操做将会引发操做系统的缺页操做,内存的换入换出将会下降系统的性能。
4.3 链接数
有时候,客户端的链接数超过了MongoDB数据库服务器处理请求的能力,这也会下降系统的性能。能够经过serverStatus输出的关于链接数方面的参数进一步分析。参数globalLock.activeClients表示当前正在进行读写操做客户端的链接数,current表示当前客户端到数据库实例的链接数,available表示可用链接数。对于读操做大的应用程序,咱们能够增长复制集成员数,将读操做分发到secondary节点上,对于写操做大的应用程序,能够经过部署分片集群来分发写操做。
五 Web图形界面
5.1 开启Web
从3.6版本后废弃了web界面,基于安全性考虑官方不推荐开启http。3.6以前的版本可参考官方方法开启:
https://docs.mongodb.com/v3.2/reference/configuration-options/
参考连接:
https://www.cnblogs.com/littleatp/p/8419647.html
https://blog.csdn.net/Chen_Victor/article/details/74855050