MongoDB分布式数据库集群运行慢问题诊断


最新在定位MongoDB分布式数据库集群运行慢的问题,在此总结一下,排查的方向:

  1. 正在跑一些计算量很大的mapreduce或者aggregation任务;
  2. 查询集合时,没有合理的利用索引,导致全表扫描或排序;
  3. 并发请求的量太大,超过当前集群的服务能力;
  4. 数据库的数据拆分搬迁(即负载均衡)影响性能;
  5. 服务器CPU、内存、磁盘、网络等资源不足。

用户可通过mongo shell连接MongoDB分布式集群,以下场景都基于用户使用mongo shell连接数据库。

负载高问题

Q:CPU利用率高、磁盘IO使用率高,想看看数据库正在执行什么操作?

mongo shell连接实例(mongos或Replica Set),执行db.currentOp()

rs3:PRIMARY> db.currentOp()

造成实例负载高的典型场景

  1. 正在跑一些计算量很大的mapreduce或者aggregation任务;
  2. 查询集合时,没有合理的利用索引,导致全表扫描或排序;
  3. 并发请求的量太大,超过当前集群的服务能力。
{
    "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做进一步的分析,得出各个服务器节点跟实例分别建立了多少连接等信息。

猜你喜欢

转载自blog.csdn.net/wangkai_123456/article/details/84308311
今日推荐