MongoDB資料庫效能監控看這一篇就夠了

ITPUB社群發表於2023-02-13

大家好,我是哪吒。

最近專案在使用MongoDB作為圖片和文件的儲存資料庫,為啥不直接存MySQL裡,還要搭個MongoDB叢集,麻不麻煩?


讓我們一起,一探究竟,繼續學習MongoDB資料庫效能監控,實現快速入門,豐富個人簡歷,提高面試level,給自己增加一點談資,秒變面試小達人,BAT不是夢。

MongoDB資料庫效能監控看這一篇就夠了



一.  MongoDB啟動慢

1、啟動日常卡住

根本不用為了截圖而快速操作,MongoDB啟動真的超級慢。

MongoDB資料庫效能監控看這一篇就夠了

MongoDB資料庫效能監控看這一篇就夠了

2、啟動MongoDB配置伺服器,間歇性失敗

MongoDB資料庫效能監控看這一篇就夠了

MongoDB資料庫效能監控看這一篇就夠了

3、檢視MongoDB日誌,分析“MongoDB啟動慢”的原因。

MongoDB資料庫效能監控看這一篇就夠了

4、耗時“一小時”,MongoDB啟動成功!

MongoDB資料庫效能監控看這一篇就夠了



二. 原因分析

在MongoDB關閉之前,有較大的索引建立的操作沒有完成,MongoDB就直接shutdown了,等MongoDB再次啟動的時候,MongoDB預設會將這個index重建好,重建期間處於startup狀態。

由於不清楚重建索引需要多久,因此可以透過重啟mongod時加上–noIndexBuildRetry引數來跳過索引重建。等啟動完成後,再建立這個索引。

下面從幾方面,監控一下MongoDB的效能問題。



三. MongoDB記憶體使用

MongoDB資料庫效能監控看這一篇就夠了

  • 常駐記憶體:常駐記憶體是MongoDB在RAM中顯式擁有的記憶體。如果查詢一個集合資料,MongoDB會將其放入常駐記憶體中,MongoDB會獲得其地址,這個地址不是RAM中資料的真實地址,而是一個虛擬地址。MongoDB可以將它傳遞給核心,核心會查詢出資料的真實位置。如果核心需要從記憶體中清理快取,MongoDB仍然可以透過該地址對其進行訪問。MongoDB會向核心請求記憶體,然後核心會檢視資料快取,如果發現資料不存在,就會產生缺頁錯誤並將資料複製到記憶體中,最後再返給MongoDB。

  • 虛擬記憶體:作業系統提供的一種抽象,它對軟體程式隱藏了物理儲存的細節。每個程式都可以看到一個連續的記憶體地址空間。在Ops Manager中,MongoDB的虛擬記憶體是對映記憶體的兩倍。

  • 對映記憶體:包含MongoDB曾經訪問過的所有資料。


MongoDB資料庫效能監控看這一篇就夠了



四. MongoDB磁碟空間

當磁碟空間不足時,可以進行如下操作:

  1. 可以新增一個分片;

  2. 刪除未使用的索引;

  3. 可以執行壓縮操作;

  4. 關閉副本整合員,將其資料複製到更大的磁碟中掛載;

  5. 用較大驅動器的成員替換副本集中的成員;




五. 常用命令

1、MongoDB獲取系統資訊


db.hostInfo()

MongoDB資料庫效能監控看這一篇就夠了

2、MongoDB獲取系統記憶體情況


db.serverStatus().mem

MongoDB資料庫效能監控看這一篇就夠了

3、MongoDB獲取連線數資訊


db.serverStatus().connections

MongoDB資料庫效能監控看這一篇就夠了

4、MongoDB獲取全域性鎖資訊


db.serverStatus().globalLock

MongoDB資料庫效能監控看這一篇就夠了

5、MongoDB獲取操作統計計數器


db.serverStatus().opcounters

MongoDB資料庫效能監控看這一篇就夠了

6、MongoDB獲取資料庫狀態資訊


db.stats()

MongoDB資料庫效能監控看這一篇就夠了

以上是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資料庫效能監控看這一篇就夠了




六. 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資料庫效能監控看這一篇就夠了

MongoDB會對寫入的日誌進行壓縮,日誌檔案限制的最大大小為100MB。如果大於100MB,MongoDB就會自動建立一個新的日誌檔案,由於日誌檔案只需在上次檢查點之後恢復資料,因此在新的檢查點寫入完成時,舊的日誌檔案就會被刪除。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2934972/,如需轉載,請註明出處,否則將追究法律責任。

相關文章