当前位置:   article > 正文

mongo 建索引需要关注的点_mongo createindex backupground

mongo createindex backupground

业务描述

  • 需要在mongodb的集合timeline创建一个TTL索引[31.5天后过期]

ttl索引

shard1:PRIMARY> db.timeline.count()

482594935

  • 业务定于的时间

  (1)每天上午没有业务,能进行创建和删除

  (2)DBA建议在晚上12点后操作(业务没有采纳)

  (3)最终定于2018/5/19上午10点开始创建TTL索引

  • 开始创建索引正在主库执行

命令如下:db. timeline.createIndex({"created": 1},{ name: "idx_infos_created",expireAfterSeconds: 2721600},{background:true})

大约执行50%左右,业务要求停止创建索引,停止后,mongoDB索引会有重建功能,需要特殊处理

说明:即使使用这种方式创建索引成功,会没有"background" : true

创建后的索引查看db.infos.getIndexes()

  • 停止创建索引操作

(1)在每个secondary节点操作(2个secondary节点操作)

      mongod -f cumm.conf --shutdown停止

      mongod -f cumm.conf –noIndexBuildRetry  不重建索引

      时间大概30s左右完成

  (2)在primary操作

     kill创建索引线程

     将primary shutdown

     然后有一个secondary节点自动接管primary

 大概两个操作能控制在1分钟内(即影响业务时间)

tips:

   这样操作能有效避免发生重大业务问题

  • 灾难再现

(1)上面几个步骤做完之后,业务会正常DML和查询等操作

(2)但是业务的程序有一个特点

     a.java回放程序启动判断有没有索引,没有会自动重建

     b.并且重建索引在是前台运行,阻塞所有查询和DML操作

  • 建议

 (1)严格按照DBA给予规定的时间执行DDL

 (2)应用配置使用副本集模式

 (3)程序去掉自动检测索引是否存在而后进行重建  DDL操作不能再程序有

 (4)我们这边会针对性的进行培训,有效避免这样的事情

tips:

  从这次故障中,梳理出了程序的配置弊端,有利于今后程序配置的良好性和正确性

· 正确的做法

db. timeline.createIndex({"created": 1},{ name: "idx_infos_created",expireAfterSeconds: 2721600,background:true}) #31.5天后过期 

rsvk:PRIMARY> db.infos.count()

31028907—数据量少了1千多万

MongoDB创建索引,只有两个大括号{},否则就会有问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/904016
推荐阅读
相关标签
  

闽ICP备14008679号