Sprawdź aktualną liczbę połączeń z MongoDb

90

Jakie jest polecenie, aby uzyskać liczbę klientów podłączonych do określonego serwera MongoDB?

DafaDil
źródło

Odpowiedzi:

163

połącz się z bazą danych administratora i uruchom db.serverStatus():

> var status = db.serverStatus()
> status.connections
   {"current" : 21, "available" : 15979}
> 

Możesz uzyskać bezpośrednio, wysyłając zapytanie

db.serverStatus().connections

Aby zrozumieć, co oznacza db.serverStatus().connectionsodpowiedź MongoDb , przeczytaj dokumentację tutaj .

znajomości

"connections" : {
   "current" : <num>,
   "available" : <num>,
   "totalCreated" : NumberLong(<num>)
},

połączenia Dokument zawierający informacje o stanie połączeń. Użyj tych wartości, aby ocenić bieżące wymagania dotyczące obciążenia i pojemności serwera.

połączenia.current Liczba połączeń przychodzących od klientów do serwera bazy danych. Ta liczba obejmuje bieżącą sesję powłoki. Rozważ wartość connection.available, aby dodać więcej kontekstu do tej danej.

Wartość będzie obejmować wszystkie połączenia przychodzące, w tym wszelkie połączenia powłoki lub połączenia z innych serwerów, takie jak elementy zestawu replik lub instancje mongosów.

połączenia.available Liczba dostępnych nieużywanych połączeń przychodzących. Rozważ tę wartość w połączeniu z wartością connections.current, aby zrozumieć obciążenie połączenia w bazie danych, oraz dokument ustawień ulimit systemu UNIX, aby uzyskać więcej informacji na temat progów systemowych dotyczących dostępnych połączeń.

połączenia.totalCreated liczba wszystkich połączeń przychodzących utworzonych na serwerze. Ta liczba obejmuje połączenia, które od tego czasu zostały zamknięte.

Mediolan
źródło
25

Liczba połączeń według ClientIP, z Total

Używamy tego do przeglądania liczby połączeń według adresu IP z całkowitą liczbą połączeń. To było naprawdę pomocne w debugowaniu problemu ... po prostu dotrzyj tam, zanim osiągniesz maksymalną liczbę połączeń!

W przypadku powłoki Mongo:

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 })

Sformatowany:

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 }
)

Przykład zwrotu:

{
    "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
}

(adresy 192.xxx w wewnętrznym monitoringu Atlas)

„Wewnętrzne” to procesy wewnętrzne, które nie mają klienta zewnętrznego. Możesz wyświetlić ich listę za pomocą tego:

db.currentOp(true).inprog.filter(connection => !connection.client).map(connection => connection.desc);
SuperGoTeam
źródło
Czy mógłbyś wyjaśnić znaczenie „wewnętrznego” adresu IP na liście zwrotów?
karton
Nie mogę uruchomić powyższego przykładu na instancji atlasu mongo: E QUERY [js] TypeError: db.currentOp(...).inprog is undefined :używając administratora
otong
@ carton.swing Zaktualizowałem odpowiedź z wyjaśnieniem i poleceniem, aby je wyświetlić.
SuperGoTeam
@otong po co wrócisz db.currentOp(true)?
SuperGoTeam
Wygląda na to, że zaprzecza temu atlas mongodb: { "ok" : 0, "errmsg" : "Using $all for currentOp is disallowed in this atlas tier", "code" : 8000, "codeName" : "AtlasError" }
otong
19

db.serverStatus()podaje liczbę otwartych i udanych połączeń, ale nie pokazuje połączeń, z których klient. Aby uzyskać więcej informacji, możesz użyć tego polecenia sudo lsof | grep mongod | grep TCP. Potrzebuję go, gdy wykonałem replikację, a węzeł podstawowy ma wiele połączeń klientów większych niż pomocnicze.

$ 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)

Pokazuje to, że mam obecnie pięć otwartych połączeń do portu MongoDB (27017) na moim komputerze. W moim przypadku łączę się z MongoDB z serwera Scalatra i używam sterownika MongoDB Casbah, ale zobaczysz te same połączenia lsof TCP niezależnie od używanego klienta (o ile łączą się one za pomocą TCP / IP).

Hitesh Mundra
źródło
1
To polecenie zwraca wiele wpisów dla jednego połączenia: stackoverflow.com/a/42930337/1843751
ignite
3
Proponuję użyć flagi -i dla lsof. Wtedy otrzymujesz tylko 1 wpis dla każdego połączenia i nie musisz grepować dla TCP. tj.sudo lsof -i | grep mongod
datdo
7

Próbowałem zobaczyć wszystkie połączenia z bazą danych mongo, wykonując następujące polecenie.

netstat -anp --tcp --udp | grep mongo

To polecenie może bardziej szczegółowo pokazać każde połączenie tcp dla mongodb.

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   
Kyaw Min Thu L.
źródło
7

W systemie OS X również zobacz połączenia bezpośrednio w interfejsie sieciowym, po prostu wykonaj :

$ 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)
  • Nie ma potrzeby używania grepetc, po prostu użyj lsofargumentów 's.

  • Aby zobaczyć połączenia w interfejsie CLI MongoDb, zobacz odpowiedź @ milan ( którą właśnie zredagowałem ).

Inanc Gumus
źródło
7

Możesz po prostu użyć

db.serverStatus().connections

Ta funkcja może również pomóc Ci znaleźć adresy IP podłączone do Twojej bazy danych Mongo

db.currentOp(true).inprog.forEach(function(x) { print(x.client) })
nixsix6
źródło
1
Absolutnie piękna - dziękuję! Dokładnie to, czego szukałem.
ProsperousHeart
4

Również więcej szczegółów na temat połączeń z: db.currentOp(true)

Zaczerpnięte z: https://jira.mongodb.org/browse/SERVER-5085

mitsos1os
źródło
Przeczytałem wszystkie odpowiedzi i nagle - to jedna z najbardziej pomocnych. Zapytanie zawiera mnóstwo wewnętrznych szczegółów, takich jak powinno, w tym czas połączenia, aktualna tabela, wersja sterownika i platforma, a nawet nazwa aplikacji, jeśli została określona
Dmitry Gusarov.
2

Połącz się z MongoDB za pomocą powłoki mongo i uruchom następujące polecenie.

db.serverStatus().connections

na przykład:

mongo> db.serverStatus().connections
{ "current" : 3, "available" : 816, "totalCreated" : NumberLong(1270) }
Thushan
źródło
2

db.runCommand ({"connPoolStats": 1})

{
    "numClientConnections" : 0,
    "numAScopedConnections" : 0,
    "totalInUse" : 0,
    "totalAvailable" : 0,
    "totalCreated" : 0,
    "hosts" : {

    },
    "replicaSets" : {

    },
    "ok" : 1
}
arnav
źródło
To dość interesujące, otrzymuję również wartości ZERO dla tego żądania, nie jest to, czego chcę :) MongoMonitoringController : { "numClientConnections" : 0 , "numAScopedConnections" : 0 , "totalInUse" : 0 , "totalAvailable" : 0 , "totalCreated" : 0 , "totalRefreshing" : 0 , "pools" : { } , "hosts" : { } , "replicaSets" : { } , "ok" : 1.0}
Alex Efimov
2

Przepraszamy, ponieważ to jest stary post i obecnie jest więcej opcji niż wcześniej.

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}}
] )

Przykład danych wyjściowych:

{ "_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 }
JuanM
źródło
1

Połącz się z instancją mongodb z systemu lokalnego

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

Poinformuje Cię o wszystkich podłączonych klientach i ich danych

  1. db.currentOp (prawda)

Shree Prakash
źródło
0

Alternatywnie możesz sprawdzić stan połączenia, logując się do Mongo Atlas, a następnie przechodząc do swojego klastra.

wprowadź opis obrazu tutaj

Lokalny Gospodarz
źródło