搞会这个索引添加法,十亿级时延敏感集群想抖动都难( 三 )
本文插图
- 问题确认
通过和业务沟通 , 业务这段时间确实通过我们的管控平台串行方式加了几个索引 , 磁盘IO过高由业务加索引引起 , 同时从节点同一时刻有多个索引添加 。 加索引过程首先需要读取表数据 , 然后通过数据构建索引 , 这个过程都会有多次IO操作 。 磁盘IO是公用的 , 服务器IO高会引起该服务器上所有的IO操作变慢 , 因此最终引起从节点读服务抖动 。
- 问题解决过程
由于无法登陆后台做killop操作 , 于是直接kill进程 , kill进程后启动 , 发现mongod还是在构建索引 , 如下:
本文插图
重启后 , 还是需要构建索引 , 因为之前索引没有执行完成mongod进程就挂了 , 因此需要重建索引来保持与主节点状态一直 。
不过 , mongod为了解决类似问题 , 提供了一个noIndexBuildRetry参数来跳过实例加索引中途异常重启后重构索引的流程 , 该参数功能如下说明:
don't retry any index builds that were interrupted by shutdown
noIndexBuildRetry放弃启动从节点mongod实例 , 业务很快恢复:
mongod -f /home/service/mongodb/conf/mongod_20001.conf --noIndexBuildRetry
四、createIndex构建索引核心流程及问题暴露过程
4.1 createIndex构建索引核心流程
业务链接代理通过createIndex命令添加background后台索引 , 其运行流程如下图所示:
本文插图
主节点接受到createIndex命令后的执行主要流程如下:
- 主节点查询对应表数据 , 然后build构建索引 。
- 索引数据构建执行完成后 , 返回客户端OK 。 (注意:主构建完成后就通知OK给客户端 , 实际上这时候从节点还没有开始构建索引)
- 生成createIndex对应oplog数据到oplog表
- 从节点获取到createIndex对应oplog操作 , 然后重放createIndex构建索引 。
通过分析日志时间点和告警时间点 , 和业务确认 , 发现当业务第三个索引添加完成后(实际上只是主节点构建索引完成) , 开始触发时延告警阀值 。 总接时间序列如下:
- MIUI|Reno6开启ColorOS12公测招募,想体验这个功能赶快参加,仅此机会
- 搜索引擎|网站优化关键词重点应该做什么?
- 恐龙|这个遗址公园埋葬了大量的恐龙,随便一根小骨头就比两个人高
- 抗生素|抗生素对人体不同时期肠道菌群的影响,这个时期影响最大!
- 家电业|不是两端分化而是头部聚集,家电业这个趋势会越来越明显吗
- |什么是元宇宙?为何大佬都在扯这个话题,往这个概念上靠
- 小米科技|蚂蚁全媒体刘鑫炜教程:如何5天内让搜索引擎收录你的新网站·一
- 鸡蛋|先有鸡还是先有蛋?这个争论不休的问题,科学家终于找到答案了
- 武汉|智能电视怎么选?一定要关注这个参数
- 天猫|这个综艺竟然揭秘了差评君的家!