Mongoose: Aucun serveur principal disponible

CrĂ©Ă© le 1 dĂ©c. 2015  Â·  76Commentaires  Â·  Source: Automattic/mongoose

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.

screen shot 2015-11-30 at 5 21 01 pm

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
can't reproduce help wanted

Tous les 76 commentaires

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:
2015-12-09_22-22-51

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:

  • ne fait pas d'erreur de maniĂšre cohĂ©rente, ce qui nous empĂȘche d'agir (redĂ©marrer le processus / retirer le nƓud)
  • se produit au hasard et ne semble pas corrĂ©lĂ© au statut de replset mongo

@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:

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 signifie-t-il que le pilote devrait également pouvoir résoudre?

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

Cette page vous a été utile?
0 / 5 - 0 notes