一 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