赞
踩
业务描述
需要在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创建索引,只有两个大括号{},否则就会有问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。