sql >> Base de Datos >  >> NoSQL >> MongoDB

¿MongoDB tiene problemas de reconexión o lo estoy haciendo mal?

ACTUALIZAR :Nuestro artículo de soporte para este tema (esencialmente una copia de esta publicación) se ha movido a nuestro documento de solución de problemas de conexión.

Hay un problema conocido que la red IaaS de Azure impone un tiempo de espera de inactividad de aproximadamente trece minutos (al que se llega empíricamente). Estamos trabajando con Azure para ver si podemos hacer que las cosas sean más fáciles de usar, pero mientras tanto, otros han tenido éxito al configurar sus opciones de controlador para solucionar el problema.

Tiempo máximo de inactividad de la conexión

La solución alternativa más efectiva que hemos encontrado al trabajar con Azure y nuestros clientes ha sido establecer el tiempo máximo de inactividad de la conexión por debajo de los cuatro minutos. La idea es hacer que el controlador recicle las conexiones inactivas antes de que el cortafuegos fuerce el problema. Por ejemplo, un cliente, que usa el controlador C#, establece MongoDefaults.MaxConnectionIdleTime a un minuto y aclaró sus problemas.

MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);

El código de la aplicación en sí no cambió, pero ahora, detrás de escena, el controlador recicla agresivamente las conexiones inactivas. El resultado también se puede ver en los registros del servidor:muchas conexiones se cancelan durante los períodos de inactividad en la aplicación.

Hay más detalles sobre este enfoque en el hilo de mongo-user relacionado, SocketException usando el controlador C# en Azure.

Kepalive

También puede solucionar el problema haciendo que sus conexiones estén menos inactivas con algún tipo de mantenimiento. Esto es un poco complicado de implementar a menos que su controlador lo admita de fábrica, generalmente aprovechando TCP Keepalive. Si necesita crear el suyo propio, asegúrese de obtener cada conexión inactiva del grupo cada dos minutos y emita un comando simple y económico, probablemente un ping.

Manejo de desconexiones

Las desconexiones pueden ocurrir de vez en cuando incluso sin una configuración de firewall agresiva. Antes de comenzar la producción, debe asegurarse de manejarlos correctamente.

Primero, asegúrese de habilitar la reconexión automática. La forma de hacerlo varía de un controlador a otro, pero cuando el controlador detecta que una operación falló porque la conexión era mala, al activar la reconexión automática se le indica al controlador que intente volver a conectarse.

Pero esto no resuelve completamente el problema. Todavía tiene el problema de qué hacer con la operación fallida que activó la reconexión. La reconexión automática no vuelve a intentar automáticamente las operaciones fallidas. Eso sería peligroso, especialmente para las escrituras. Por lo general, se lanza una excepción y se le pide a la aplicación que la maneje. A menudo, volver a intentar las lecturas es una obviedad. Pero se debe considerar cuidadosamente volver a intentar escribir.

La siguiente sesión de mongo Shell demuestra el problema. El shell mongo por defecto tiene habilitada la reconexión automática. Inserto un documento en una colección llamada stuff luego encuentre todos los documentos en esa colección. Luego configuré un temporizador durante treinta minutos y probé el mismo hallazgo nuevamente. Falló, pero el shell se volvió a conectar automáticamente y cuando volví a intentarlo de inmediato, funcionó como se esperaba.

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

Estamos aquí para ayudar

Por supuesto, si tiene alguna pregunta, no dude en contactarnos en [email protected]. Estamos aquí para ayudarlo.