问题情况说明
测试功能时发现:Mogodb某天在操作文件时异常缓慢。程序和代码都没有任何修改。
问题排查及分析
- 分析变动的点:
- 最近一直有在做功能验证,mongodb的数据量一直在上涨。fs.trunks的大小为4万左右
- 第一次发现这个问题的时候做的操作:删除fs.files、fs.trunks【以前也这么干过】
- 进入mongodb - linux服务器,执行top后发现mongodb的CPU消耗极高【4核CPU占了370%】
- 在mongo主节点执行如下命令:
- mongo
- use admin
- db.auth("管理员用户名","密码")
- db.currentOp({"ns":/^问题库名/})
- 找出所有 secs_running时间长的语句
- 分析耗时高的语句
- 发现fs.trunks消耗时间很长。command为:
{ "q":{ "files_id":Object_Id("一段hash值") }, "limit":0 }
-
进一步分析:这个只是一个简单查询不应该这么慢
-
检查集合是否存在索引: db.fs.chunks.getIndexes()
-
发现 files_id字段没有索引【震惊!!】
-
到这就基本知道原因了,加上索引,问题解决。
总结
分析索引消失原因:以前手动删除过集合【删除集合会把所有索引清空,只保留_id。】使用Spring的应用在没有集合的情况下启动时会自动创建集合及其索引,但是如果是运行时删了集合、再发生insert创建的集合是不带索引的。
解决方案
使用命令或者工具加上索引: db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );
官网也有这段解决方案:https://docs.mongodb.com/manual/core/gridfs/#gridfs-indexes