Come limitare le connessioni per host in MongoDB?


8

Sto eseguendo un server mongo che accetta connessioni da altri client tramite il driver Java. La cosa che ho notato è che dopo un po 'alcuni utenti aprono troppe porte e questo impedisce ad altri utenti di connettersi al mongo. Creano solo 1 mongoClientoggetto, sebbene controllando il loro risultato IP osservando centinaia di porte.

Mi sono imbattuto in un esempio per limitare la connessione per host nel driver java, ma non voglio che il client lo rovini. Come posso limitare il client dalla mia istanza mongod?

L'istanza è 1 mongod che gira su un server remoto Linux.

Risposte:


12

Di seguito ho elencato alcune alternative per la gestione delle connessioni, in ordine dal più al meno raccomandato.

Aumentare le connessioni consentite sul server

Il limite totale della connessione in entrata sul server è determinato dal minore dei limiti imposti dal sistema operativo o maxIncomingConnections(ovvero maxConnsin MongoDB 2.4 e precedenti).

In genere le distribuzioni Linux limitano i descrittori di file per processo a 1024, di cui MongoDB utilizzerà l'80% per le connessioni in entrata (lasciando circa 819 connessioni disponibili).

È possibile verificare le connessioni correnti e disponibili nella mongoshell tramite:

db.serverStatus().connections

Per i sistemi di produzione è tipico regolare le ulimitimpostazioni su Linux per consentire più connessioni simultanee. Per ulteriori best practice, consiglierei di rivedere le note di produzione nel manuale MongoDB.

Fornire un'API

Se gestisci un server condiviso con limiti di risorse, è comune fornire la tua API anziché l'accesso diretto al database. Questo approccio offre un ulteriore livello di astrazione in modo da poter gestire l'utilizzo delle risorse e la distribuzione del server indipendentemente dalla configurazione del client. Ad esempio, è possibile spostare il server di database o riconfigurare da un set autonomo a un set di repliche e i client non dovrebbero esserne consapevoli. Puoi anche gestire limiti di risorse personalizzati (come connessioni per client) tramite la tua API, in base alle credenziali utilizzate dal client per connettersi.

Ridurre le dimensioni del pool di connessioni nei client

MongoDB (al 2.6) non ha un'opzione per limitare le connessioni per client. Normalmente i limiti del client verrebbero imposti tramite il driver (ovvero impostando la dimensione del pool di connessioni). Ad esempio, nel driver Java la MongoClientdimensione massima del pool predefinita è 100.

Hai già suggerito che questa non è un'opzione desiderabile in quanto non desideri che i client interferiscano con i limiti di connessione, ma se imponi un limite lato server sarebbe comunque ragionevole impostarli per impostare la dimensione del pool appropriatamente. Altrimenti le loro applicazioni avranno frequenti eccezioni quando si eliminano le connessioni in eccesso.

Monitorare le operazioni del client

Se la regolazione dei limiti sul client o sul server non è un'opzione, un'alternativa da considerare è l'implementazione di uno script per contare le connessioni client simultanee (tramite IP) tramite db.currentOp()e eliminare le connessioni in eccesso tramite db.killOp(). Dovresti stare molto attento a uccidere solo le richieste dei clienti. Il killOp()comando è un comando superutente che ti permetterà di uccidere anche i thread del database interno (il che può portare a risultati imprevedibili).

NOTA: questo approccio non avrà esito positivo se i client si connettono tramite un gateway condiviso (ovvero dove l'IP di origine non identifica in modo univoco un client).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.