Mongo 后台加索引踩坑

背景,随着mongo数据量变大,查询效率变低,要对索引进行优化,所在公司对mongo依赖比较严重,而DBA并不对mongo的权限做控制,所以每个后端开发都有mongo的读写权限,通常每个人各自管理自己的模块的数据。

由于笔者所负责的模块数据增长较快,用户的关键业务数据都存在mongo里面,很快mongo里面的数据就积累到几百万,之前只有一个五个字段的联合索引,所以是时候作死了。。。

本着作死要有条不紊有依有据的原则,在测试数据库接近百万数据量的相同Collection里面进行了实操,阻塞方式加索引简直快的飞起,shell里面结果秒回,实际执行没有监控,但也很快,因为几秒内去测试接口,速度明显提高,这样折腾了几回之后公司qa反映接口响应速度很快,顿时信心爆棚,要上线上大展拳脚。

一个月后,要优化接口的任务下来了,顿时心花怒放,多日的准备终于要看到成果了:

一开始还是很谨慎的,试着加上一个索引,当然时间选择是下班前,这时候客户大多下班,出了事情也能得到本公司运维的及时支持,照着测试环境的步骤,一个一个加,结果没有任何用户感知的情况下索引加成功!本着谨慎的原则,唯一一个与测试环境操作不同的就是后台参数为true,天真的以为这样就可以不影响服务了,正是这个不同导致了灾难,事实上前几个索引的添加确实没什么问题,十几秒就添加成功,精神也逐渐松懈下来,这时,套用凯文哈特的一句话,It‘s about to go down!

加完了该加的索引后,去线上看看效果,结果并不理想,猜想原因是之前的5个键的联合索引影响了查询效率,于是想将其拆开,这样虽然特定的一个接口效率会有所降低,但是却照顾了大多数的接口,于是删除了这个索引,然后开始新建索引,过了一分钟,还没有返回结果,线上各种服务开始各种pending。。。事故发生,并持续了3个小时。

看到这里大家就都明白了,就是删除这个联合索引的时间过早了,因为之前添加的索引没有一个是覆盖了这个联合索引中的某个键值的,更要命的是区区几百万数据,主从同步的话应该会很快,偏偏被我自作聪明的选择了后台建索引。这样就导致删除索引后查询开始变慢,这时在线用户还不少,一定量针对mongo的请求开始积压,在短时间内沾满的主服务的连接池,然后不用mongo的的接口也开始变慢,mongo一看进来了查询,就优先处理查询,索引就迟迟建不完,那么索引就不能被使用,查询就会慢,进入了恶性循环。

最终运维和dba查了各种资料在进行了一次mongo重启后,在两个多小时后,决定停服把原来的索引加回去,这时仍然是后台方式,不到5分钟索引就增长了60%完成了创建,服务恢复。

总结:第一点,数据库的索引操作一定在深夜进行,防止影响服务。第二点,看起来谨慎的后台建索引方式并不是最好的,数据量不大的情况下,阻塞可能更干脆影响更小,在本案中,不到几十秒肯定就能完成前台建立单键索引。最后,手里有权限不代表能操作,以后这种事一定要给DBA做。

时间: 2024-10-21 21:48:04

Mongo 后台加索引踩坑的相关文章

Ajax 请求时后台跳转 前端页面不更新踩坑记录

踩坑环境:前端:Ajax post请求,json类型数据:后端 C#+MVC,前后端正常通信,但是当后台验证权限不通过时会RedirectToAction跳转到登录页,结果现象是后台正常执行登录页的渲染,渲染完成之后前端ajax进入error,页面不刷新. 经检查页面不跳转是因为后台渲染页面后以字符串形式返回,被ajax接收,有因为前端设置json格式所以进入error,看来需要后台返回状态和url,前端js来进行页面跳转,但总感觉这样不太方便,继续研究一下能否实现后台跳转,有方案再来更新内容.

运营亚马逊无货源需要多加注意的3个点,如何才能避免踩坑

每个行业有每个行业的规则,新手小白在新入一个行业的时候,非常容易因为不了解行业规则而踩很多的坑,其实等到你熟悉平台之后再回头看,你会发现刚起步时踩过的很多坑其实都是能够避免的,今天为大家简单的说一些运营亚马逊无货源模式需要多加注意的五个点,让大家能尽量避免踩坑. 既然做亚马逊,肯定需要去注册店铺的,在注册店铺的时候,注意你的材料是否干净,这个干净指的是是否曾用来注册过亚马逊店铺,邮箱最好使用新的,毕竟邮箱好注册,注册一个新的也能进一步确保注册店铺时的安全性,公司执照的话有限公司的就可以了,个体户

Android开发在路上:少去踩坑,多走捷径【转】

作者:gzjay,腾讯MIG无线产品部 高级工程师 最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的,所以有了这个小分享. 1.目前, Android APP开发完成后,通常需要在哪些机型上进行测试? 2.目前, 开发Android APP时,需要考虑的分辨率有哪些? 这两个问题可以合起来回答的. http://developer.android.com/about/dashboards/index.html 源自Google Play的数据,每月都会进行upd

AI相关 TensorFlow -卷积神经网络 踩坑日记之一

上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是google开源出来的人工智能库,由python语言写的 官网地址:http://www.tensorflow.org/   请用科学上网访问 中文地址:http://www.tensorfly.cn/ 当然还有其他AI库,不过大多数都是由python 写的 .net 的AI库叫 Accord.net

Java踩坑之路

陆陆续续学Java也快一年多了,从开始的一窍不通到现在的初窥门径,我努力过,迷茫过,痛过,乐过,反思过,沉淀过.趁着新年,我希望能把这些东西记下来,就当是我一路走来的脚印. 一.初识网站应用 记得第一次接触Java,是写一个小网站,当时用servlet+tomcat做服务端,数据库是mysql.那时我对于网站应用的概念一片空白,之前接触的都是C++和MFC写桌面程序.我花了一周时间看完了<java servlet programming>这本书,然后我就开始写代码了.但是,真的当我写代码的时候

(转载)Android开发在路上:少去踩坑,多走捷径

1. 目前, Android APP开发完成后,通常需要在哪些机型上进行测试? 2. 目前, 开发Android APP时,需要考虑的分辨率有哪些? 这两个问题可以合起来回答的. http://developer.android.com/about/dashboards/index.html 源自Google Play的数据,每月都会进行update,可以及时了解Android版本比例趋势. 屏幕密度数据 OpenGL ES版本 也可以参考一下国内一个第三方数据:http://www.umind

【转】Android开发在路上:少去踩坑,多走捷径

本文是我订阅"腾讯大讲堂"公众帐号时,他们推送的一篇文章,但在腾讯大讲堂官网上我并没有找到这篇文章,不过其它专门"爬"公众号文章的网站倒是有.我觉得写的很不错.就转载出来,如有版权问题请email告知.   你可以通过扫描下面的二维码来关注"腾讯大讲堂"     ----------------------------------------- 我是可恶的分隔线 -----------------------------------------

Android学习之友盟5.0推送,分享踩坑总结

这几天都没有写博客,今天集成友盟5.0推送,分享,得闲,总结一下友盟5.0推送分享踩得哪些坑! 之前写的友盟踩坑心得是基于友盟4.3版本的,现在友盟5.0相较于4.3,有了较大的改动,呜呼哀哉!学而时习之吧. 友盟5.0的好处:集成推送,分享可以通过导入module的形式,代码简化,维护性高,(一些资源文件就不用自己慢慢去拷贝了). 至于缺点,就是刚刚改版,会有很多跟4.3不一样的使用方法,所以需要前人去踩坑了! 友盟推送: 1:添加Module Android studio导入Module自不

一次痛苦又甜蜜的微信支付踩坑之旅

凡是和钱打交道的事,没有一样是容易的.这是我第一次接触微信支付,发现网上还是有很多同学在求助,XXX了怎么办?XXX是什么情况?为了帮助更多的小伙伴脱离"苦海",我决定写下这次的踩坑之旅,给更多的人帮助. 介绍 微信支付方式分为刷卡支付.公众号支付.扫码支付.APP支付.H5支付.小程序支付. 先从应用场景来各自说一说,这样,能够最快的判断出应该选择哪一种支付. 刷卡支付:使用扫描设备(扫描枪)多见于超市.便利店使用 公众号支付:嵌入公众号的H5页面 扫码支付:用户打开"微信