收到线上数据库cpu告警信息,查看发现数据库监控发现Mongodb primary节点 cpu使用率接近90%。用到命令db.currentOp()和db.killOp()

1.查看日志

日志分析:全表扫描,使用索引过滤文档数0,全表扫描1146174个文档,执行时间720ms,过滤日志发现次数3000多次。 planSummary: COLLSCAN keysExamined:0 docsExamined:1146174 cursorExhausted:1 numYields:8954 nreturned:1 reslen:1762 locks:{ Global: { acquireCount: { r: 17910 } }, Database: { acquireCount: { r: 8955 } }, Collection: { acquireCount: { r: 8955 } } } protocol:op_msg 720ms

2.打印数据当前操作

 mongos> db.currentOp()          //返回数据库当前所有操作

image.png

定位到慢查询操作的opid

image.png

mongos> db.killOp("cmgo-kj6dtmrr_0:1540756629") //将慢查询kill掉,

3.创建索引

Mongodb 4.2版本之前创建索引需要 添加background指定为true,如果索引v2版本指定"background" : 1,默认为false前台索引创建会阻塞数据库上的所有其他操作,我们使用的版本为3.6。

mongos> db.app_trace_log.createIndex({"traceId":1},{"background":1} )  //后台创建索引
mongos> db.app_trace_log.getIndexes()
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_",
		"ns" : "app_log.app_trace_log"
	},
	{
		"v" : 2,
		"key" : {
			"traceId" : 1
		},
		"name" : "traceId_1",             //默认索引名:索引字段_1
		"ns" : "app_log.app_trace_log",
		"background" : 1
	}
]

注意:这两个命令是不一样的

db.app_trace_log.createIndex({"traceId":1},{"background":1} )   //后台创建单建索引,mongodb默认也创建了"traceId":-1倒序索引,不需要在创建倒序索引了
db.app_trace_log.createIndex({"traceId":1,"background":1} )   //创建复合索引

查看监控,已恢复正常 image.png 和业务进行沟通新上线了功能,集合没有添加索引,访问量上来导致全表扫描。

db.currentOp({"$ownOps" :true}) //查看当前用户的操作信息