J'ai un problÚme assez difficile à déboguer et je me demandais si quelqu'un voyait quelque chose de mal avec ma configuration.
Error no primary server available
Version Nodejs 4.2.1
et version mongoDB 3.0.7
avec mangouste 4.2.8
.
Cela semble se produire au hasard et ouvrira de nombreuses connexions jusqu'Ă ce que je redĂ©marre enfin le processus de nĆud. Le cluster est sain Ă tout moment pendant cette erreur . Cette erreur se produit des centaines de fois par heure. Il ne semble pas y avoir de cohĂ©rence quant au moment oĂč l'erreur commencera. Par exemple, cela se produit lorsque le cluster fonctionne normalement et qu'aucune modification n'a Ă©tĂ© apportĂ©e au principal.
Voici Ă quoi ressemblent les statistiques de la base de donnĂ©es. Comme vous pouvez le voir, le nombre de connexions augmentera rĂ©guliĂšrement. Si je tue le processus de nĆud et en dĂ©marre un nouveau, tout va bien.
Config
// Connect
mongoose.connect(config.mongo.connectionString, {
server: {
socketOptions: {
socketTimeoutMS: 5 * 60 * 1000,
keepAlive: 1
}
},
replset: {
socketOptions: {
socketTimeoutMS: 5 * 60 * 1000,
keepAlive: 1
}
}
});
ChaĂźne de connexion
mongodb://username:[email protected]:27000,mongo-2.cz.0200.mongodbdns.com:27000,mongo-3.cz.0200.mongodbdns.com:27000/dbase
Trace de la pile
node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/replset.js:860pickServer
node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/replset.js:437command
node_modules/mongoose/node_modules/mongodb/lib/replset.js:392command
node_modules/mongoose/node_modules/mongodb/lib/db.js:281executeCommand
node_modules/mongoose/node_modules/mongodb/lib/db.js:305command
node_modules/newrelic/lib/instrumentation/mongodb.js:177wrapped
node_modules/mongoose/node_modules/mongodb/lib/collection.js:2327findAndModify
node_modules/mongoose/node_modules/mongodb/lib/collection.js:2265findAndModify
node_modules/newrelic/lib/instrumentation/mongodb.js:177wrapped [as findAndModify]
node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:136(anonymous function) [as findAndModify]
node_modules/mongoose/node_modules/mquery/lib/collection/node.js:79findAndModify
node_modules/mongoose/lib/query.js:1833_findAndModify
node_modules/mongoose/lib/query.js:1621_findOneAndUpdate
node_modules/mongoose/node_modules/kareem/index.js:156none
node_modules/mongoose/node_modules/kareem/index.js:18none
Rien ne saute pour le moment. Ătes-vous sĂ»r qu'aucun des serveurs mongodb ne plante? En outre, pouvez-vous maintenir une connexion stable Ă l'aide du shell?
L'exécution de la commande db.runCommand( { replSetGetStatus : 1 } )
pendant que l'erreur se produisait produit "health" : 1,
sur les 3 nĆuds. Il existe Ă©galement un ensemble primaire "stateStr" : "PRIMARY",
sur l'un des nĆuds.
Vous connectez-vous en utilisant la mĂȘme chaĂźne de connexion, en utilisant le DNS? Ressemble Ă©galement Ă votre stockage Ă plat aprĂšs le problĂšme, pouvez-vous vĂ©rifier et voir si vous n'avez plus d'espace disque sur l'une de vos machines?
Vous connectez-vous en utilisant la mĂȘme chaĂźne de connexion, en utilisant le DNS?
Je n'utilisais pas la mĂȘme chaĂźne de connexion. Pensez-vous que l'utilisation des adresses IP privĂ©es EC2 rĂ©soudrait ce problĂšme?
Je ne sais pas ce qui cause le maximum de stockage comme ça, mais mĂȘme aprĂšs le dĂ©marrage de nouvelles instances, le problĂšme sans serveur principal se produit toujours avec beaucoup d'espace disponible.
Les adresses IP EC2 peuvent ĂȘtre utiles, selon la configuration de votre jeu de rĂ©plicas. Pouvez-vous me montrer la sortie de rs.status()
du shell ?
C'est le rs.status () alors que les connexions sont Ă la hausse.
{
"set" : "mongo2",
"date" : ISODate("2015-12-04T23:39:32.520Z"),
"myState" : 1,
"members" : [
{
"_id" : 6,
"name" : "mongo-8.loc.0600.mongodbdns.com:27000",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 444053,
"optime" : Timestamp(1449272372, 32),
"optimeDate" : ISODate("2015-12-04T23:39:32Z"),
"lastHeartbeat" : ISODate("2015-12-04T23:39:32.507Z"),
"lastHeartbeatRecv" : ISODate("2015-12-04T23:39:31.442Z"),
"pingMs" : 0,
"syncingTo" : "mongo-9.loc.0600.mongodbdns.com:27000",
"configVersion" : 29
},
{
"_id" : 7,
"name" : "mongo-9.loc.0600.mongodbdns.com:27000",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 444056,
"optime" : Timestamp(1449272372, 39),
"optimeDate" : ISODate("2015-12-04T23:39:32Z"),
"electionTime" : Timestamp(1449097485, 1),
"electionDate" : ISODate("2015-12-02T23:04:45Z"),
"configVersion" : 29,
"self" : true
},
{
"_id" : 8,
"name" : "mongo-10.loc.0600.mongodbdns.com:27000",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 444053,
"optime" : Timestamp(1449272371, 111),
"optimeDate" : ISODate("2015-12-04T23:39:31Z"),
"lastHeartbeat" : ISODate("2015-12-04T23:39:31.904Z"),
"lastHeartbeatRecv" : ISODate("2015-12-04T23:39:30.903Z"),
"pingMs" : 2,
"syncingTo" : "mongo-8.loc.0600.mongodbdns.com:27000",
"configVersion" : 29
}
],
"ok" : 1
}
Rien d'extraordinaire dans le jeu de répliques. Avez-vous d'autres exemples de code pertinents, par exemple, avez-vous du code qui réagit aux événements de connexion mangouste?
Un autre problÚme potentiel à considérer, utilisez-vous un nouvel agent de relique à jour? J'essaierais de courir sans nouvelle relique et voir si cela se produit toujours, de nouvelles reliques monkey corrigent le pilote mongodb afin que cela puisse parfois conduire à un comportement inattendu.
Nous avons sorti les événements de connexion mangouste:
['connecting', 'connected', 'open', 'disconnecting', 'disconnected', 'close', 'reconnected', 'error', 'fullsetup'].forEach(function(name) {
mongoose.connection.on(name, function() {
notifySlack('Mongoose event: ' + name);
});
});
Voici Ă quoi ressemblent certains des journaux
â[4:30] Mongoose event: fullsetup
â[4:30] Mongoose event: reconnected
â[4:30] Mongoose event: open
â[4:30] Mongoose event: connected
â[4:30] Mongoose event: reconnected
â[4:30] Mongoose event: reconnected
â[4:30] Mongoose event: reconnected
â[4:30] Mongoose event: reconnected
â[4:30] Mongoose event: reconnected
â[4:30] Mongoose event: reconnected
â[4:30] Mongoose event: fullsetup
â[4:30] Mongoose event: connected
â[4:30] Mongoose event: open
â[4:30]
{
"err": {
"name": "MongoError",
"message": "no primary server available"
}
}
J'Ă©tais Ă l'Ă©vĂ©nement des jours de mongodb cette semaine, oĂč j'ai pu programmer un peu de temps et montrer ce problĂšme Ă l'un des ingĂ©nieurs principaux de MongoDB, et ils n'Ă©taient pas sĂ»rs du problĂšme. Ils ont mentionnĂ© d'ajouter le jeu de rĂ©plication et la taille maximale du pool Ă la chaĂźne de connexion, ce qui n'a malheureusement pas rĂ©solu ce problĂšme.
Nous avons également essayé de désactiver le maintien en vie et de le définir sur une valeur plus petite sur les instances, mais cela ne semblait pas non plus résoudre ce problÚme.
Nous utilisons newrelic
version 1.24.0
, et mongo-express-patch
version 0.21.1
. J'essaierai de courir sans newrelic pour voir si cela résout le problÚme.
Hmm ouais, il semble que la mangouste se reconnecte pour une raison quelconque. Pouvez-vous me montrer la sortie de npm list | grep "mongoose"
et npm list | grep "mongo"
?
$ npm list | grep "mongoose"
ââ⏠[email protected]
$ npm list | grep "mongo"
ââ⏠[email protected]
â ââ⏠[email protected]
â â ââ⏠[email protected]
ââ⏠[email protected]
ââ⏠[email protected]
â ââ⏠[email protected]
â â âââ [email protected]
Pourquoi utilisez-vous mongodb-core
? De plus, utilisez-vous avec mongo-express
activé dans prod?
N'utilise actuellement pas mongodb-core
pour quoi que ce soit. Pensez-vous que la non-concordance de version entre la dépendance mangouste peut causer des problÚmes?
Nous avons activé mongo-express
en production.
Pas que je sache de. J'essaie simplement de voir s'il existe d'autres connexions Ă mongodb qui pourraient contribuer Ă ce problĂšme. J'ai fait un peu de recherche sur Google - utilisez-vous les mĂȘmes noms DNS pour votre chaĂźne de connexion que ceux qui apparaissent dans rs.status()
? Selon cela , vous pouvez rencontrer des problÚmes similaires si vous utilisez un DNS différent pour la chaßne de connexion que votre jeu de réplicas pense.
Cette erreur se produira lors de l'utilisation du mĂȘme DNS dans la chaĂźne de connexion que l'attribut "syncingTo" dans rs.status()
. Cela se produit Ă©galement lors de l'utilisation de l'adresse IP interne ec2 dans la chaĂźne de connexion.
La seule chose que je n'ai pas encore essayée est de régler connectWithNoPrimary
sur true
.
J'essaierais Ă©galement de courir avec mongo-express
réduction. Cela pourrait causer des problÚmes ...
Nous rencontrons le mĂȘme problĂšme. Nous avons un site qui connaĂźt une charge soutenue d'environ 100 tr / min avec des pics dans le 500-700 tr / min +. Il semble que nous voyons cela tout au long du processus, mĂȘme pendant des pĂ©riodes relativement calmes.
Environnement:
Heroku - 75 2x dynos - Node.JS 5.1.1
Base de données - MongoLabs Dedicated Cluster M4 - Version 3.0.7
ChaĂźne de connexion:
mongodb: // _: * _ @ ds043294-a0.mongolab. com: 43294 , ds043294-a1.mongolab. com: 43294 / heroku_hf8q79dt? replicaSet = rs-ds043294
NPM:
npm list | grep "mongoose"
ââ⏠[email protected]
âââ [email protected]
âââ [email protected]
ââ⏠[email protected]
Connection.js
// Mongoose import
var mongoose = require('mongoose');
var options = {
server: {
socketOptions: {
keepAlive: 1,
poolSize: 10,
connectTimeoutMS: 30000,
socketTimeoutMS: 30000
}
},
replset: {
socketOptions: {
keepAlive: 1,
poolSize: 10,
connectTimeoutMS: 30000,
socketTimeoutMS: 30000
}
}
};
mongoose.connect((process.env.MONGOLAB_URI || "mongodb://localhost/test"), options, function(error) {
if (error) {
console.log(error);
}
});
module.exports = {
mongoose: mongoose
};
Enregistrement:
Nous avons activĂ© une bonne quantitĂ© de surveillance pour essayer de dĂ©boguer cela, donc j'ai inclus nos traces de pile Raygun dans le mĂȘme que cela aiderait au dĂ©bogage. _Note: _ C'est exactement le mĂȘme numĂ©ro de ligne que @ChrisZieba a montrĂ© dans la trace ci-dessus.
Message: aucun serveur principal disponible
Object.pickServer dans /app/node_modules/mongodb-core/lib/topologies/replset.js:860
ReplSet.ReplSet.command dans /app/node_modules/mongodb-core/lib/topologies/replset.js:437
ReplSet.ReplSet.command dans /app/node_modules/mongodb/lib/replset.js:392
Object.executeCommand dans /app/node_modules/mongodb/lib/db.js:281
Db.Db.command dans /app/node_modules/mongodb/lib/db.js:305
Object.wrapped dans /app/node_modules/newrelic/lib/instrumentation/mongodb.js:185
Object.findAndModify dans /app/node_modules/mongodb/lib/collection.js:2327
Collection.Collection.findAndModify dans /app/node_modules/mongodb/lib/collection.js:2265
Object.wrapped dans /app/node_modules/newrelic/lib/transaction/tracer/index.js:155
Object.wrappedQuery dans /app/node_modules/newrelic/lib/instrumentation/mongodb.js:218
Object.wrapped in [as findAndModify] (/app/node_modules/newrelic/lib/instrumentation/mongodb.js:188
NativeCollection.NativeCollection. (Anonyme dans la fonction) [as findAndModify] (/app/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:136
NodeCollection.NodeCollection.findAndModify dans /app/node_modules/mquery/lib/collection/node.js:79
Query.Query._findAndModify dans /app/node_modules/mongoose/lib/query.js:1833
Query.Query._findOneAndUpdate dans /app/node_modules/mongoose/lib/query.js:1621
inconnu. [anonyme] dans /app/node_modules/kareem/index.js:156
inconnu. [anonyme] dans /app/node_modules/kareem/index.js:18
Object.wrapped dans /app/node_modules/newrelic/lib/transaction/tracer/index.js:155
Object.doNTCallback0 dans node.js: 430
process.process._tickCallback dans node.js: 359
Surveillance:
Cette trace de pile me dit vraiment que 1) vous utilisez une nouvelle relique (ce qui est trĂšs discutable, car la nouvelle relique fait beaucoup de patching de singe du pilote mongodb), et 2) le pilote mongodb pense qu'il n'y a pas de primaire disponible, mais je ne sais pas pourquoi.
Essayez d'activer le mode de débogage du pilote mongodb en ajoutant replset: { loggerLevel: 'debug' }
Ă vos options de connexion, c'est-Ă -dire:
var options = {
server: {
socketOptions: {
keepAlive: 1,
poolSize: 10,
connectTimeoutMS: 30000,
socketTimeoutMS: 30000
}
},
replset: {
loggerLevel: 'debug',
socketOptions: {
keepAlive: 1,
poolSize: 10,
connectTimeoutMS: 30000,
socketTimeoutMS: 30000
}
}
};
Cela enregistrera un grand nombre de données de débogage de pilote sur stdout et nous aidera à comprendre ce qui ne va pas. Pouvez-vous capturer ces données lorsque l'erreur «Aucun serveur principal trouvé» se produit?
Merci @ vkarpov15 ,
Nous avons ajouté cela et ferons un rapport dÚs que nous en aurons un autre déclenché.
à votre santé,
Roy
Je ne pense pas que newrelic soit le problÚme ici. Nous avons essayé de courir sans et ce problÚme persiste. Collectera des données de journal à partir de loggerLevel: 'debug'
et publiera ici.
Merci, faites-moi savoir si vous parvenez à obtenir plus de détails sur l'erreur.
Un autre point de données: Mongoose déclenche l'événement "reconnecté" à mesure que le nombre de connexions augmente.
Les erreurs "aucun serveur principal disponible" déclenchent généralement _aprÚs_ le nombre de connexions a déjà commencé à augmenter.
Nous avons également rencontré ce problÚme. Avec une application Node hébergée sur Heroku avec MongoLab.
La semaine derniÚre, nous avons soudainement perdu la connexion avec la base de données et avons continué à recevoir le message Error no primary server available
. Le redémarrage de notre application a résolu le problÚme.
Heroku et MonogLab n'ont rien vu dans leurs journaux.
J'espĂšre que quelqu'un trouvera une solution Ă cela.
Bump - nous voyons cela sur node v4.2.3
mongoose v4.1.5
sur un grand déploiement de production. Difficile de résoudre ce problÚme car il:
@sansmischevia utilisez-vous Ă©galement mongolab + heroku?
^ Nous rencontrons ce problÚme dans un grand déploiement de production sur AWS EC2 avec des serveurs mongodb auto-hébergés via Cloud Manager.
Bonjour,
Nous aimerions Ă©galement intervenir.
Nous utilisons node v0.12.8
, mongo v2.6.11
avec mongoose v4.1.11
.
$ npm list | grep "mongo"
ââ⏠[email protected]
â ââ⏠[email protected]
â ââ⏠[email protected]
ââ⏠[email protected]
â ââ⏠[email protected]
â â ââ⏠[email protected]
ââ⏠[email protected]
ââ⏠[email protected]
ââ⏠[email protected]
$ npm list | grep "mongoose"
ââ⏠[email protected]
Il est souvent reproductible lors d'une opĂ©ration qui amorce la base de donnĂ©es, impliquant de nombreuses requĂȘtes. Notre application ne semble pas ĂȘtre affectĂ©e aprĂšs cela. Aucune erreur dans le journal mongo et notre jeu de rĂ©pliques Ă trois nĆuds est sain pendant ce temps.
Nous essaierons loggerLevel: 'debug'
et ferons
@ vkarpov15 nous sommes sur les replsets mongolab + ec2 directement
Je rencontre Ă©galement ce problĂšme sur mongolab.
Nous rencontrons Ă©galement ce problĂšme sur MongoLab et Modulus.
jetez un Ćil Ă https://jira.mongodb.org/browse/NODE-622 et si quelqu'un peut fournir un ensemble complet de journaux qui seraient extrĂȘmement utiles afin que nous puissions le reproduire.
Je vais carillon ici, nous n'utilisons pas la mangouste, mais le client natif MongoDB. Obtenir la mĂȘme erreur no primary server available
ici. Nous exécutons un réplica défini sur une instance EC2 dans un VPC privé, notre chaßne de connexion correspond aux adresses IP privées des instances. MongoDB v3.0.3
. Il me semble que cela se produit lorsqu'il y a un dĂ©bit Ă©levĂ© de requĂȘtes, car en gĂ©nĂ©ral, l'erreur ne se produit pas.
serverOpts = {
server: {
sslValidate: false,
sslCA: ca,
socketOptions: {
connectTimeoutMS: 30000,
socketTimeoutMS: 180000
}
},
replSet: {
connectWithNoPrimary: false,
sslValidate: false,
sslCA: ca,
socketOptions: {
connectTimeoutMS: 30000,
socketTimeoutMS: 180000
}
}
};
Il semble qu'il y ait un correctif pour cela dans les prochaines versions de pilotes: NODE-622
Il n'est jamais trop tĂŽt pour les cadeaux! :)
La version corrigée a déjà été publiée sur NPM https://www.npmjs.com/package/mongodb.
Je peux confirmer que nous ne recevons plus l'erreur. : tada:
PR pour mongodb 2.1.2 ici: https://github.com/Automattic/mongoose/pull/3712
Cette erreur persiste aprĂšs la mise Ă niveau de mongoose vers 4.3.4
, qui utilise mongo core 2.1.2
. https://jira.mongodb.org/browse/NODE-622 a été rouvert
+1 Je viens de remarquer que cela se produit Ă©galement sur notre serveur de production. Je ne vois aucun motif de pourquoi. Utilisation du nĆud 4.2.4 avec mangouste 4.3.4 et mongodb 3.0.8. J'utilise les services MMS de mongodb pour surveiller mon cluster et je n'ai vu aucune alerte pendant le temps oĂč j'obtiens: MongoError: aucun serveur principal disponible
@ amit777 Pouvez-vous publier votre chaßne de connexion et vos options? De plus, cela s'est-il produit pendant une charge de travail inhabituellement lourde, par exemple, beaucoup d'écritures dans la base de données?
Chris, cela se produit certainement lors des opĂ©rations d'Ă©criture, mĂȘme si je ne dirais pas que notre charge est particuliĂšrement lourde. Nous avons quelques nĆuds dans un cluster oĂč chaque nĆud Ă©crira indĂ©pendamment dans mongo.
Voici comment nous nous connectons:
var mongoose = require('mongoose');
var mongodb = {};
var connect = function () {
mongodb.db = "mongodb://node1:27017,node2:27017,node3:27017/myapp";
mongodb.dbOptions = {
"db": {"native_parser": true},
"replSet": {
"rs_name": "mongocluster",
"socketOptions": { "keepAlive": 1, "connectTimeoutMS": 30000, "socketTimeoutMS": 60000 }
}
};
mongoose.connect(config.get('mongodb.db'), config.get('mongodb.dbOptions'));
};
connect();
Je viens également de remarquer que mes journaux mongod se remplissent trÚs rapidement de messages de connexion et de déconnexion:
2016-01-13T13:32:15.418-0500 I NETWORK [conn91700536] end connection 192.168.1.50:33189 (5558 connections now open)
2016-01-13T13:32:15.418-0500 I NETWORK [conn91700534] end connection 192.168.1.50:33187 (5558 connections now open)
2016-01-13T13:32:15.418-0500 I NETWORK [conn91700540] end connection 192.168.1.50:33193 (5557 connections now open)
2016-01-13T13:32:15.418-0500 I NETWORK [conn91700538] end connection 192.168.1.50:33191 (5558 connections now open)
2016-01-13T13:32:15.418-0500 I NETWORK [conn91700542] end connection 192.168.1.50:33195 (5557 connections now open)
2016-01-13T13:32:15.418-0500 I NETWORK [conn91700532] end connection 192.168.1.50:33185 (5556 connections now open)
2016-01-13T13:32:15.419-0500 I NETWORK [conn91700533] end connection 192.168.1.50:33186 (5552 connections now open)
2016-01-13T13:32:15.419-0500 I NETWORK [conn91700535] end connection 192.168.1.50:33188 (5552 connections now open)
2016-01-13T13:32:15.419-0500 I NETWORK [conn91700537] end connection 192.168.1.50:33190 (5552 connections now open)
2016-01-13T13:32:15.419-0500 I NETWORK [conn91700541] end connection 192.168.1.50:33194 (5551 connections now open)
2016-01-13T13:32:15.419-0500 I NETWORK [conn91700543] end connection 192.168.1.50:33196 (5551 connections now open)
2016-01-13T13:32:15.419-0500 I NETWORK [conn91700539] end connection 192.168.1.50:33192 (5552 connections now open)
2016-01-13T13:32:15.548-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36754 #91705950 (5548 connections now open)
2016-01-13T13:32:15.549-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36755 #91705951 (5549 connections now open)
2016-01-13T13:32:15.550-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36756 #91705952 (5550 connections now open)
2016-01-13T13:32:15.550-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36757 #91705953 (5551 connections now open)
2016-01-13T13:32:15.550-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36758 #91705954 (5552 connections now open)
2016-01-13T13:32:15.551-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36760 #91705955 (5553 connections now open)
2016-01-13T13:32:15.551-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36759 #91705956 (5554 connections now open)
2016-01-13T13:32:15.551-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36762 #91705957 (5555 connections now open)
2016-01-13T13:32:15.551-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36761 #91705958 (5556 connections now open)
2016-01-13T13:32:15.553-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36763 #91705959 (5557 connections now open)
2016-01-13T13:32:15.553-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36764 #91705960 (5558 connections now open)
2016-01-13T13:32:15.554-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36765 #91705961 (5559 connections now open)
Voici quelques informations supplĂ©mentaires qui peuvent aider Ă dĂ©boguer. Je commence Ă penser qu'il peut y avoir un bogue liĂ© au regroupement de connexions. AprĂšs avoir redĂ©marrĂ© mes processus de nĆud, je vois un tas de nouvelles connexions apparaĂźtre dans le mongod.log. Ensuite, aprĂšs environ une minute, je vois un tas de messages de connexion de fin dans mongod.log.
Il semble que la connexion / déconnexion s'amplifie de plus en plus rapidement avec le temps (bien que j'essaie toujours de le confirmer).
la situation typique causant ceci est quelque chose comme.
Le rĂ©plicaset contient des hĂŽtes qui ne peuvent pas ĂȘtre rĂ©solus par le pilote. Lorsque le pilote se connecte, il utilise le rĂ©plicaset comme source canonique pour toutes les connexions. Les reconnexions utiliseront ces adresses. Ils DOIVENT pouvoir ĂȘtre rĂ©solus par le conducteur.
Vous devez Ă©galement Ă©viter d'utiliser des adresses IP, elles sont une source de nombreux problĂšmes comme celui-ci, utilisez des noms d'hĂŽtes complets (pas de noms courts)
@christkv si le systÚme d'exploitation est capable de résoudre les hÎtes (c'est-à -dire en faisant un ping
cela devrait oui, mais vous pouvez toujours utiliser le port de nom d'hÎte telnet pour vérifier.
ouais, je suis capable de telnet à l'hÎte et au port .. (tous les hÎtes de base de données ont des entrées / etc / hosts sur les serveurs d'application).
Une fois notre application démarrée et le pool de connexions créé, devrait-il y avoir des déconnexions et des reconnexions s'il n'y a pas de problÚmes de réseau? Ou y a-t-il un délai normal de connexion et de reconnexion que je verrai dans les journaux de mongodb?
Le problÚme est qu'il est impossible de corréler ces choses pour tenter de comprendre et de reproduire le problÚme sans un ensemble complet de journaux (voir mon dernier commentaire sur https://jira.mongodb.org/browse/NODE-622)
si vous n'avez pas assez d'opĂ©rations dans la fenĂȘtre de temporisation du socket pour exercer toutes les connexions, le pool se fermera et se reconnectera. donc si vous avez une fenĂȘtre de 30 secondes et 10 connexions mais seulement 5 opĂ©rations, cela provoquera un Ă©vĂ©nement de reconnexion toutes les 30 secondes.
Va-t-il fermer toutes les connexions Ă la piscine? ou seulement les connexions qui n'ont pas Ă©tĂ© exercĂ©es? Si nous effectuons toutes les connexions dans les 30 secondes, le mĂȘme contrĂŽle sera-t-il effectuĂ© dans la prochaine fenĂȘtre de 30 secondes?
Je vais essayer d'obtenir les journaux que vous demandez dans le ticket mongodb .. merci pour votre aide.
Tout. Si vous parvenez Ă exercer toutes les connexions du pool dans la fenĂȘtre socketTimeout, node.js n'expirera pas les sockets et ne se fermera pas, forçant la reconnexion du pool.
Un conseil, beaucoup de connexions ne sont utiles que si vous avez beaucoup d'opĂ©rations lentes en parallĂšle, sinon vous ĂȘtes mieux adaptĂ© avec un pool plus petit car MongoDB utilise un thread par socket, ce qui signifie que des milliers de connexions nĂ©cessitent plus de mĂ©moire allouĂ©e sur le serveur et provoquent plus de changements de contexte du processeur.
La prochaine révision majeure de mongodb-core changera le pool pour qu'il s'agrandisse ainsi que d'autres changements fondamentaux pour minimiser les problÚmes de trains lents. Cependant, cela reste plusieurs mois et sera probablement lié au travail de MongoDB 3.4.
Pensez-vous qu'il est possible / probable que les quantités massives de déconnexion / reconnexion puissent causer par intermittence le problÚme d'absence de serveur principal disponible?
oui car il y aura une brĂšve pĂ©riode oĂč il se peut qu'il n'y ait aucun serveur dans l'ensemble
@christkv J'ai attendu que cela se reproduise pour vous envoyer des journaux dans cet autre ticket. Notre cluster est en fait stable depuis quelques semaines et nous n'avons pas vu cette erreur.
@ChrisZieba drĂŽle comment cela semble toujours arriver lol: +1: Je vais laisser le ticket ouvert dans jira pour le moment et voir ce que nous pouvons comprendre.
@christkv Salut Christian, je suis simplement curieux de savoir si vous avez des conseils sur des solutions de contournement dans le cas d'un trafic plus faible. Je pensais simplement réduire la taille de la piscine et augmenter les délais d'attente.
si cela aide quelqu'un d'autre, j'ai supprimé le délai d'expiration du socket ainsi que l'augmentation de keepAlive à 200 et j'ai également réduit la taille du pool à 3 .. je semble avoir beaucoup moins de déconnexion / reconnexion .. mais cela arrive encore occasionnellement.
Si cela aide quelqu'un, nous avons supprimĂ© presque tous les paramĂštres de mangouste, y compris socketTimeout et connectionTimeout et keepAlive et les connexions ont commencĂ© Ă ĂȘtre stables. Notre poolSize est de 200.
Je ne suis pas sûr que ce soit l'approche recommandée, mais cela fonctionne maintenant. Nous le surveillons toujours pour nous assurer qu'il tient.
mangouste v4.4.2
NĆud 4
Mongo 3.0
Avez-vous énormément d'opérations lentes? si vous ne le faites pas, je ne pense pas que vous remarquerez une différence entre un pool de 20 sockets vs 500.
Désolé ... c'est 200. Correction du commentaire.
Et oui, tu as raison. Nous ne sentons pas beaucoup de différence, mais nous préférons avoir une taille de piscine plus grande que plus petite.
Le vrai problÚme avec quand les connexions continuent à s'ouvrir et non fermées. Cela se produisait jusqu'à ce que nous supprimions tous les paramÚtres de délai d'attente et de keepAlive. Je me demande pourquoi ceux-ci sont gérés par mongoose / mongo-driver et ne pas laisser le systÚme d'exploitation le faire?
Well 2.1.7 et supérieur a un pool repensé qui évite cela. Si vous définissez socketTimeout 0, vous le déléguez au systÚme d'exploitation, mais cela peut représenter jusqu'à 10 minutes de connexions suspendues.
D'accord. intéressant. Alors maintenant que j'ai supprimé les paramÚtres keepAlive et socketTimeout, quels sont les paramÚtres par défaut?
cela dépend, je ne sais pas si la mangouste a défini des paramÚtres spécifiques par défaut. si vous utilisez la méthode MongoClient.connect dans le pilote, les délais de connexion et de socket sont de 30 secondes.
Nous utilisons connect
mais lorsque nous définissons manuellement 30 secondes, les connexions commencent à s'accumuler.
Eh bien, avec 500 connexions, vous avez besoin d'au moins 500 opérations à l'intérieur de la période socketTimeout pour garder la piscine ouverte, sinon elle se fermera et forcera une reconnexion. Cela change cependant dans la version 2.1.7 car le pool est un modÚle croissant / rétrécissant.
J'ai le mĂȘme problĂšme avec mongodb 3.2.6 et mongoose 4.3.4. Une aide Ă ce sujet?
@ 15astro essayez de supprimer les paramĂštres de socketTimeout
et connectionTimeout
et voyez si cela aide.
@refaelos Ok ... j'essaierai ça..J'ai essayé avec keepAlive = 6000 mais cela n'a pas aidé. Je voulais juste savoir comment supprimer socketTimeout
et connectionTimeout
aidera?
Oui, nous l'avons essayé avec des valeurs différentes et seulement lorsque nous avons complÚtement supprimé ces paramÚtres, les choses ont commencé à bien fonctionner.
@refaelos : Je n'ai pas eu de chance de supprimer ces paramĂštres. Une autre chose me manque?
@ 15astro aucun homme. Pardon. Voici Ă quoi ressemblent nos paramĂštres aujourd'hui:
mongo : {
uri : process.env.MNG_URL || 'mongodb://localhost/myDB',
options: {
user : process.env.MNG_USER,
pass : process.env.MNG_PASS,
replset: {
poolSize: 200
}
}
}
Dans mon cas, cela était lié au manque d'IP pour la liaison de nom dans / etc / hosts.
Si vous avez configurĂ© un jeu de rĂ©pliques avec des noms au lieu d'adresses IP et que vous avez quelque chose comme ça dans / etc / hosts des nĆuds MongoDB:
10.10.10.10 mongodb-2gb-fra1-02
10.10.10.11 mongodb-2gb-fra1-01
10.10.10.12 mongodb-2gb-fra1-03
Ensuite, vous devez Ă©galement le mettre dans / etc / hosts de tous vos serveurs d'applications.
Je pensais que node-mongo se connectait en fonction de tout ce que je mettais dans l'URI, mais ce n'est pas le cas.
Il semble que node-mongo se connecte par IP ou par nom Ă partir de l'URI Mongo, puis obtient les noms d'hĂŽte des autres membres de la rĂ©plique Ă partir du premier nĆud MongoDB qui a rĂ©pondu Ă la demande. Il obtient par exemple mongodb-2gb-fra1-03
et le transmet au systÚme d'exploitation pour la résolution. Si le systÚme d'exploitation ne sait rien sur mongodb-2gb-fra1-03
, il lance "Erreur aucun serveur principal disponible".
J'espĂšre que cela pourra aider.
@adriank oui c'est correct, il base ses connexions avec celles qu'il rĂ©cupĂšre de la configuration du rĂ©plicaset. La raison en est que c'est la source canonique de vĂ©ritĂ© sur un rĂ©plicaset. C'est Ă©galement pourquoi toutes les adresses de la configuration du rĂ©plicaset doivent pouvoir ĂȘtre rĂ©solues par le pilote pour que le pilote bascule correctement et pour qu'il puisse dĂ©tecter les serveurs ajoutĂ©s et supprimĂ©s de l'ensemble. Les pilotes prĂ©cĂ©dents n'ont pas mis en Ćuvre la spĂ©cification SDAM et oĂč plus laxiste. Cela poserait cependant des problĂšmes dans les environnements de production.
@christkv Cependant, c'est un cauchemar pour des outils comme notre MongoSpector . à cause de cela, nous avons des problÚmes de connexion sécurisée à plus d'une réplique à partir d'un hÎte. DigitalOcean génÚre automatiquement des noms de gouttelettes que presque personne ne change et l'effet est que de nombreux clients ont mongodb-2gb-fra1-01
comme PRIMAIRE. :) J'espĂšre que nous pouvons trouver quelque chose.
Nous suivons un ticket de serveur ici https://jira.mongodb.org/browse/SERVER-1889. J'aimerais que quelque chose comme ça soit possible.
Nous devrions également déposer un ticket auprÚs de DigitalOcean indiquant l'erreur qu'ils font et comment cela affecte leurs utilisateurs.
en passant, vous pouvez supprimer et rajouter les membres du réplicaset avec leurs nouveaux noms étant ips
Ayant un problĂšme similaire, aprĂšs environ 12 Ă 24 heures de connexion, nous obtenons une erreur "Aucun serveur principal disponible"
Le redémarrage résout généralement le problÚme.
lien:
{
"url":
"mongodb://user:password@cluser-shard-00-00, cluser-shard-00-01, cluster-shard-00-02/settings?ssl=true&replicaSet=primarycluster-shard-0&authSource=admin&retryWrites=true",
"options": {
"db": {
"w": 1,
"wtimeout": 3000,
"fsync": true
},
"authSource": "admin",
"server": {
"poolSize": 3,
"socketOptions": {
"autoReconnect": true,
"keepAlive": 60000,
"connectTimeoutMS": 7000,
"socketTimeoutMS": 15000
}
}
},
"password": "password",
"username": "username"
}