MongoDB在執行寫操作時,WiredTiger存儲引擎會在文檔級別進行併發控制。換句話説在同一時間點上,多個寫操作能夠修改同一個集合中的不同文檔;而當多個寫操作修改同一個文檔時,必須以序列化方式執行。這意味着如果當前文檔正在被修改,其他寫操作必須等待該文檔上的寫操作完成之後才能進行修改。對於大部分的文檔讀寫操作,WiredTiger引擎使用的都是樂觀鎖;而在數據庫和集合級別,WiredTiger使用的是意向鎖。當WiredTiger存儲引擎探測到兩個操作之間發生了衝突,將會產生一個寫衝突並將會重新執行操作。在瞭解到了MongoDB的併發控制機制以後,下面通過一個示例來演示如何監控MongoDB鎖的信息。
(1)切換到scott數據庫中。
test@nosql11 1> use scott
(2)通過一個循環向MongoDB的集合中插入100百萬條文檔:
scott@nosql11 3> for(var i=1; i<=1000000;i++){
db.test4.insert({"_id":i,"action":"write simulations","iteration no:":i});
}
(3)使用mongotop監控MongoDB讀寫操作的統計信息。
mongotop
# 輸出的信息如下:
2022-04-04T15:48:58+08:00
ns total read write
scott.test4 114ms 0ms 114ms
admin.system.version 0ms 0ms 0ms
config.system.sessions 0ms 0ms 0ms
config.transactions 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
(4)使用db.serverStatus監控鎖的信息。
scott@nosql11 6> db.serverStatus().locks
# 輸出的信息如下:
......
"Database" : {
"acquireCount" : {
"r" : NumberLong(10),
"w" : NumberLong(119862),
"R" : NumberLong(1),
"W" : NumberLong(1)
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(13),
"w" : NumberLong(119860),
"W" : NumberLong(2)
}
},
......
提示:從鎖的信息可以看出,此時在數據庫級別和集合級別產生了大量的寫鎖信息。