13

mongoose 経由で MongoDB replicaSet に接続しようとしました。このリンクを使用しました。
構成 json:

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

マングース接続:

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

そして、アプリケーションを起動した後、例外が発生しました:

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)

データベース: チャット、プライマリ サーバー: localhost:27022。

また、他の2つのサーバーを削除しようとしました(構成jsonにプライマリサーバーのみを保持)。セカンダリサーバーについて認識していることがわかりました(ログを使用しました)。それはmongodbのメタデータに関するものだと思います。しかし、プライマリをシャットダウンすると、その作業が終了しました (不思議ではありません)。代わりにセカンダリを使用できるようにする必要があります。
何か案は?

4

4 に答える 4

17

これを使用します:

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'

Auto_reconnect はhttps://team.goodeggs.com/reconnecting-to-mongodb-when-mongoose-connect-fails-at-startup-83ca8496ca02に従ってオフになっています

于 2015-03-10T20:37:05.407 に答える
7

接続文字列が無効である可能性があります。すべてのレプリカ セット メンバーに URI を指定する必要があります。

"uri": "mongodb://db0.example.com:27017,db1.example.com:27017,db2.example.com:27017/admin?replicaSet=myRepl"

Mongoose ドキュメントのレプリカ セット接続セクションを確認する必要があります。

于 2014-06-24T22:36:47.183 に答える
7

私もこれには困りました。その経験から私が学んだことは次のとおりです。

「サーバー」ブロックは、接続 URI にクラスター化されていない単一の接続 (別名、単一の接続文字列) が含まれている場合にのみ呼び出されます。

「replset」ブロックは、接続 URL にコンマ区切りの接続文字列のリスト (別名レプリケーション セット) が含まれている場合にのみ呼び出されます。

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

このブロックは、ローカルホストと本番環境の両方で機能しました。それが役に立てば幸い。

于 2016-06-30T06:31:37.867 に答える