【发布时间】:2012-02-17 00:46:56
【问题描述】:
获取连接到特定 MongoDB 服务器的客户端数量的命令是什么?
【问题讨论】:
标签: mongodb
获取连接到特定 MongoDB 服务器的客户端数量的命令是什么?
【问题讨论】:
标签: mongodb
连接到管理数据库并运行db.serverStatus():
> var status = db.serverStatus()
> status.connections
{"current" : 21, "available" : 15979}
>
可以直接查询得到
db.serverStatus().connections
要了解 MongoDb 的 db.serverStatus().connections 响应是什么意思,请阅读文档 here。
连接
"connections" : { "current" : <num>, "available" : <num>, "totalCreated" : NumberLong(<num>) },连接 报告连接状态的文档。使用这些值来评估服务器的当前负载和容量要求。
connections.current 从客户端到数据库服务器的传入连接数。此数字包括当前的 shell 会话。考虑connections.available的值来为这个数据添加更多的上下文。
该值将包括所有传入连接,包括任何 shell 连接或来自其他服务器的连接,例如副本集成员或 mongos 实例。
connections.available 可用的未使用传入连接数。将此值与connections.current 的值结合起来考虑以了解数据库上的连接负载,以及UNIX ulimit 设置文档以了解有关可用连接的系统阈值的更多信息。
connections.totalCreated 创建到服务器的所有传入连接的计数。此数字包括已关闭的连接。
【讨论】:
db.serverStatus() 不提供已打开和可用的连接,但不显示来自哪个客户端的连接。有关更多信息,您可以使用此命令 sudo lsof | grep mongod | grep TCP。当我进行复制并且主节点的客户端连接数大于辅助节点时,我需要它。
$ sudo lsof | grep mongod | grep TCP
mongod 5733 Al 6u IPv4 0x08761278 0t0 TCP *:28017 (LISTEN)
mongod 5733 Al 7u IPv4 0x07c7eb98 0t0 TCP *:27017 (LISTEN)
mongod 5733 Al 9u IPv4 0x08761688 0t0 TCP 192.168.1.103:27017->192.168.1.103:64752 (ESTABLISHED)
mongod 5733 Al 12u IPv4 0x08761a98 0t0 TCP 192.168.1.103:27017->192.168.1.103:64754 (ESTABLISHED)
mongod 5733 Al 13u IPv4 0x095fa748 0t0 TCP 192.168.1.103:27017->192.168.1.103:64770 (ESTABLISHED)
mongod 5733 Al 14u IPv4 0x095f86c8 0t0 TCP 192.168.1.103:27017->192.168.1.103:64775 (ESTABLISHED)
mongod 5733 Al 17u IPv4 0x08764748 0t0 TCP 192.168.1.103:27017->192.168.1.103:64777 (ESTABLISHED)
这表明我目前有五个连接打开到我计算机上的 MongoDB 端口 (27017)。在我的情况下,我从 Scalatra 服务器连接到 MongoDB,并且我使用的是 MongoDB Casbah 驱动程序,但是无论使用何种客户端,您都会看到相同的 lsof TCP 连接(只要它们使用 TCP/知识产权)。
【讨论】:
sudo lsof -i | grep mongod
我尝试通过以下命令查看 mongo 数据库的所有连接。
netstat -anp --tcp --udp | grep mongo
此命令可以更详细地显示 mongodb 的每个 tcp 连接。
tcp 0 0 10.26.2.185:27017 10.26.2.1:2715 ESTABLISHED 1442/./mongod
tcp 0 0 10.26.2.185:27017 10.26.2.1:1702 ESTABLISHED 1442/./mongod
tcp 0 0 10.26.2.185:27017 10.26.2.185:39506 ESTABLISHED 1442/./mongod
tcp 0 0 10.26.2.185:27017 10.26.2.185:40021 ESTABLISHED 1442/./mongod
tcp 0 0 10.26.2.185:27017 10.26.2.185:39509 ESTABLISHED 1442/./mongod
tcp 0 0 10.26.2.185:27017 10.26.2.184:46062 ESTABLISHED 1442/./mongod
tcp 0 0 10.26.2.185:27017 10.26.2.184:46073 ESTABLISHED 1442/./mongod
tcp 0 0 10.26.2.185:27017 10.26.2.184:46074 ESTABLISHED 1442/./mongod
【讨论】:
在 OS X 中,也可以直接在网络接口上查看连接,只需这样做:
$ lsof -n -i4TCP:27017
mongod 2191 inanc 7u IPv4 0xab6d9f844e21142f 0t0 TCP 127.0.0.1:27017 (LISTEN)
mongod 2191 inanc 33u IPv4 0xab6d9f84604cd757 0t0 TCP 127.0.0.1:27017->127.0.0.1:56078 (ESTABLISHED)
stores.te 18704 inanc 6u IPv4 0xab6d9f84604d404f 0t0 TCP 127.0.0.1:56078->127.0.0.1:27017 (ESTABLISHED)
无需使用grep等,只需使用lsof的参数即可。
还要查看 MongoDb 的 CLI 上的连接,请参阅 @milan 的答案(我刚刚编辑过)。
【讨论】:
db.runCommand( { "connPoolStats" : 1 } )
{
"numClientConnections" : 0,
"numAScopedConnections" : 0,
"totalInUse" : 0,
"totalAvailable" : 0,
"totalCreated" : 0,
"hosts" : {
},
"replicaSets" : {
},
"ok" : 1
}
【讨论】:
MongoMonitoringController : { "numClientConnections" : 0 , "numAScopedConnections" : 0 , "totalInUse" : 0 , "totalAvailable" : 0 , "totalCreated" : 0 , "totalRefreshing" : 0 , "pools" : { } , "hosts" : { } , "replicaSets" : { } , "ok" : 1.0}
使用 mongo-shell 连接到 MongoDB 并运行以下命令。
db.serverStatus().connections
例如:
mongo> db.serverStatus().connections
{ "current" : 3, "available" : 816, "totalCreated" : NumberLong(1270) }
【讨论】:
还有一些关于连接的更多细节:
db.currentOp(true)
【讨论】:
从本地系统连接您的 mongodb 实例
它会让您了解所有连接的客户端及其详细信息
db.currentOp(true)
【讨论】:
你可以使用
db.serverStatus().connections
此外,此功能可以帮助您识别连接到 Mongo DB 的 IP 地址
db.currentOp(true).inprog.forEach(function(x) { print(x.client) })
【讨论】:
按 ClientIP 的连接计数,总计
我们使用它来查看 IPAddress 的连接数和总连接数。这对调试问题非常有帮助...在达到最大连接数之前到达那里!
对于 Mongo Shell:
db.currentOp(true).inprog.reduce((accumulator, connection) => { ipaddress = connection.client ? connection.client.split(":")[0] : "Internal"; accumulator[ipaddress] = (accumulator[ipaddress] || 0) + 1; accumulator["TOTAL_CONNECTION_COUNT"]++; return accumulator; }, { TOTAL_CONNECTION_COUNT: 0 })
格式化:
db.currentOp(true).inprog.reduce(
(accumulator, connection) => {
ipaddress = connection.client ? connection.client.split(":")[0] : "Internal";
accumulator[ipaddress] = (accumulator[ipaddress] || 0) + 1;
accumulator["TOTAL_CONNECTION_COUNT"]++;
return accumulator;
},
{ TOTAL_CONNECTION_COUNT: 0 }
)
示例返回:
{
"TOTAL_CONNECTION_COUNT" : 331,
"192.168.253.72" : 8,
"192.168.254.42" : 17,
"127.0.0.1" : 3,
"192.168.248.66" : 2,
"11.178.12.244" : 2,
"Internal" : 41,
"3.100.12.33" : 86,
"11.148.23.34" : 168,
"81.127.34.11" : 1,
"84.147.25.17" : 3
}
(Atlas内部监控的192.x.x.x地址)
“内部”是没有外部客户端的内部进程。您可以通过以下方式查看这些列表:
db.currentOp(true).inprog.filter(connection => !connection.client).map(connection => connection.desc);
【讨论】:
E QUERY [js] TypeError: db.currentOp(...).inprog is undefined : 使用管理员用户
db.currentOp(true) 能得到什么?
{ "ok" : 0, "errmsg" : "Using $all for currentOp is disallowed in this atlas tier", "code" : 8000, "codeName" : "AtlasError" }
您也可以通过登录 Mongo Atlas 然后导航到您的集群来检查连接状态。
【讨论】:
抱歉,这是一篇旧帖子,目前有比以前更多的选择。
db.getSiblingDB("admin").aggregate( [
{ $currentOp: { allUsers: true, idleConnections: true, idleSessions: true } }
,{$project:{
"_id":0
,client:{$arrayElemAt:[ {$split:["$client",":"]}, 0 ] }
,curr_active:{$cond:[{$eq:["$active",true]},1,0]}
,curr_inactive:{$cond:[{$eq:["$active",false]},1,0]}
}
}
,{$match:{client:{$ne: null}}}
,{$group:{_id:"$client",curr_active:{$sum:"$curr_active"},curr_inactive:{$sum:"$curr_inactive"},total:{$sum:1}}}
,{$sort:{total:-1}}
] )
输出示例:
{ "_id" : "xxx.xxx.xxx.78", "curr_active" : 0, "curr_inactive" : 1428, "total" : 1428 }
{ "_id" : "xxx.xxx.xxx.76", "curr_active" : 0, "curr_inactive" : 1428, "total" : 1428 }
{ "_id" : "xxx.xxx.xxx.73", "curr_active" : 0, "curr_inactive" : 1428, "total" : 1428 }
{ "_id" : "xxx.xxx.xxx.77", "curr_active" : 0, "curr_inactive" : 1428, "total" : 1428 }
{ "_id" : "xxx.xxx.xxx.74", "curr_active" : 0, "curr_inactive" : 1428, "total" : 1428 }
{ "_id" : "xxx.xxx.xxx.75", "curr_active" : 0, "curr_inactive" : 1428, "total" : 1428 }
{ "_id" : "xxx.xxx.xxx.58", "curr_active" : 0, "curr_inactive" : 510, "total" : 510 }
{ "_id" : "xxx.xxx.xxx.57", "curr_active" : 0, "curr_inactive" : 459, "total" : 459 }
{ "_id" : "xxx.xxx.xxx.55", "curr_active" : 0, "curr_inactive" : 459, "total" : 459 }
{ "_id" : "xxx.xxx.xxx.56", "curr_active" : 0, "curr_inactive" : 408, "total" : 408 }
{ "_id" : "xxx.xxx.xxx.47", "curr_active" : 1, "curr_inactive" : 11, "total" : 12 }
{ "_id" : "xxx.xxx.xxx.48", "curr_active" : 1, "curr_inactive" : 7, "total" : 8 }
{ "_id" : "xxx.xxx.xxx.51", "curr_active" : 0, "curr_inactive" : 8, "total" : 8 }
{ "_id" : "xxx.xxx.xxx.46", "curr_active" : 0, "curr_inactive" : 8, "total" : 8 }
{ "_id" : "xxx.xxx.xxx.52", "curr_active" : 0, "curr_inactive" : 6, "total" : 6 }
{ "_id" : "127.0.0.1", "curr_active" : 1, "curr_inactive" : 0, "total" : 1 }
{ "_id" : "xxx.xxx.xxx.3", "curr_active" : 0, "curr_inactive" : 1, "total" : 1 }
【讨论】: