MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

mongoDB ha problemi di riconnessione o sbaglio?

AGGIORNAMENTO :Il nostro articolo di supporto per questo argomento (essenzialmente una copia di questo post) è stato spostato nel nostro documento per la risoluzione dei problemi di connessione.

Esiste un problema noto per cui la rete Azure IaaS impone un timeout di inattività di circa tredici minuti (a cui si arriva empiricamente). Stiamo collaborando con Azure per vedere se non riusciamo a rendere le cose più intuitive, ma nel frattempo altri hanno avuto successo configurando le opzioni del driver per aggirare il problema.

Tempo massimo di inattività della connessione

La soluzione più efficace che abbiamo trovato nell'utilizzo di Azure e dei nostri clienti è stata quella di impostare il tempo massimo di inattività della connessione al di sotto dei quattro minuti. L'idea è di fare in modo che il driver ricicli le connessioni inattive prima che il firewall forzi il problema. Ad esempio, un cliente, che utilizza il driver C#, imposta MongoDefaults.MaxConnectionIdleTime per un minuto e ha risolto i loro problemi.

MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);

Il codice dell'applicazione stesso non è cambiato, ma ora dietro le quinte il driver ricicla in modo aggressivo le connessioni inattive. Il risultato può essere visto anche nei registri del server:molte oscillazioni della connessione durante i periodi di inattività nell'app.

Sono disponibili ulteriori dettagli su questo approccio nel thread mongo-user correlato, SocketException che usa il driver C# in Azure.

Continua a vivere

Puoi anche aggirare il problema rendendo le tue connessioni meno inattive con una sorta di keepalive. Questo è un po' complicato da implementare a meno che il tuo driver non lo supporti immediatamente, di solito sfruttando TCP Keepalive. Se hai bisogno di rollare il tuo, assicurati di prendere ogni connessione inattiva dal pool ogni paio di minuti ed emetti un comando semplice ed economico, probabilmente un ping.

Gestione delle disconnessioni

Di tanto in tanto possono verificarsi disconnessioni anche senza una configurazione aggressiva del firewall. Prima di entrare in produzione, assicurati di gestirli correttamente.

Innanzitutto, assicurati di abilitare la riconnessione automatica. La procedura varia da driver a driver, ma quando il driver rileva che un'operazione non è riuscita a causa di una cattiva connessione, l'attivazione della riconnessione automatica indica al driver di tentare di riconnettersi.

Ma questo non risolve completamente il problema. Hai ancora il problema di cosa fare con l'operazione non riuscita che ha attivato la riconnessione. La riconnessione automatica non riprova automaticamente le operazioni non riuscite. Sarebbe pericoloso, soprattutto per le scritture. Quindi di solito viene generata un'eccezione e all'app viene chiesto di gestirla. Spesso riprovare le letture è un gioco da ragazzi. Ma ritentare le scritture dovrebbe essere considerato attentamente.

La sessione mongo shell di seguito mostra il problema. Per impostazione predefinita, la shell mongo ha la riconnessione automatica abilitata. Inserisco un documento in una raccolta denominata stuff quindi trova tutti i documenti in quella raccolta. Ho quindi impostato un timer per trenta minuti e ho riprovato la stessa ricerca. Non è riuscito, ma la shell si è riconnessa automaticamente e quando ho riprovato immediatamente il mio ritrovamento ha funzionato come previsto.

% mongo ds012345.mongolab.com:12345/mydatabase -u *** -p *** 
MongoDB shell version: 2.2.2 
connecting to: ds012345.mongolab.com:12345/mydatabase 
> db.stuff.insert({}) 
> db.stuff.find() 
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") } 
> db.stuff.find() 
Fri Jan 18 13:29:28 Socket recv() errno:60 Operation timed out 192.168.1.111:12345 
Fri Jan 18 13:29:28 SocketException: remote: 192.168.1.111:12345 error: 9001 socket exception [1] server [192.168.1.111:12345] 
Fri Jan 18 13:29:28 DBClientCursor::init call() failed 
Fri Jan 18 13:29:28 query failed : mydatabase.stuff {} to: ds012345.mongolab.com:12345 
Error: error doing query: failed 
Fri Jan 18 13:29:28 trying reconnect to ds012345.mongolab.com:12345 
Fri Jan 18 13:29:28 reconnect ds012345.mongolab.com:12345 ok 
> db.stuff.find() 
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") }

Siamo qui per aiutarti

Naturalmente, se hai domande, non esitare a contattarci all'indirizzo [email protected] Siamo qui per aiutarti.