Mongo 后台加索引踩坑

摘要:
背景:随着Mongo数据量变大,查询效率变低,索引需要优化,公司严重依赖Mongo,DBA无法控制Mongo的权限。因此,每个后端开发都有Mongo的读/写权限,通常每个人都管理自己模块的数据。最后,O&M和dba检查了各种数据。在mongo重启后,他们决定在两个多小时后停止服务,以恢复原始索引。此时,它仍然是背景模式。该指数在不到五分钟内增长了60%,并被创建。服务已恢复。

背景,随着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 后台加索引踩坑》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VS Code (visual studio code) VSC 编辑器(微软出品,js开发的编辑器)kubernetes集群部署下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL/MariaDB数据库的索引工作原理和优化

MySQL/MariaDB数据库的索引工作原理和优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 实际工作中索引这个技术是影响服务器性能一个非常重要的指标,因此我们得花时间去了解一下索引的相关特性。索引是一把双刃剑用得好可以快速查询数据,用得不好数据库查询速度不仅慢还降低服务器性能,浪费磁盘空间。 一.索引概述 1>.什么是索引...

SqlServer索引假脱机的解决

今天产品提出平台打开某一个模块速度特别慢,甚至有时会出现504的错误。赶紧连接正式版数据库本地调试代码,发现进行数据获取时,打开数据库和关闭数据库中间间隔的时间有5秒之久,这是数据量较少的情况,如果数据量更大的话就有可能出现错误了。看来问题是出在sql语句这里,把sql语句拷贝出来放到查询分析器中进行查看,速度还是很快的,但是查看执行计划的时候发现了问题,...

es机器监控x-pack导致的监控存储过大的问题

https://blog.csdn.net/qq_36317804/article/details/103288642 最近发现磁盘的占用率趋高,打开可视化工具head查看了之后发现,es实例中生成了好多类似monitoring-es-6-2019.11.27这个的节点。 ##查询集群总的磁盘使用情况 curl -u elastic -XGET 'loca...

mssql性能优化

总结下SQL SERVER数据库性能优化相关的注意事项,在网上搜索了一下,发现很多文章,有的都列出了上百条,但是仔细看发现,有很多似是而非或者过时(可能对SQL SERVER6.5以前的版本或者ORACLE是适用的)的信息,只好自己根据以前的经验和测试结果进行总结了。我始终认为,一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开...

SQL Server数据库查询速度慢的原因和解决方法

SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:   1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)   2、I/O吞吐量小,形成了瓶颈效应。   3、没有创建计算列导致查询不优化。   4、内存不足   5、网络速度慢   6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)   ...

SQL Server 列存储索引 第一篇:概述

SQL Server 列存储系列: SQL Server 列存储索引 第一篇:概述 SQL Server 列存储索引 第二篇:设计 SQL Server 列存储索引 第三篇:维护 SQL Server 列存储索引 第四篇:实时运营数据分析 在2017年,我第一次接触列存储索引(ColumnStore),数据库环境是SQL Server 2012,微软...