【译】使用MongoDB时,如何停止失控的索引创建过程?

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 【原文】https://scalegrid.io/blog/how-to-stop-a-runaway-index-build-in-mongodb/【译文】在MongoDB上建索引可能会对MongoDB集群对可用性产生负面影响。

【原文】https://scalegrid.io/blog/how-to-stop-a-runaway-index-build-in-mongodb/
【译文】
在MongoDB上建索引可能会对MongoDB集群对可用性产生负面影响。在生产服务上,如果针对一个大集合触发建立索引,且在前台运行,你可能会发现,在索引建完之前,整个集群都无影响。在一个大集合上,这个过程可能会持续几个小时,甚至几天。

推荐的最佳做法是,触发建索引,但让其在后台运行。然而,当是大集合的索引,我们依然会碰到很多问题。以三节点集群为例,两个从节点启动建索引,停止对所有请求的响应。此时,主节点没有足够法定个数,进而转化为从节点状态,整个集群此时就完了。基于命令行触发的默认的建索引都是在前台建索引,这产生了普遍性的问题。在未来的发行版中,希望能默认后台运行。

一旦你触发一个索引,简单的重启服务并不能解决这个问题,因为MongoDB会继续重启前的建索引的工作。如果之前你运行后台建索引任务,在服务重启后它会变成前台运行的任务。在这种情况下,重启会让问题变得更糟糕。

如果你已经启动了建索引的任务,该如何停止它呢?幸运的是,有方法相对简单的停止建索引任务。

选项一:杀掉建索引的进程

使用db.currentOp()定位建索引进程,然后使用db.killOp(<opid>)杀掉操作。建索引大致会是以下的样子:
{ "opid" : 820659355, "active" : true, "lockType" : "write", .... "op" : "insert", "ns" : "xxxx", "query" : { }, "client" : "xxxx", "desc" : "conn", "msg" : "index: (2/3) btree bottom up 292168587/398486401 64%" }
如果正在建索引的节点不能响应新连接,或者killOp不起作用,使用选项二。

选项二:配置“noIndexBuildRetry”并重启

MongoDB提供了选项“noIndexBuildRetry”,它会指示MongoDB重启后不再继续没建完的索引。
该参数并没有直接出现在配置文件中,只是作为mongod进程的参数。不推荐手工使用该参数运行mongod,因为如果你偶尔以特定用户(如root)运行monogod进程,它最终会改变所有文件的权限。一旦以root运行,我们再次以mongod运行时,会遇到间歇性的问题。
简单的做法是修改文件 /etc/init.d/mongo。查找下面这行:
OPTIONS=" -f $CONFIGFILE"
替换为以下内容:
OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"

详细步骤

为了讨论,针对CentOS/RedHat/Amazon Linux提供了指令。

1.配置“-noIndexBuildRetry”

在所有数据节点中,增加“-noIndexBuildRetry”配置选项。

2.重启所有建索引的节点

检查每个数据服务的mongod日志文件,检查是否在建索引。如果还在建,运行命令“service mongod restrart”重启服务。

3.删除未完成的索引

一旦所有相关的节点都重启,检查所有索引列表,删除掉列表中的未完成的索引。

4.移除“-noIndexBuildRetry”

修改文件(/etc/init.d/mongod),移除第一步添加的-noIndexBuildRetry配置选项,这样我们让服务恢复到原来的默认行为,即自动继续建索引。
祝建索引愉快!

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
3月前
|
存储 NoSQL 关系型数据库
|
6月前
|
NoSQL MongoDB 索引
【最佳实践】MongoDB导入数据时重建索引
【最佳实践】MongoDB导入数据时重建索引
168 0
|
7月前
|
JSON NoSQL MongoDB
mongodb基本操作,增删改查,查询,索引,权限机制
mongodb基本操作,增删改查,查询,索引,权限机制
|
6月前
|
NoSQL MongoDB 索引
开心档-软件开发入门之MongoDB 覆盖索引查询
开心档-软件开发入门之MongoDB 覆盖索引查询
45 0
|
16天前
|
NoSQL MongoDB 索引
【MongoDB】MongoDB 覆盖索引
【4月更文挑战第3天】【MongoDB】MongoDB 覆盖索引
|
3月前
|
存储 NoSQL 关系型数据库
4-MongoDB索引知识
MongoDB索引知识
|
3月前
|
NoSQL MongoDB 索引
【待完善】MongoDB - 使用索引
【待完善】MongoDB - 使用索引
30 0
|
3月前
|
存储 NoSQL MongoDB
MongoDB之索引和聚合
【1月更文挑战第21天】 一、索引 1、说明 2、原理 3、相关操作 3.1、创建索引 3.2、查看集合索引 3.3、查看集合索引大小 3.4、删除集合所有索引(不包含_id索引) 3.5、删除集合指定索引 4、复合索引 二、聚合 1、说明 2、使用
65 0
|
9月前
|
存储 NoSQL MongoDB
【mongo 系列】mongodb 学习七,索引实操练习
向 mydoc 集合中,插入多条数据,mydoc 之前是没有存在过的,我们直接使用 db.mydoc.insertMany() ,mongodb 会默认给我们新建这个集合
|
5月前
|
存储 NoSQL Cloud Native
mongodb 索引实操
mongodb 索引实操