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自動建立索引
- 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
- mongodb效能檢測工具:FreeMonitoring
1 # 啟用監控
db.enableFreeMonitoring()
db.getFreeMonitoringStatus()
2 # 禁止監控
db.disableFreeMonitoring()
https://cloud.mongodb.com/freemonitoring/cluster
- 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等異常值則需要修復。
- mongodb效能檢測工具:mongotop命令可用於檢視資料庫的熱點表,透過觀察mongotop的輸出,可以判定是哪些集合佔用
了大部分讀寫時間,需要clusterMonitor角色許可權
mongotop -h 192.168.65.174 --port=28017 -user -pwd --authenticationDatabase=admin
指標名 說明
ns 集合名稱空間
total 花費在該集合上的時長
read 花費在該集合上的讀操作時長
write 花費在該集合上的寫操作時長
檢測:
操作執行次數
記憶體使用情況
CPU使用率
運算元
- 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/