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做。
Mongo 后台加索引踩坑的更多相关文章
- 神舟+win10+ubuntu16.04+256GSSD+1THHD双系统安装加openssl踩坑之旅
上海最近搞活动调休,要搞深度学习,win上还是不方便,准备弄个ubuntu.于是有以下回忆文字. 在机器上装了个双系统.花了两天.再也不想玩了. 准备用ubuntu来做深度学习的. 本文写于2019年 ...
- 微信支付 V3 RSA 加签踩坑
最近在做微信支付,根据微信官方文档上的要求 用RSA加签去请求支付窗口的调起,下面详细列举支付开发过程: 当前项目的流程大概是,前端根据后端要求提交数据------->拿到后台返回的prepay ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- ios UIWebView加载HTMLStr图文,关于图片宽高设置,webView内容实际高度的踩坑问题
一.关于UIWebView 与 WKWebView 选取问题 从发布时间看: 2008年7月11日,在新一代iPhone3G正式发售当天,iPhone OS 2.0(iOS 2.0)推出,这时候就有U ...
- 【Neo4j】踩坑大会-Neo4J用中文索引
正在用的Neo4j是当前最新版:3.1.0,各种踩坑.说一下如何在Neo4j 3.1.0中使用中文索引.选用了IKAnalyzer做分词器. 1. 首先参考文章: https://segmentfau ...
- 如何加载本地下载下来的BERT模型,pytorch踩坑!!
近期做实验频繁用到BERT,所以想着下载下来使用,结果各种问题,网上一搜也是简单一句:xxx.from_pretrained("改为自己的路径") 我只想说,大坑!!! 废话不多说 ...
- 微信小程序踩坑集合
1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- AI相关 TensorFlow -卷积神经网络 踩坑日记之一
上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是g ...
随机推荐
- 关于httpServlet.service()步骤
关于httpServlet.service()步骤 关于()方法 1.HTTP Servlet 使用一个 HTML 表格来发送和接收数据.要创建一个 HTTP Servlet,就需要扩展 HttpSe ...
- beat冲刺(5/7)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(5/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 ppt制作中 数据集标注 接下来的计划 制作p ...
- 啊啊啊 草蛋啊 之前努力一天搞出来的时间算法 被一句pk掉 给我砖头
package yun3; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Cale ...
- Prim's Algorithm & Kruskal's algorithm
1. Problem These two algorithm are all used to find a minimum spanning tree for a weighted undirecte ...
- Java大数——快速矩阵幂
Java大数——快速矩阵幂 今天做了一道水题,尽管是水题,但是也没做出来.最后问了一下ChenJ大佬,才慢慢的改对,生无可恋了.... 题目描述: 给a,b,c三个数字,求a的b次幂对c取余. 数据范 ...
- 微信小程序倒计时实现
思路:跟一般js倒计时一样,主要在于this的变相传递. 实现效果: wxml文件部分代码: common.js文件 : 引用页JS文件: PS: 1.在data里初始化时间格式,是避免时间加载的第1 ...
- 从微信SDK看ProtoBuffer文件的生成
前言 Protocol Buffers (下面简称PB)是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它可用于通讯协议.数据存储等领域的语言无 ...
- Hibernate(十)
1.批处理 //批处理 :批量处理 //批量插入数据 @Test public void addData(){ Random random=new Random(); for(int i=1;i< ...
- SOAP 缓存问题
今天在进行soap调用老是出错,去其他人的机器上试下,就好了,下面是从网上找到的原因 一开始不知道还有SOAP缓存.因为类文件改变了,重新生成了WSDL文件,测试运行,竟然不能通过.给我的第一感觉是W ...
- [转帖] SQLNET.ORA的处理.
被一个客户端连接远程数据库阻塞超时的问题困扰了好久,最后终于找到了答案 https://blog.csdn.net/herobox/article/details/16985097 Oracle ...