MongoDB數(shù)據(jù)庫性能監(jiān)控詳解
一、MongoDB啟動超慢
1、啟動日??ㄗ?,根本不用為了截屏而快速操作,MongoDB啟動真的超級慢~~
2、啟動MongoDB配置服務器,間歇性失敗。
3、查看MongoDB日志,分析“MongoDB啟動慢”的原因。
4、耗時“一小時”,MongoDB啟動成功!
二、原因分析
在MongoDB關閉之前,有較大的索引建立的操作沒有完成,MongoDB就直接shutdown了,等MongoDB再次啟動的時候,MongoDB默認會將這個index重建好,重建期間處于startup狀態(tài)。
由于不清楚重建索引需要多久,因此可以通過重啟mongod時加上–noIndexBuildRetry參數(shù)來跳過索引重建。等啟動完成后,再創(chuàng)建這個索引。
下面從幾方面,監(jiān)控一下MongoDB的性能問題。
三、監(jiān)控MongoDB內存使用情況
- 常駐內存: 是MongoDB在RAM中顯式擁有的內存。如果查詢一個集合數(shù)據(jù),MongoDB會將其放入常駐內存中,MongoDB會獲得其地址,這個地址不是RAM中數(shù)據(jù)的真實地址,而是一個虛擬地址。MongoDB可以將它傳遞給內核,內核會查找出數(shù)據(jù)的真實位置。如果內核需要從內存中清理緩存,MongoDB仍然可以通過該地址對其進行訪問。MongoDB會向內核請求內存,然后內核會查看數(shù)據(jù)緩存,如果發(fā)現(xiàn)數(shù)據(jù)不存在,就會產生缺頁錯誤并將數(shù)據(jù)復制到內存中,最后再返給MongoDB。
- MongoDB的虛擬內存: 是操作系統(tǒng)提供的一種抽象,它對軟件進程隱藏了物理存儲的細節(jié)。每個進程都可以看到一個連續(xù)的內存地址空間。在Ops Manager中,MongoDB的虛擬內存是映射內存的兩倍。
- MongoDB的映射內存: 包含MongoDB曾經訪問過的所有數(shù)據(jù)。
四、監(jiān)控MongoDB磁盤空間
當磁盤空間不足時,可以進行如下操作:
可以添加一個分片;
刪除未使用的索引;
可以執(zhí)行壓縮操作;
關閉副本集成員,將其數(shù)據(jù)復制到更大的磁盤中掛載;
用較大驅動器的成員替換副本集中的成員;
五、MongoDB常用命令
1、MongoDB獲取系統(tǒng)信息
db.hostInfo()
2、MongoDB獲取系統(tǒng)內存情況
db.serverStatus().mem
3、MongoDB獲取連接數(shù)信息
db.serverStatus().connections
4、MongoDB獲取全局鎖信息
db.serverStatus().globalLock
5、MongoDB獲取操作統(tǒng)計計數(shù)器
db.serverStatus().opcounters
6、MongoDB獲取數(shù)據(jù)庫狀態(tài)信息
db.stats()
以上是MongoDB的重要指標,通過這些指標我們可以了解到MongoDB的運行狀態(tài),評估數(shù)據(jù)庫的健康程度,并快速確定實際項目中遇到的性能瓶頸。
比如項目中遇到的MongoSocketReadTimeoutException:
六、MongoDB持久性
復制延遲是指從節(jié)點無法跟上主節(jié)點的速度。
從節(jié)點一個操作的時間減去主節(jié)點此操作的時間,就是復制延遲。延遲應該盡可能的接近0,并且通常是毫秒級的。
備份操作通常會將所有數(shù)據(jù)讀入內存,因此,備份操作通常應該在副本集從節(jié)點而不是主節(jié)點進行,如果是單機MongoDB,則應該在空間時間進行備份,比如深夜凌晨。
持久性是數(shù)據(jù)庫必備的一種特性,想象一下,如果數(shù)據(jù)庫不具備持久性,如果數(shù)據(jù)庫重啟,數(shù)據(jù)全部丟失,太可怕了,不敢想。
為了在服務器發(fā)生故障時提供持久性,MongoDB使用預寫式日志機制,英文簡稱 WAL。WAL是數(shù)據(jù)庫系統(tǒng)中一種常見的持久性技術。在數(shù)據(jù)存入數(shù)據(jù)庫之前,將這些更改操作寫到磁盤上。
從MongoDB4.0開始,執(zhí)行寫操作時,MongoDB會使用與oplog相同的格式創(chuàng)建日志。oplog語句具有冪等性,不管執(zhí)行多少次,結果都是一樣的。
MongoDB還維護了日志和數(shù)據(jù)庫數(shù)據(jù)文件的內存視圖。默認情況,每50毫秒會將日志條目刷新到磁盤上,每60秒會將數(shù)據(jù)庫文件刷新到磁盤上。刷新數(shù)據(jù)的時間60秒間隔被稱為檢查點。日志用于將上一個檢查點之后的數(shù)據(jù)提供持久性。MongoDB的持久性就是在發(fā)生故障時,重啟之后,將日志中的語句重新執(zhí)行一遍,以保證在關閉前丟失的數(shù)據(jù)重新刷新到MongoDB中。
MongoDB會在data目錄下創(chuàng)建一個journal的子目錄,WiredTiger日志文件的名稱為WiredTigerLog.<sequence>。sequence是一個從0 000 000 001開始的數(shù)字。
MongoDB會對寫入的日志進行壓縮,日志文件限制的最大大小為100MB。如果大于100MB,MongoDB就會自動創(chuàng)建一個新的日志文件,由于日志文件只需在上次檢查點之后恢復數(shù)據(jù),因此在新的檢查點寫入完成時,舊的日志文件就會被刪除。
以上就是MongoDB數(shù)據(jù)庫性能監(jiān)控詳解的詳細內容,更多關于MongoDB數(shù)據(jù)庫性能監(jiān)控的資料請關注腳本之家其它相關文章!
相關文章
MongoDB中多表關聯(lián)查詢($lookup)的深入講解
NoSql的多表關聯(lián)一直是比較復雜的問題,下面這篇文章主要給大家介紹了關于MongoDB中多表關聯(lián)查詢($lookup)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2018-12-12MongoDB模糊查詢操作案例詳解(類關系型數(shù)據(jù)庫的 like 和 not like)
這篇文章主要介紹了MongoDB的模糊查詢操作(類關系型數(shù)據(jù)庫的 like 和 not like) ,本文通過代碼案例分析給大家介紹的非常詳細,具有一定的參考借鑒價值,,需要的朋友可以參考下2019-07-07