Ne mongoDB ont reconnecter questions ou suis-je tout faux?
Je suis l'aide de nodejs et mongoDB - et je vais avoir quelques problèmes de connexion.
Bien, en fait, de "réveiller" les questions! Il se connecte parfaitement bien est super rapide et je suis heureux avec les résultats.
Mon problème: Si je n'utilise pas la connexion pendant un certain temps (je dis bien que, parce que le délai varie de 5+ minutes), il semble dans l'impasse. Je n'ai pas de déconnexion des événements déclenchés qu'il se bloque.
Finalement, je reçois une réponse d'Erreur: impossible de se connecter à [ * .mongolab.com: * ] - ( * = masqué valeurs)
Un redémarrage rapide de l'application, et la connexion est à nouveau magnifique. Parfois, si je ne le redémarrez pas l'application, je peux actualiser et il se reconnecte heureusement.
C'est pourquoi je pense qu'il est de "réveiller" les questions.
Ébauche de code:
Je n'ai pas le code, je ne pense pas que c'est nécessaire. Il fonctionne (à l'exception de la connexion à l'abandon)
Choses à noter: Il est juste l'un "se connecter" - je n'ai jamais le fermer. Je n'ai jamais rouvrir.
Je suis en utilisant la mangouste, le socketio.
/* constants */
var mongoConnect = 'myworkingconnectionstring-includingDBname';
/* includes */
/* settings */
/* Schema */
var db = mongoose.connect(mongoConnect);
/* Socketio */
io.configure(function (){
io.set('authorization', function (handshakeData, callback) {
});
});
io.sockets.on('connection', function (socket) {
});//sockets
io.sockets.on('disconnect', function(socket) {
console.log('socket disconnection')
});
/* The Routing */
app.post('/login', function(req, res){
});
app.get('/invited', function(req, res){
});
app.get('/', function(req, res){
});
app.get('/logout', function(req, res){
});
app.get('/error', function(req, res){
});
server.listen(port);
console.log('Listening on port '+port);
db.connection.on('error', function(err) {
console.log("DB connection Error: "+err);
});
db.connection.on('open', function() {
console.log("DB connected");
});
db.connection.on('close', function(str) {
console.log("DB disconnected: "+str);
});
J'ai essayé différentes configs ici, comme l'ouverture et la fermeture de tous les temps - je crois bien, le consensus général est de faire comme je le suis avec un open d'emballage du lot. ??
J'ai essayé une connexion testeur, qui garde le contrôle de l'état de la connexion... même si cela semble dire que tout est ok, le problème se produit toujours.
J'ai eu ce problème depuis le premier jour. J'ai toujours accueilli les MongoDB avec MongoLab.
Le problème semble être le pire sur localhost. Mais j'ai toujours le problème sur Azure et maintenant nodejit.su.
Comme cela arrive partout - ça doit être moi, MongoDB, ou mongolab.
D'ailleurs j'ai eu une expérience similaire avec le driver php trop. (à confirmer c'est sur nodejs si)
Il serait idéal pour un peu d'aide - même si quelqu'un dit "c'est normal"
merci d'avance
Rob
- Pas sûr au sujet de MongoDB, cependant, dans la plupart des bases de données classiques), il est préférable d'ouvrir/fermer la connexion à la demande (c'est à dire à chaque fois que vous avez besoin pour y accéder) plutôt que de le laisser ouvert pour toujours. Pilotes de base de données sont généralement optimisés pour créer et gérer un pool de connexions derrière les coulisses pour cette (ouverture/fermeture) a tendance à être incroyablement rapide. Je serais curieux d'entendre ce que les gens avec de vrais MongoDB expérience dire sur cette question.
- Merci Hector - ouais d'accord, seulement j'ai lu partout lorsque l'on étudie ce dit de le faire de la manière que j'ai (à moins que je comprends de façon incorrecte)
- J'obtiens le même problème à la fois contre la MongoHQ et MongoLab cas, non seulement de mon Nœud de l'application, mais à partir de la mongo client de ligne de commande trop. MongoHQ soutien m'a suggéré de gérer cela à une application ou un pilote de niveau en renouvelant lorsque cela se produit. C'est une telle douleur à gérer cela au niveau de l'application que je suis surpris, ce n'est pas déjà traitée dans la mongodb conducteur ou dans la mangouste.
- quelqu'un a compris cela? J'ai exactement la même configuration et le même problème exactement. C'est pire sur localhost, mais se produit toujours dans le cloud. Vous pouvez en principe obtenir une session d'un redémarrage. MongoLab semble assez beaucoup pas utilisable pour moi sur Azure à ce moment 🙁
- Aussi avoir ce problème, mais à l'intérieur d'un hébergement privé et de la solution. Semble être lié à l'Mongo connexion et persistantes.
- Découvrez ma solution ci-dessous.... Semble solide comme un roc maintenant.
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR: Notre article d'aide pour ce sujet (essentiellement une copie de ce post) a déménagé à notre dépannage de la connexion doc.
Il est connu que l'Azure IaaS réseau impose un délai d'inactivité d'environ treize minutes (empiriquement arrivé à l'). Nous travaillons avec Azure pour voir si nous ne pouvons pas rendre les choses plus convivial, mais en attendant, d'autres ont eu du succès en configurant les options de pilote pour contourner le problème.
Max de connexion le temps d'inactivité
La solution plus efficace que nous avons trouvé dans le travail avec Azure et nos clients a été de mettre le max de connexion le temps d'inactivité au-dessous de quatre minutes. L'idée est de rendre le pilote de recyclage des connexions inactives avant le pare-feu, les forces de la question. Par exemple, un client qui utilise le C# driver, jeu de
MongoDefaults.MaxConnectionIdleTime
à une minute et il éclairci leurs questions.Le code de l'application elle-même n'a pas changé, mais maintenant, derrière les coulisses, le pilote agressivement recycle les connexions inactives. Le résultat peut être vu dans les logs du serveur ainsi: beaucoup de connexion de désabonnement durant les périodes d'inactivité dans l'application.
Il y a plus de détails sur cette approche dans les mongo-utilisateur thread, Exception socketexception à l'aide de C# pilote sur azure.
Keepalive
Vous pouvez également contourner le problème en faisant vos connexions de moins de ralenti avec une sorte de keepalive. C'est un peu difficile à mettre en œuvre, à moins que votre pilote prend en charge hors de la boîte, généralement en profitant de TCP Keepalive. Si vous avez besoin de déployer votre propre, assurez-vous de saisir à chaque connexion inactive de la piscine, toutes les deux minutes et quelques simple et peu coûteux de commande, probablement un ping.
Manipulation déconnecte
Déconnecte peut arriver de temps en temps, même sans agressif configuration du pare-feu. Avant de vous lancer dans la production, vous voulez être sûr de les gérer correctement.
Tout d'abord, assurez-vous d'activer la reconnexion automatique. La façon de faire varie de pilote à pilote, mais lorsque le pilote détecte qu'une opération a échoué car la connexion était mauvaise tournant sur la reconnexion automatique indique au pilote d'essayer de se reconnecter.
Mais ce n'est pas de résoudre complètement le problème. Vous avez toujours la question de savoir quoi faire avec l'échec de l'opération qui a déclenché le reconnecter. Reconnexion automatique n'est pas automatiquement réessayer d'échec des opérations. Que serait dangereux, en particulier pour les écritures. Donc, habituellement, une exception est levée et que l'application est demandé de le gérer. Souvent, la nouvelle tentative de lit est un no-brainer. Mais la nouvelle tentative de l'écrit doit être soigneusement pris en considération.
Le shell mongo session ci-dessous illustre le problème. Le shell mongo a par défaut la reconnexion automatique est activé. J'ai insérer un document dans une collection nommée
stuff
puis trouver tous les documents dans la collection. J'ai ensuite régler une minuterie pour une trentaine de minutes et j'ai essayé le même retrouver. Il a échoué, mais le shell automatiquement reconnecté et quand j'ai immédiatement retenté ma trouvaille, il a fonctionné comme prévu.Nous sommes là pour vous aider
Bien sûr, si vous avez des questions, n'hésitez pas à nous contacter à [email protected]. Nous sommes là pour vous aider.
Merci à tous pour l'aide les gars - j'ai réussi à résoudre ce problème sur les deux localhost et déployé sur un serveur en ligne.
Ici est maintenant mon travail de code de connexion:
Je pense que le plus gros changement a été d'utiliser "createConnection" sur "se connecter" - j'ai utilisé cela avant, mais peut-être les options de l'aide maintenant. Cet article m'a beaucoup aidé http://journal.michaelahlers.org/2012/12/building-with-nodejs-persistence.html
Si je suis honnête, je ne suis pas trop sûr de pourquoi j'ai ajouté ces options - comme mentionné par @jareed, j'ai aussi trouvé que certaines personnes ayant du succès avec "MaxConnectionIdleTime" - mais aussi loin que je peux voir le code javascript pilote ne dispose pas de cette option: c'était ma tentative en essayant de reproduire le comportement.
So far So good - hope cette aide quelqu'un.
Mise à JOUR: 18 avril 2013 remarque, c'est une seconde application avec une configuration différente
Maintenant, je pensais que je l'avais résolu, mais le problème rose c'est moche à nouveau la tête sur une autre application récemment avec le même code de connexion. Confus!!!
Cependant la mise en place était un peu différente...
Cette nouvelle application est en cours d'exécution sur une machine windows, à l'aide de IISNode. Je ne vois pas cela comme important au départ.
J'ai lu, il y avait peut-être quelques problèmes avec mongo sur Azure (@jareed), donc je l'ai déplacé la DB à AWS - toujours le problème a persisté.
J'ai donc commencé à jouer avec les options de l'objet nouveau, en lisant beaucoup sur elle. Venu à cette conclusion:
Qui était un peu plus instruits que mes options d'origine de l'objet i de l'état.
Toutefois - c'est toujours pas bon.
Maintenant, pour une raison quelconque, j'ai dû quitter cette boîte de windows (quelque chose à voir avec un module de compilation sur elle) - c'était plus facile de se déplacer que de passer une semaine à essayer de l'obtenir pour fonctionner.
Donc je l'ai déplacé mon appli pour nodejitsu. Faible et voici, ma connexion est resté en vie! Woo!
Donc.... qu'est-ce que cela signifie... je n'ai aucune idée! Ce que je sais, c'est est ces options semblent fonctionner sur Nodejitsu.... pour moi.
Je crois IISNode utilise une sorte de "forever" script pour garder l'application en vie. Maintenant, pour être juste, l'application ne plante pas pour ce coup de pied, mais je pense qu'il doit y avoir une sorte de "app cycle" qui est actualisée en permanence - c'est de cette façon qu'il peut faire un déploiement continu (code ftp, pas besoin de redémarrer l'app) - c'est peut-être un facteur, mais je suis juste deviner maintenant.
Bien sûr, tout cela signifie maintenant, est-ce n'est pas résolu. Il n'est toujours pas résolu. C'est juste résolu pour moi dans ma configuration.
mongoose.createConnection
au lieu deconnect
de toute façon, une multitude de grâce.Un couple de recommandations pour les personnes ayant toujours cette question:
Assurez-vous que vous utilisez la dernière version du client pour mongodb node.js. J'ai remarqué des améliorations significatives dans ce domaine lors de la migration à partir de v1.2.x pour v1.3.10 (le dernier en date d'aujourd'hui)
Vous pouvez passer un objet d'options à la MongoClient.connectez. Les options suivantes ont travaillé pour moi lors de la connexion à partir d'Azur à MongoLab:
options = {
db: {},
serveur: {
auto_reconnect: true,
socketOptions: {keepAlive: 1}
},
replSet: {},
mongos: {}
};
MongoClient.connect(dbUrl, options, function(err, dbConn) {
//votre code
});
Voir cette autre réponse, dans laquelle j'explique comment gérer le "proche" de l'événement qui semble être plus fiable. https://stackoverflow.com/a/20690008/446681
Permettre à la
auto_reconnect
Server
option de ce genre:La connexion que vous êtes d'ouverture est, en réalité, une piscine de 5 connexions (par défaut) de sorte que vous êtes en droit d'suffit de brancher et de le laisser ouvert. Je suppose que vous vous par intermittence perdre la connectivité avec mongolab et de vos connexions de mourir lorsque cela se produit. Heureusement, l'activation de
auto_reconnect
décide de.auto_reconnect: true
par défaut?true
par défaut lors de l'utilisation de la Mangouste: mongoosejs.com/docs/connections.htmlAugmentant les délais d'attente peuvent aider.
avant d'expirer.
l'écriture, à la préoccupation d'être satisfait.
"connectTimeoutMS" : Combien de temps une connexion peut prendre pour être ouvert
avant l'expiration du délai en millisecondes.
J'ai eu un problème similaire étant déconnecté de MongoDB périodiquement. Faites deux choses, il fixe: