web-dev-qa-db-fra.com

Connexion Mongoose au jeu de réplicas

J'ai essayé de me connecter à MongoDB réplicaSet via mangouste. J'ai utilisé ce link .
Configuration json:

"mongoose": {
   "uri": "mongodb://localhost:27022/chat,localhost:27021,localhost:27020",
   "options": {
       "replset": { "rs_name": "rs0" },
       "server": {
           "poolSize": 3,
           "socketOptions": {
               "keepAlive": 1
           }
       }
    }
}

Mongoose connect:

var mongoose = require('mongoose');
mongoose.connect(config.get('mongoose:uri'), config.get('mongoose:options'));

Et après le lancement de l'application, j'ai eu une exception:

Error: Host must be specified [undefined]
at new exports.ConnectionPool (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\mongodb\lib\mongodb\connection\connection_pool.js:18:11)
at Server.connect (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\mongodb\lib\mongodb\connection\server.js:335:25)
at Db.open (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\mongodb\lib\mongodb\db.js:264:23)
at MongoStore._open_database (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect-mongo\lib\connect-mongo.js:174:15)
at MongoStore._get_collection (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect-mongo\lib\connect-mongo.js:169:14)
at MongoStore.get (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect-mongo\lib\connect-mongo.js:213:10)
at Object.session [as handle] (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect\node_modules\express-session\index.js:215:11)
at next (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect\lib\proto.js:194:15)
at Object.module.exports [as handle] (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\middleware\resExtensions.js:21:2)
at next (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect\lib\proto.js:194:15)

Db: chat, serveur principal: localhost: 27022.

Aussi, j'ai essayé de supprimer deux autres serveurs (ne gardant que le principal dans config json) et j'ai vu qu'il connaissait les serveurs secondaires (j'ai utilisé le journal). Je pense qu'il s'agit de méta-données mongodb. Mais quand j'ai arrêté le primaire, il a fini son travail (pas étonnant), j'en ai besoin pour pouvoir utiliser le secondaire à la place.
Des idées?

11
lor1an

Nous utilisons ceci:

if(config.db.indexOf('replicaSet') > - 1) {
  dbOptions = {
    db: {native_parser: true},
    replset: {
      auto_reconnect:false,
      poolSize: 10,
      socketOptions: {
        keepAlive: 1000,
        connectTimeoutMS: 30000
      }
    },
    server: {
      poolSize: 5,
      socketOptions: {
        keepAlive: 1000,
        connectTimeoutMS: 30000
      }
    }
  };
}

var db = mongoose.connect(config.db, dbOptions);

config.db =  'mongodb://USER:PW@Host1:port1,Host2:port2/DBNAME?replicaSet=RSNAME'

La reconnexion automatique est désactivée conformément à https://team.goodeggs.com/reconnecting-to-mongodb-when-mongoose-connect-fails-at-startup-83ca8496ca02

15
malix

J'ai eu des problèmes avec ça aussi. Ce que j'ai appris de cette expérience est:

Le bloc "serveur" n'est appelé que lorsque l'URI de la connexion contient une seule connexion non clusterisée (c'est-à-dire une seule chaîne de connexion).

Le bloc "replset" n'est appelé que lorsque l'URL de connexion contient une liste de chaînes de connexion séparées par des virgules (ou ensemble de réplication).

var options = {

    db: {
        native_parser: true
    },

    // This block gets run for a non replica set connection string (eg. localhost with a single DB)
    server: {
        poolSize: 5,
        reconnectTries: Number.MAX_VALUE,
        ssl: false,
        sslValidate: false,
        socketOptions: {
            keepAlive: 1000,
            connectTimeoutMS: 30000
        }
    },

    // This block gets run when the connection string indicates a replica set (comma seperated connections)
    replset: {
        auto_reconnect: false,
        poolSize: 10,
        connectWithNoPrimary: true,
        ssl: true,
        sslValidate: false,
        socketOptions: {
            keepAlive: 1000,
            connectTimeoutMS: 30000
        }
    }
};

Ce bloc a fonctionné à la fois sur localhost et sur la production env. J'espère que ça aide.

6
ChrisRich

Votre chaîne de connexion est probablement invalide. Vous devez fournir l'URI pour chaque membre du jeu de réplicas:

"uri": "mongodb: // localhost: 27022/chat, localhost: 27021, localhost: 27020"

Vous devriez vérifier section de la réplique de la connexion section dans la documentation de Mongoose.

5
Christian P
# mongoose connect secondary replicateSet

<pre>
let url = 'mongodb://mongo01:1001,mongo02:1002/db_name?replicaSet=xxx-replica' 
// 1 

let conn = mongoose.createConnection(url, {user:'xxx', pass:'xxx', autoIndex: false, replset: {readPreference: 'secondary'}});

// 2  

let conn = mongoose.createConnection(url, {user:'xxx', pass:'xxx', autoIndex: false});
let schema =  new mongoose.Schema({},{read:'secondary'});
let model = conn.model(modelName, schema);

//3
let conn = mongoose.createConnection(url, {user:'xxx', pass:'xxx', autoIndex: false};
let schema = new mongoose.Schema({});
let model = conn.model(modelName, schema);
model.find().read('secondary').then(info => {});

</pre>
0
Jack LI