最新在定位MongoDB分布式数据库集群运行慢的问题,在此总结一下,排查的方向:
- 正在跑一些计算量很大的mapreduce或者aggregation任务;
- 查询集合时,没有合理的利用索引,导致全表扫描或排序;
- 并发请求的量太大,超过当前集群的服务能力;
- 数据库的数据拆分搬迁(即负载均衡)影响性能;
- 服务器CPU、内存、磁盘、网络等资源不足。
用户可通过mongo shell连接MongoDB分布式集群,以下场景都基于用户使用mongo shell连接数据库。
负载高问题
Q:CPU利用率高、磁盘IO使用率高,想看看数据库正在执行什么操作?
mongo shell连接实例(mongos或Replica Set),执行db.currentOp()
rs3:PRIMARY> db.currentOp()
造成实例负载高的典型场景
- 正在跑一些计算量很大的mapreduce或者aggregation任务;
- 查询集合时,没有合理的利用索引,导致全表扫描或排序;
- 并发请求的量太大,超过当前集群的服务能力。
{
"desc" : "conn237234",
"threadId" : "140563847563008",
"connectionId" : 237234, //唯一标识该连接的id
"client" : "10.62.124.25:42246", //发起该操作的客户端
"active" : true, //当前是否正在执行
"opid" : 212006905, //唯一标识该操作的id
"secs_running" : 1027, //从开始执行到现在话费的时间(单位:秒)
"microsecs_running" : NumberLong(1027400870), //执行时间(单位:微妙)
"planSummary" : "COLLSCAN", //操作是否使用了索引,COLLSCAN表示全表扫描
"numYields" : 8954, //让其它操作优先执行的次数,该值越大,执行耗时越长
}
如果想立即终止掉当前比较慢的操作,用户可以根据opid字段直接kill掉对应的操作
rs3:PRIMARY> db.killOp(opid)
连接数问题
Q:如何查看当前连接数
使用mongo shell连接实例(mongos或Replica Set),执行如下命令
mongos> db.serverStatus().connections
{
"current" : 493, //表示当前已建立连接数
"available" : 65043, //表示当前可用连接数
"totalCreated" : 354746 //表示历史已使用过的连接数
}
Q:如何查看当前连接主要来自哪些服务器节点
mongo shell连接实例(mongos或Replica Set),执行db.currentOp(true),就能输出所有跟该实例建立的所有连接情况,其中client_s字段包含了服务器节点的ip地址信息。
mongos> db.currentOp(true)
{
"inprog" : [
{
"desc" : "conn160756",
"threadId" : "140331373229824",
"connectionId" : 160756,
"client_s" : "10.62.124.25:39848",
"active" : false
},
...
}
有了上述结果,用户就可以根据来源ip做进一步的分析,得出各个服务器节点跟实例分别建立了多少连接等信息。