MongoDB資料庫級別的鎖粒度介紹
從2.2版本開始,MongoDB實現了資料庫級別的鎖,對於大部分的讀寫操作都用資料庫鎖即可,但是一些全域性操作,通常涉及到多個資料庫操作的時候還是需要全域性鎖。在2.2版本之前MongoDB只有全域性鎖,例如,如果有6個資料庫那麼其中一個資料庫的寫操作不會影響其它5個資料庫的讀寫操作的,但是這在2.2之前是不行的。
在MongoDB 3.0版本中鎖的粒度就變得更細了,除了全域性鎖、資料庫鎖還加入了集合鎖,而且對於WiredTiger儲存引擎和MMAPv1儲存引擎而言兩者之間的鎖機制也有不同。
WiredTiger:對於大部分的讀寫操作,WiredTiger使用樂觀鎖。WiredTiger對於全域性、資料庫、集合級別只會使用意向鎖。當儲存引擎檢測到兩個操作之間的衝突,一個寫衝突導致MongoDB透明地重試寫操作。一些全域性操作,跟2.2版本一樣還是會需要全域性鎖,例如,刪除一個集合,那麼仍然還是需要一個互斥的資料庫鎖的。
MMAPv1:3.0版本MMAPv1引擎用集合鎖,相比之前的版本資料庫鎖是最細粒度的鎖而言有了更進一步的改進。例如,在使用MMAPv1作為儲存引擎的資料庫中有6個集合,當其中一個集合寫鎖存在的時候,其它5個集合仍然可以自由的使用讀鎖、寫鎖來進行讀寫操作。
3. 如何檢視當前MongoDB鎖的狀態
MongoDB提供瞭如下的命令來檢視當前的鎖狀態:
db.serverStatus().lock
db.currentOp()
mongotop
mongostat
例如以下命令:
> db.serverStatus().locks (檢視當前鎖狀態和引數)
{
"." : {
"timeLockedMicros" : {
"R" : NumberLong(3446875),
"W" : NumberLong(12490366)
},
"timeAcquiringMicros" : {
"R" : NumberLong(14271840),
"W" : NumberLong(9769978)
}
},
"admin" : {
"timeLockedMicros" : {
"r" : NumberLong(1232329),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(14127),
"w" : NumberLong(0)
}
},
"local" : {
"timeLockedMicros" : {
"r" : NumberLong(2535529),
"w" : NumberLong(44)
},
"timeAcquiringMicros" : {
"r" : NumberLong(67516),
"w" : NumberLong(2)
}
},
"wangshuai" : {
"timeLockedMicros" : {
"r" : NumberLong(1009773),
"w" : NumberLong(208)
},
"timeAcquiringMicros" : {
"r" : NumberLong(37788),
"w" : NumberLong(3)
}
},
"mongodb" : {
"timeLockedMicros" : {
"r" : NumberLong(956544),
"w" : NumberLong(76)
},
"timeAcquiringMicros" : {
"r" : NumberLong(33572),
"w" : NumberLong(2)
}
},
"idx_t" : {
"timeLockedMicros" : {
"r" : NumberLong(1206567),
"w" : NumberLong(94)
},
"timeAcquiringMicros" : {
"r" : NumberLong(31303),
"w" : NumberLong(3)
}
},
"test" : {
"timeLockedMicros" : {
"r" : NumberLong(8352489),
"w" : NumberLong(1787736)
},
"timeAcquiringMicros" : {
"r" : NumberLong(405137),
"w" : NumberLong(5)
}
},
"chenfeng" : {
"timeLockedMicros" : {
"r" : NumberLong(1723920),
"w" : NumberLong(334)
},
"timeAcquiringMicros" : {
"r" : NumberLong(61279),
"w" : NumberLong(92)
}
},
"duansf" : {
"timeLockedMicros" : {
"r" : NumberLong(1449306),
"w" : NumberLong(112)
},
"timeAcquiringMicros" : {
"r" : NumberLong(3003718),
"w" : NumberLong(2)
}
},
"mongodb2" : {
"timeLockedMicros" : {
"r" : NumberLong(962135),
"w" : NumberLong(81)
},
"timeAcquiringMicros" : {
"r" : NumberLong(28994),
"w" : NumberLong(3)
}
},
"idex_t" : {
"timeLockedMicros" : {
"r" : NumberLong(1395111),
"w" : NumberLong(116)
},
"timeAcquiringMicros" : {
"r" : NumberLong(25777),
"w" : NumberLong(2)
}
},
"dsf" : {
"timeLockedMicros" : {
"r" : NumberLong(1196845),
"w" : NumberLong(39)
},
"timeAcquiringMicros" : {
"r" : NumberLong(338304),
"w" : NumberLong(3)
}
}
}
>
在MongoDB 3.0版本中鎖的粒度就變得更細了,除了全域性鎖、資料庫鎖還加入了集合鎖,而且對於WiredTiger儲存引擎和MMAPv1儲存引擎而言兩者之間的鎖機制也有不同。
WiredTiger:對於大部分的讀寫操作,WiredTiger使用樂觀鎖。WiredTiger對於全域性、資料庫、集合級別只會使用意向鎖。當儲存引擎檢測到兩個操作之間的衝突,一個寫衝突導致MongoDB透明地重試寫操作。一些全域性操作,跟2.2版本一樣還是會需要全域性鎖,例如,刪除一個集合,那麼仍然還是需要一個互斥的資料庫鎖的。
MMAPv1:3.0版本MMAPv1引擎用集合鎖,相比之前的版本資料庫鎖是最細粒度的鎖而言有了更進一步的改進。例如,在使用MMAPv1作為儲存引擎的資料庫中有6個集合,當其中一個集合寫鎖存在的時候,其它5個集合仍然可以自由的使用讀鎖、寫鎖來進行讀寫操作。
3. 如何檢視當前MongoDB鎖的狀態
MongoDB提供瞭如下的命令來檢視當前的鎖狀態:
db.serverStatus().lock
db.currentOp()
mongotop
mongostat
例如以下命令:
> db.serverStatus().locks (檢視當前鎖狀態和引數)
{
"." : {
"timeLockedMicros" : {
"R" : NumberLong(3446875),
"W" : NumberLong(12490366)
},
"timeAcquiringMicros" : {
"R" : NumberLong(14271840),
"W" : NumberLong(9769978)
}
},
"admin" : {
"timeLockedMicros" : {
"r" : NumberLong(1232329),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(14127),
"w" : NumberLong(0)
}
},
"local" : {
"timeLockedMicros" : {
"r" : NumberLong(2535529),
"w" : NumberLong(44)
},
"timeAcquiringMicros" : {
"r" : NumberLong(67516),
"w" : NumberLong(2)
}
},
"wangshuai" : {
"timeLockedMicros" : {
"r" : NumberLong(1009773),
"w" : NumberLong(208)
},
"timeAcquiringMicros" : {
"r" : NumberLong(37788),
"w" : NumberLong(3)
}
},
"mongodb" : {
"timeLockedMicros" : {
"r" : NumberLong(956544),
"w" : NumberLong(76)
},
"timeAcquiringMicros" : {
"r" : NumberLong(33572),
"w" : NumberLong(2)
}
},
"idx_t" : {
"timeLockedMicros" : {
"r" : NumberLong(1206567),
"w" : NumberLong(94)
},
"timeAcquiringMicros" : {
"r" : NumberLong(31303),
"w" : NumberLong(3)
}
},
"test" : {
"timeLockedMicros" : {
"r" : NumberLong(8352489),
"w" : NumberLong(1787736)
},
"timeAcquiringMicros" : {
"r" : NumberLong(405137),
"w" : NumberLong(5)
}
},
"chenfeng" : {
"timeLockedMicros" : {
"r" : NumberLong(1723920),
"w" : NumberLong(334)
},
"timeAcquiringMicros" : {
"r" : NumberLong(61279),
"w" : NumberLong(92)
}
},
"duansf" : {
"timeLockedMicros" : {
"r" : NumberLong(1449306),
"w" : NumberLong(112)
},
"timeAcquiringMicros" : {
"r" : NumberLong(3003718),
"w" : NumberLong(2)
}
},
"mongodb2" : {
"timeLockedMicros" : {
"r" : NumberLong(962135),
"w" : NumberLong(81)
},
"timeAcquiringMicros" : {
"r" : NumberLong(28994),
"w" : NumberLong(3)
}
},
"idex_t" : {
"timeLockedMicros" : {
"r" : NumberLong(1395111),
"w" : NumberLong(116)
},
"timeAcquiringMicros" : {
"r" : NumberLong(25777),
"w" : NumberLong(2)
}
},
"dsf" : {
"timeLockedMicros" : {
"r" : NumberLong(1196845),
"w" : NumberLong(39)
},
"timeAcquiringMicros" : {
"r" : NumberLong(338304),
"w" : NumberLong(3)
}
}
}
>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2099433/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL資料庫鎖介紹MySql資料庫
- postgresql資料庫鎖介紹SQL資料庫
- MongoDB 資料庫介紹及安裝MongoDB資料庫
- MongoDB資料模型介紹MongoDB模型
- MongoDB資料庫建立的基本規範簡要介紹MongoDB資料庫
- 資料庫系列:MySQL InnoDB鎖機制介紹資料庫MySql
- MongoDB資料庫簡介MongoDB資料庫
- Sqlserver_Oracle_Mysql_Postgresql不同資料庫之隔離級別介紹ServerOracleMySql資料庫
- MongoDB後設資料的儲存介紹MongoDB
- [轉]介紹了Oracle資料庫鎖的種類及研究Oracle資料庫
- 資料庫介紹資料庫
- MongoDB資料比較工具dbHash介紹MongoDB
- MySQL資料庫引擎、事務隔離級別、鎖MySql資料庫
- 資料庫介紹--初識資料庫資料庫
- mysql鎖之三種行級鎖介紹MySql
- IndexedDB資料庫介紹Index資料庫
- 前端輕量級資料庫mongodb前端資料庫MongoDB
- 【Redis】資料型別介紹Redis資料型別
- Rust 資料型別介紹Rust資料型別
- Oracle資料型別介紹Oracle資料型別
- mysql 行級鎖(按照粒度分類)MySql
- L10資料庫——資料庫介紹資料庫
- MongoDB介紹MongoDB
- HSQL 資料庫介紹(1)--簡介SQL資料庫
- Nosql 資料庫 MemCache、Redis、MongoDB 的區別SQL資料庫RedisMongoDB
- 面試官問:請介紹一下MySQL資料庫的鎖機制?面試MySql資料庫
- 2 Day DBA-介紹-資料庫識別符號資料庫符號
- 資料倉儲—資料庫—Oracle 介紹資料庫Oracle
- 常見MongoDB資料庫操作產生的鎖總結MongoDB資料庫
- PostgreSQLGUC引數級別介紹SQL
- 國產資料庫:達夢資料庫的幾個版本介紹資料庫
- MongoDB shell 介紹MongoDB
- 資料庫安全知識介紹資料庫
- QuestDB時序資料庫介紹資料庫
- HSQL 資料庫介紹(2)--使用SQL資料庫
- mysql的 information_schema 資料庫介紹MySqlORM資料庫
- yum方式安裝MongoDB所需要的資料包列表介紹MongoDB
- 資料倉儲—資料庫—SQL Server 介紹資料庫SQLServer