MongoDB資料庫效能監控看這一篇就夠了
大家好,我是哪吒。
最近專案在使用MongoDB作為圖片和文件的儲存資料庫,為啥不直接存MySQL裡,還要搭個MongoDB叢集,麻不麻煩?
讓我們一起,一探究竟,繼續學習MongoDB資料庫效能監控,實現快速入門,豐富個人簡歷,提高面試level,給自己增加一點談資,秒變面試小達人,BAT不是夢。
一. MongoDB啟動慢
1、啟動日常卡住
根本不用為了截圖而快速操作,MongoDB啟動真的超級慢。
2、啟動MongoDB配置伺服器,間歇性失敗。
3、檢視MongoDB日誌,分析“MongoDB啟動慢”的原因。
4、耗時“一小時”,MongoDB啟動成功!
二. 原因分析
在MongoDB關閉之前,有較大的索引建立的操作沒有完成,MongoDB就直接shutdown了,等MongoDB再次啟動的時候,MongoDB預設會將這個index重建好,重建期間處於startup狀態。
由於不清楚重建索引需要多久,因此可以透過重啟mongod時加上–noIndexBuildRetry引數來跳過索引重建。等啟動完成後,再建立這個索引。
下面從幾方面,監控一下MongoDB的效能問題。
三. MongoDB記憶體使用
常駐記憶體:常駐記憶體是MongoDB在RAM中顯式擁有的記憶體。如果查詢一個集合資料,MongoDB會將其放入常駐記憶體中,MongoDB會獲得其地址,這個地址不是RAM中資料的真實地址,而是一個虛擬地址。MongoDB可以將它傳遞給核心,核心會查詢出資料的真實位置。如果核心需要從記憶體中清理快取,MongoDB仍然可以透過該地址對其進行訪問。MongoDB會向核心請求記憶體,然後核心會檢視資料快取,如果發現資料不存在,就會產生缺頁錯誤並將資料複製到記憶體中,最後再返給MongoDB。
虛擬記憶體:作業系統提供的一種抽象,它對軟體程式隱藏了物理儲存的細節。每個程式都可以看到一個連續的記憶體地址空間。在Ops Manager中,MongoDB的虛擬記憶體是對映記憶體的兩倍。
對映記憶體:包含MongoDB曾經訪問過的所有資料。
四. MongoDB磁碟空間
當磁碟空間不足時,可以進行如下操作:
可以新增一個分片;
刪除未使用的索引;
可以執行壓縮操作;
關閉副本整合員,將其資料複製到更大的磁碟中掛載;
用較大驅動器的成員替換副本集中的成員;
五. 常用命令
1、MongoDB獲取系統資訊
db.hostInfo()
2、MongoDB獲取系統記憶體情況
db.serverStatus().mem
3、MongoDB獲取連線數資訊
db.serverStatus().connections
4、MongoDB獲取全域性鎖資訊
db.serverStatus().globalLock
5、MongoDB獲取操作統計計數器
db.serverStatus().opcounters
6、MongoDB獲取資料庫狀態資訊
db.stats()
以上是MongoDB的重要指標,透過這些指標我們可以瞭解到MongoDB的執行狀態,評估資料庫的健康程度,並快速確定實際專案中遇到的效能瓶頸。
比如專案中遇到的Timeout異常:
com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message at com.mongodb.connection.InternalStreamConnection.translateReadException(InternalStreamConnection.java:475) at com.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:226) at com.mongodb.connection.UsageTrackingInternalConnection.receiveMessage(UsageTrackingInternalConnection.java:105) at com.mongodb.connection.DefaultConnectionPool$PooledConnection.receiveMessage(DefaultConnectionPool.java:438) at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:112) at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:168) at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:289) at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:176) at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:216) at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:207) at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:113) at com.mongodb.operation.FindOperation$1.call(FindOperation.java:488) at com.mongodb.operation.FindOperation$1.call(FindOperation.java:1) at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:241) at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:214) at com.mongodb.operation.FindOperation.execute(FindOperation.java:483) at com.mongodb.operation.FindOperation.execute(FindOperation.java:1) at com.mongodb.Mongo.execute(Mongo.java:818)
六. MongoDB永續性
1、複製延遲
複製延遲是指從節點無法跟上主節點的速度。
從節點一個操作的時間減去主節點此操作的時間,就是複製延遲。延遲應該儘可能的接近0,並且通常是毫秒級的。
2、備份
備份操作通常會將所有資料讀入記憶體,因此,備份操作通常應該在副本集從節點而不是主節點進行,如果是單機MongoDB,則應該在空間時間進行備份,比如深夜凌晨。
3、永續性
永續性是資料庫必備的一種特性,想象一下,如果資料庫不具備永續性,如果資料庫重啟,資料全部丟失,太可怕了,不敢想。
為了在伺服器發生故障時提供永續性,MongoDB使用預寫式日誌機制,英文簡稱 WAL。WAL是資料庫系統中一種常見的永續性技術。在資料存入資料庫之前,將這些更改操作寫到磁碟上。
從MongoDB4.0開始,執行寫操作時,MongoDB會使用與oplog相同的格式建立日誌。oplog語句具有冪等性,不管執行多少次,結果都是一樣的。
MongoDB還維護了日誌和資料庫資料檔案的記憶體檢視。預設情況,每50毫秒會將日誌條目重新整理到磁碟上,每60秒會將資料庫檔案重新整理到磁碟上。重新整理資料的時間60秒間隔被稱為檢查點。日誌用於將上一個檢查點之後的資料提供永續性。MongoDB的永續性就是在發生故障時,重啟之後,將日誌中的語句重新執行一遍,以保證在關閉前丟失的資料重新重新整理到MongoDB中。
MongoDB會在data目錄下建立一個journal的子目錄,WiredTiger日誌檔案的名稱為WiredTigerLog.<sequence>。sequence是一個從0 000 000 001開始的數字。
MongoDB會對寫入的日誌進行壓縮,日誌檔案限制的最大大小為100MB。如果大於100MB,MongoDB就會自動建立一個新的日誌檔案,由於日誌檔案只需在上次檢查點之後恢復資料,因此在新的檢查點寫入完成時,舊的日誌檔案就會被刪除。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2934972/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 瞭解 MongoDB 看這一篇就夠了MongoDB
- Python操作MongoDB看這一篇就夠了PythonMongoDB
- mycat高可用-安全管理-監控 看這一篇就夠了
- mongoDB看這篇就夠了MongoDB
- 關於MySQL資料庫效能優化方法,看這一篇文章就夠了!MySql資料庫優化
- 想了解資料庫安全?看這一篇文章就夠了!資料庫
- 【mongodb】增刪改mongodb文件(Document)操作,看這一篇就夠了MongoDB
- Git 看這一篇就夠了Git
- 索引?看這一篇就夠了!索引
- Transformer 看這一篇就夠了ORM
- Flutter DataTable 看這一篇就夠了Flutter
- Java 集合看這一篇就夠了Java
- 代理模式看這一篇就夠了模式
- mongoDB高階查詢這一篇就夠了MongoDB
- Elasticsearch入門,看這一篇就夠了Elasticsearch
- 關於SwiftUI,看這一篇就夠了SwiftUI
- flex佈局看這一篇就夠了Flex
- ActiveMq 之JMS 看這一篇就夠了MQ
- MySQL入門看這一篇就夠了MySql
- jQuery入門看這一篇就夠了jQuery
- 入門Hbase,看這一篇就夠了
- Spring入門看這一篇就夠了Spring
- Mybatis入門看這一篇就夠了MyBatis
- 17期-什麼是MySQL資料庫?看這一篇乾貨文章就夠了!MySql資料庫
- Python快速入門,看這一篇就夠了!Python
- Android Architecture Components 只看這一篇就夠了Android
- MySQL,你只需看這一篇文章就夠了!MySql
- 瞭解SSL證書,看這一篇就夠了!!
- Nginx 配置常用引數,看這一篇就夠了Nginx
- SpringBoot寫後端介面,看這一篇就夠了!Spring Boot後端
- 什麼是事件管理?看這一篇就夠了!事件
- IDEA中的Git操作,看這一篇就夠了!IdeaGit
- 約束佈局ConstraintLayout看這一篇就夠了AI
- 分散式事務,只看這一篇就夠了分散式
- 關於GC原理和效能調優實踐,看這一篇就夠了!GC
- Java安全第一篇 | 反射看這一篇就夠了Java反射
- Android App效能優化技能,看這篇就夠了AndroidAPP優化
- 熱門好用的api大全,看這一篇就夠了API