timeline
- 接口响应慢告警,重要的接口,危险危险。Nginx的log告诉我确实。
- 业务服务器内存、cpu均正常,报错日志少。
- 检查MongoDB CPU 99%,大量慢日志,三个shard,全集中压力到shard1
- 紧急扩容,卡死,重启扩容
- 定位具体SQL,找到业务逻辑,某种场景下有大量的查询和修改,没走索引直接爆炸。
- 业务设计上有逻辑限流、逻辑开关。紧急关闭,mongo压力降低。
定位手段
查询现在的慢SQL
db.currentOp()
查看这个表的执行计划
和MySQL一样,也有explain
db.test.find({"data_id" : "ae4b5769-896f-465c-9fbd-3fd2f3357637"}).explain();
db.test.find({"data_id" : "775f57c2-b63e-45d7-b581-3822dba231b4"}).explain("executionStats");
explain 中的参数有三种
- queryPlanner 模式
默认情况下,db.collection.explain()在queryPlanner详细模式下运行(无参的默认形势)。
MongoDB 运行查询优化器来为 evaluation 下的操作选择获胜计划