项目场景:
服务器运维小伙伴说服务器CPU资源告警, 让我查一下问题原因
问题描述
mongo0容器长期占用过高CPU资源
原因分析:
近期接口被调用频繁, TPH约7000, 而接口代码中使用{‘data_id’: data_id}为filter updateOne文档, 而data_id没有索引, 导致检索效率低
解决方案:
为data_id创建索引
我们知道mongoDB创建索引只需要执行
db.col.createIndex({data_id: 1})
但我这里是副本集, 需要在每个节点上创建索引, 而且接口要始终保持在线.
【MongoDB运维】为MongoDB副本集添加索引
演示环境:
Docker: 20.10.17
MongoDB: 5.0.8
一主一从一投票
-
10.11.206.4 : 27017(PRIMARY)
-
10.11.206.141 : 27017(SECONDARY)
-
10.8.15.49 : 27018(ARBITER)
操作
查看索引
db.xj_liquid_fertilizer.getIndexes()
关闭从节点
docker-compose down
启动standalong
使用standalone模式启动mongoDB, 且使用与之前不同的端口号
添加索引
db.xj_liquid_fertilizer.createIndex({data_id:1})
查看索引
db.xj_liquid_fertilizer.getIndexes()
关闭standalong
启动从节点
等待主从同步数据
关闭主节点
docker-compose down
启动standalong
使用standalone模式启动mongoDB, 且使用与之前不同的端口号
添加索引
db.xj_liquid_fertilizer.createIndex({data_id:1})
关闭standalong
启动原主节点
等待主从同步数据
效果对比
参考: https://blog.csdn.net/leshami/article/details/61201642
2022-07-20更新
今天在另一个表中添加了复合索引
db.web_jdy_app_logs.createIndex({entry_id:1,create_time:1})
约9w条数据的updateOne(upsert=true)的方式插入空表,下图是添加索引前后资源占用对比