【问题标题】:Check the current number of connections to MongoDb检查当前与 MongoDb 的连接数
【发布时间】:2012-02-17 00:46:56
【问题描述】:

获取连接到特定 MongoDB 服务器的客户端数量的命令是什么?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    连接到管理数据库并运行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 创建到服务器的所有传入连接的计数。此数字包括已关闭的连接。

    【讨论】:

      【解决方案2】:

      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/知识产权)。

      【讨论】:

      • 此命令为单个连接返回多个条目:stackoverflow.com/a/42930337/1843751
      • 我建议对 lsof 使用 -i 标志。然后,每个连接您只会获得 1 个条目,并且不需要 grep 获取 TCP。即sudo lsof -i | grep mongod
      【解决方案3】:

      我尝试通过以下命令查看 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   
      

      【讨论】:

        【解决方案4】:

        在 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 的答案(我刚刚编辑过)。

        【讨论】:

          【解决方案5】:

          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}
          • 这不是 OP 所要求的。命令“返回有关从当前数据库实例到分片集群或副本集的其他成员的开放传出连接的信息”:docs.mongodb.com/manual/reference/command/connPoolStats/…
          【解决方案6】:

          使用 mongo-shell 连接到 MongoDB 并运行以下命令。

          db.serverStatus().connections
          

          例如:

          mongo> db.serverStatus().connections
          { "current" : 3, "available" : 816, "totalCreated" : NumberLong(1270) }
          

          【讨论】:

            【解决方案7】:

            还有一些关于连接的更多细节: db.currentOp(true)

            取自:https://jira.mongodb.org/browse/SERVER-5085

            【讨论】:

            • 我已经阅读了所有的答案,突然间 - 这是最有帮助的答案之一。该查询提供了大量的内部细节,包括连接时间、当前表、驱动程序版本和平台,甚至 appName(如果指定)
            【解决方案8】:

            从本地系统连接您的 mongodb 实例

            1. sudo mongo "mongodb://MONGO_HOST_IP:27017" --authenticationDatabase admin

            它会让您了解所有连接的客户端及其详细信息

            1. db.currentOp(true)

            【讨论】:

              【解决方案9】:

              你可以使用

              db.serverStatus().connections
              

              此外,此功能可以帮助您识别连接到 Mongo DB 的 IP 地址

              db.currentOp(true).inprog.forEach(function(x) { print(x.client) })
              

              【讨论】:

              • 非常漂亮 - 谢谢!正是我想要的。
              【解决方案10】:

              按 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);
              

              【讨论】:

              • 能否解释一下返回列表中“内部”IP的含义?
              • 我无法在 mongo atlas 实例上运行上述示例:E QUERY [js] TypeError: db.currentOp(...).inprog is undefined : 使用管理员用户
              • @carton.swing 我已经用解释和命令更新了答案以查看它们。
              • @otong 你只用db.currentOp(true) 能得到什么?
              • 好像被mongodb atlas拒绝了:{ "ok" : 0, "errmsg" : "Using $all for currentOp is disallowed in this atlas tier", "code" : 8000, "codeName" : "AtlasError" }
              【解决方案11】:

              您也可以通过登录 Mongo Atlas 然后导航到您的集群来检查连接状态。

              【讨论】:

                【解决方案12】:

                抱歉,这是一篇旧帖子,目前有比以前更多的选择。

                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 }
                

                【讨论】:

                  猜你喜欢
                  • 2023-03-19
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-10-03
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-08-17
                  • 2023-02-17
                  相关资源
                  最近更新 更多