对MongoDB有所了解的人都知道,MongoDB有一个让人头疼的全局锁(读写锁,允许并发读,而写会阻塞所有的读写),要命的是这个锁不是表级的,不是库级的,而是整个Server级别的,这让人听起来是不是非常的蛋疼。
在2.0版本以前,这一问题一直没有得到解决,于是有人提出,在可预见某个update操作的记录可能在磁盘上时,为了减少写锁占用的时间,可以采用先读后写的方式,通过先读一次,将要操作的记录加载到内存中,再进行内存中的update,这样写锁就不包括将数据从磁盘加载到内存的时间了。
在可预见数据冷热的情况下,这种操作能够有一定的效果,但是很明显,这种变态的方法不应该是一个终极解决方案。
值得庆幸的是,在2.0版本中,MongoDB宣称有很大程度的并发性能提升,而这一提升的基础正是解决了这个全局锁的问题。
解决的方法并不是通过减少锁粒度来解决,虽然collection级别的锁机制也正在开发中。(SERVER-1240)
解决方法是通过对一些可能造成长时间锁占用的操作进行锁抑制。比如和我们上面的方法类似,在进行update操作时,如果发现需要更新的记录在磁盘上,那么这个锁就不会一直占用,而是等到将数据从磁盘加载到内存后再添加写锁进行update。
而同理,对于其它一些可能耗时比较长的操作也可以采用类似的方法,通过将长时间占用的全局锁拆分成多个细粒度的小锁来使需要获取锁来进行的操作能够交错的执行,从而避免一夫当关万夫莫开的情况,主要包括下面一些操作:
- 查询操作
- 批量更新操作
- 批量删除操作
- 批量insert写入操作
如果你还在使用2.0以前的版本,并且在并发性能上出现问题,可以考虑在2.0.x版本上进行一些性能测试并对你的MongoDB进行升级。
参考:http://www.mongodb.org/display/DOCS/How+does+concurrency+work
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
MongoDB与Cassandra数据库对比
MongoDB和Cassandra都属于NoSQL数据库系列,它们也恰好都是开源,但是,它们的相似之处仅此而已 […]
-
OpenWorld18大会:Ellison宣布数据库的搜寻和破坏任务
在旧金山举行的甲骨文OpenWorld 2018大会中,甲骨文首席技术官(CTO)兼创始人Larry Elli […]
-
eHarmony公司利用Redis NoSQL数据库进行热存储
虽然关系型数据库不会消失,但关系型数据库管理系统有时仅在会话管理、推荐引擎和模式匹配等关键Web应用程序中担当 […]
-
ObjectRocket着力发展Azure MongoDB服务
MongoDB吸引了微软公司的注意力,微软公司计划针对运行于该公司2017年发布的Azure Cosmos D […]