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 ...
随机推荐
- 第二次作业<1>
1001.A+B Format (20) ac代码 1. 解题思路 先求和,再输出. 答案区间为-2,000,000至2,000,000,将答案分为三个区段分类讨论.虽然觉得很烦但是想不出更好的方法. ...
- Linux(Red hat)无网离线安装TensorFlow
文件下载 首先,下载想要安装的版本,目前最新的是1.8.0 根据你的python版本下载对应的whl文件,下载连接:https://pypi.org/project/tensorflow/#files ...
- Java 多生产者消费者问题
/* 生产者,消费者. 多生产者,多消费者的问题. if判断标记,只有一次,会导致不该运行的线程运行了.出现了数据错误的情况. while判断标记,解决了线程获取执行权后,是否要运行! not ...
- 深入浅析JavaScript的API设计原则(转载)
一.接口的流畅性 好的接口是流畅易懂的,他主要体现如下几个方面: 1.简单 操作某个元素的css属性,下面是原生的方法: ? 1 document.querySelectorAll('#id').st ...
- https 的理解
前言: 本篇博文来记录下对http及https的理解.(会有点 杂,补缺补漏) 引用:https://blog.csdn.net/u011109589/article/details/80306479 ...
- Qt之美(一):d指针/p指针详解(二进制兼容,不能改变它们的对象布局)
Translated by mznewfacer 2011.11.16 首先,看了Xizhi Zhu 的这篇Qt之美(一):D指针/私有实现,对于很多批评不美的同路人,暂且不去评论,只是想支持 ...
- android之layer-list
效果图: 实现代码: <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:and ...
- 快速用梯度下降法实现一个Logistic Regression 分类器
前阵子听说一个面试题:你实现一个logistic Regression需要多少分钟?搞数据挖掘的人都会觉得实现这个简单的分类器分分钟就搞定了吧? 因为我做数据挖掘的时候,从来都是顺手用用工具的,尤其是 ...
- Django 2.0 学习(22):Django CSRF
Django CSRF CSRF攻击过程 攻击说明: 1.用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登陆网站A: 2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时 ...
- Luogu4884 多少个1?(BSGS)
11……1(n个)=99……9(n个)/9=(10n-1)/9. 那么显然就是求离散对数了,BSGS即可. #include<iostream> #include<cstdio> ...