暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mongodb新旧版本索引创建锁分析

IT那活儿 2022-08-26
1685

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


  

客户生产环境中当前使用的Mongodb数据库大多数都是3.6或者更低的版本,在3.X版本中创建索引,分为前台和后台创建,前台创建索引会加库级锁,导致该库上的其他所有读写操作都会被阻塞,后台创建则不会阻塞增删改查操作,但是建索引的效率会变慢。

本文将对3.6和4.2以上版本建索引的区别进行对比。


官方文档相关的说明

从 MongoDB 4.2 开始,创建索引仅在构建过程的开始和结束期间对被索引的集合获取排他锁,以保护元数据更改。构建过程的其余部分使用后台索引构建的行为来最大化构建期间对集合的读写访问。
4.2版本以后的优化后的索引创建过程的性能至少与旧版本的background创建方式相同。如果说创建索引的集合的增删改操作较少,则性能跟前台创建索引一样。
索引的创建过程及加锁情况如下表:


不同版本数据库建索引测试对比

本次采用3.6和4.2两个版本在相同的集合上创建索引进行对比。
测试用的集合包含1000W个文档,大小近400MB。
3.6版本前台创建索引,可看到从建索引开始一直持有库级排他锁,如下图:
当在后台创建索引时,全局、库级、集合级都是IX锁,不会对其他读写操作进行阻塞,见下图:
在4.2版本中创建索引时,由于两个持有排他锁的阶段时间都很短,我们没法捕获到,下面两个截图,分别是集合扫描和临时表(side write table)数据处理阶段,均持有的是意向共享锁和意向排他锁,不会对其他会话读写进行阻塞。

总结:在目前的mongodb运维中,曾出现多次由于开发人员对mongodb索引特性不熟悉,未使用background:true创建索引而导致数据库阻塞的故障。

经验证测试,4.2以后的版本创建索引不会产生长时间的阻塞,且索引创建效率比后台创建索引要略快。所以可以结合其他实际情况推动数据库升级到4.4版。


本文作者:刘运彬(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论