从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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15498/viewspace-2099433/