Mongodb 效能監控工具FreeMonitoring,mongostat,mongotop,Profiler,索引,分片,事務超時,MongoDB調優

大树2發表於2024-10-17

db.users.createIndex({username : 'hashed'})
1 # 建立唯一索引
db.values.createIndex({title:1},{unique:true})
2 # 複合索引支援唯一性約束
db.values.createIndex({title:1,type:1},{unique:true})
3 #多鍵索引支援唯一性約束
db.inventory.createIndex( { ratings: 1 },{unique:true} )

使用分片叢集
1.為了使集合支援分片,需要先開啟database的分片功能
sh.enableSharding("shop")

2.執行shardCollection命令,對集合執行分片初始化,分片鍵必須有索引支援。除非集合為空,否則索引必須在
sh.shardCollection(namespace, key, unique, options)
sh.shardCollection("records.people", { zipcode: 1 } ) //1 範圍分配
sh.shardCollection("shop.product",{productId:"hashed"},false,{numInitialChunks:4})
sh.shardCollection("shop.product",{productId:"hashed"},false)

3.shop.product集合將productId作為分片鍵,並採用了雜湊分片策略,除此以外,
“numInitialChunks:4”表示將初始化4個chunk。 numInitialChunks必須和雜湊分片策略配合使
用。而且,這個選項只能用於空的集合,如果已經存在資料則會返回錯誤。

4.查詢資料的分佈
db.product.getShardDistribution()

5.分片鍵(ShardKey)的約束
ShardKey 必須是一個索引。非空集合須在 ShardCollection 前建立索引;空集合 ShardCollection自動建立索引

  1. 4.4 版本之前:
    ShardKey 大小不能超過 512 Bytes;
    僅支援單欄位的雜湊分片鍵;
    Document 中必須包含 ShardKey;
    ShardKey 包含的 Field 不可以修改。 分片鍵必須有索引支援。除非集合為空,否則索引必須在
    4.4 版本之後:
    ShardKey 大小無限制;
    支援複合雜湊分片鍵;
    Document 中可以不包含 ShardKey,插入時被當 做 Null 處理;
    為 ShardKey 新增字尾 refineCollectionShardKey 命令,可以修改 ShardKey 包含的 Field;
    而在 4.2 版本之前,ShardKey 對應的值不可以修改;4.2 版本之後,如果 ShardKey 為非_id 欄位,
    那麼可以修改 ShardKey 對應的值。

7.checkpoint 60秒寫一次資料到磁碟,或100M,減少i/o壓力

8.事務超時
預設情況下MongoDB會為每個事務設定1分鐘的超時時間,如果在該時間內沒有提交,就會強制將其終止。

9.MongoDB調優
三大導致MongoDB效能不佳的原因
1) 慢查詢
2) 阻塞等待
3)硬體資源不足
1,2通常是因為模型/索引設計不佳導致的,排查思路:按1-2-3依次排查

連結池連結數設定maxpoolsize:預設100
timeout設定:

https://www.processon.com/view/link/6239daa307912906f511b348

  1. mongodb效能檢測工具:FreeMonitoring
    1 # 啟用監控
    db.enableFreeMonitoring()
    db.getFreeMonitoringStatus()
    2 # 禁止監控
    db.disableFreeMonitoring()

https://cloud.mongodb.com/freemonitoring/cluster

  1. mongodb效能檢測工具:mongostat是MongoDB自帶的監控工具,其可以提供資料庫節點或者整個叢集當前的狀態檢視,需要clusterMonitor角色許可權
    mongostat -h 192.168.65.174 --port 28017 -user -pwd --authenticationDatabase=admin --discover --interactive -n 2

mongostat:關注的主要指標:
插入、刪除、修改、查詢的速率是否產生較大波動,是否超出預期。
qrw、arw:佇列是否較高,若長時間大於0則說明此時讀寫速度較慢。
conn:連線數是否太多。
dirty:百分比是否較高,若持續高於10%則說明磁碟I/O存在瓶頸。
netIn、netOut:是否超過網路頻寬閾值。
repl:狀態是否異常,如PRI、SEC、RTR為正常,若出現REC等異常值則需要修復。

  1. mongodb效能檢測工具:mongotop命令可用於檢視資料庫的熱點表,透過觀察mongotop的輸出,可以判定是哪些集合佔用
    了大部分讀寫時間,需要clusterMonitor角色許可權
    mongotop -h 192.168.65.174 --port=28017 -user -pwd --authenticationDatabase=admin
    指標名 說明
    ns 集合名稱空間
    total 花費在該集合上的時長
    read 花費在該集合上的讀操作時長
    write 花費在該集合上的寫操作時長

檢測:
操作執行次數
記憶體使用情況
CPU使用率
運算元

  1. mongodb效能檢測工具:Profiler模組可以用來記錄、分析MongoDB的詳細操作日誌。預設情況下該功能是關閉的,對某個業
    務庫開啟Profiler模組之後,符合條件的慢操作日誌會被寫入該庫的system.profile集合中.
    級別 說明
    0 日誌關閉,無任何輸出
    1 部分開啟,僅符合條件(時長大於slowms)的操作日誌會被記錄
    2 日誌全開,所有的操作日誌都被記錄

將level設定為2,此時所有的操作會被記錄下來。

db.setProfilingLevel(2)
db.setProfilingLevel(1,500) //只記錄大於500毫米的慢日誌

檢查是否生效

db.getProfilingStatus()

開啟Profiler模組之後,可以透過system.profile集合檢視最近發生的操作日誌
db.system.profile.find().limit(5).sort({ts:-1}).pretty()
db.system.profile.find({op:"update",ns:"shop.user"}) 檢視某個集合中的update操作日誌

https://www.mongodb.com/zh-cn/docs/v5.0/reference/method/sh.shardCollection/

相關文章