一 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()獲取當前正在執行的操作。
1 > db.currentOp()
提示:若發現一個操作太長,導致資料庫卡死,可以使用db.killOp("110752")殺死。
2.8 rs.status()
MongoDB副本集狀態指標命令。
相關輸出解釋:
- 檢查每個成員的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