Manipulation MongoDB déconnexion/reconnecter du noeud

lorsque ma connexion MongoDB est inactive pendant quelques minutes, la requête suivante se termine par erreur. Du client de ligne de commande mongo , il ressemble à ceci:

> db.users.find()
Sat Jan 12 23:42:35 Socket recv() errno:54 Connection reset by peer 107.22.25.25:47207
Sat Jan 12 23:42:35 SocketException: remote: 107.22.25.25:47207 error: 9001 socket exception [1] server [107.22.25.25:47207] 
Sat Jan 12 23:42:35 DBClientCursor::init call() failed
Sat Jan 12 23:42:35 query failed : chowology.users {} to: ds047207.mongolab.com:47207
Error: error doing query: failed
Sat Jan 12 23:42:35 trying reconnect to ds047207.mongolab.com:47207
Sat Jan 12 23:42:35 reconnect ds047207.mongolab.com:47207 ok

je vois le problème contre les instances de bac à sable de MongoHQ et MongoLab.

la demande suivante passe par amende, en raison de la reconnexion. C'est un problème dans mon application web, car après quelques minutes d'inactivité, cette erreur lors de la requête web. Il y a deux choses qui me surprennent:

  1. que les connexions MongoDB sont détruites si régulièrement et si fréquemment, et
  2. que le pilote ne fait que soulever une exception par opposition à la rétractation automatique après reconnexion (j'utilise connect-mongo qui utilise mongoose qui, à son tour, utilise node-mongodb-native ).

est-ce l'expérience de tout le monde? Comment est-ce censé être manipulé? Je serais surpris si les développeurs d'applications enveloppent leurs opérations de base de données dans une sorte de non-sens de gestion des exceptions.

4
demandé sur jared 2013-01-13 12:05:54

3 réponses

Vous voulez regarder les docs pour l'objet Serveur

http://mongodb.github.com/node-mongodb-native/api-generated/server.html#server

en particulier les socketOptions où vous pouvez définir keepAlive et les délais de connexion. Par défaut keepalive est désactivé et timeout est 0 ou jamais, ce qui signifie que le délai de socket par défaut est en vigueur (varie de os à os). Keep alive enverra un paquet de temps en temps connexion socket tcp pour le maintenir en vie. Parfois, les pare-feu sont mal configurés et n'envoient pas de paquet final lorsqu'ils ferment une connexion, laissant la connexion morte et dans les limbes, ce dont parlent les monoglabs (le plus souvent, pour être honnête, ils sont horriblement configurés).

3
répondu christkv 2013-01-15 23:03:56
  1. vérifiez que votre ordinateur ne va pas dormir
  2. vérifiez que votre routeur / pare-feu ne tue pas les connexions inactives

le premier problème s'est avéré être mon ordinateur dormant et laissant tomber la connexion réseau sans le savoir. C'est un nouvel ordinateur et je n'avais pas réalisé que je n'avais pas désactivé le sommeil:- p

Jared de MongoLab m'a aidé à résoudre ce problème et j'en suis reconnaissant. Il a dit cela le comportement est courant lorsqu'on passe par un pare-feu (comme mjhm l'a suggéré dans son commentaire). Donc, un test serait de contourner cela.

toujours en train de passer à travers mon routeur, j'obtiens une erreur différente après plusieurs heures de ralenti:

db.users.find()
Sun Jan 13 14:55:02 Socket say send() errno:32 Broken pipe 107.22.25.25:47207
Error: 9001 socket exception [2] server [107.22.25.25:47207] 
Sun Jan 13 14:55:02 trying reconnect to ds047207.mongolab.com:47207
Sun Jan 13 14:55:02 reconnect ds047207.mongolab.com:47207 ok

je vais réessayer à partir d'un serveur qui ne passe pas par mon routeur/pare-feu.

le comportement du conducteur soulevant l'exception sur l'opération courante est attendu et acceptable depuis une déconnexion c'est vraiment un cas exceptionnel.

Update : aucun de ces problèmes ne se produit lorsque je dévie mon routeur, ni dans mon instance Nodejitsu, qui, je crois, fonctionne dans un centre de données Joyent.

1
répondu Mike M. Lin 2013-01-16 17:19:36

j'ai eu le même problème et je pense que c'est parce que j'accède à internet derrière un serveur proxy

0
répondu Connor Leech 2014-01-21 06:42:26