【问题标题】:Mongoose connection to replica setMongoose 连接到副本集
【发布时间】:2020-01-24 17:20:56
【问题描述】:

我尝试通过 mongoose 连接到 MongoDB 副本集。我用过这个link
配置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)

Db:聊天,主服务器:localhost:27022。

我还尝试删除其他两台服务器(仅在配置 json 中保留主要服务器),我看到它知道辅助服务器(我使用了日志)。我认为这是关于 mongodb 元数据的。但是当我关闭主设备时,它完成了它的工作(难怪),我需要它以便它可以使用辅助设备。
有什么想法吗?

【问题讨论】:

    标签: node.js mongodb mongoose replicaset


    【解决方案1】:

    我们使用这个:

    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'
    

    根据https://team.goodeggs.com/reconnecting-to-mongodb-when-mongoose-connect-fails-at-startup-83ca8496ca02,Auto_reconnect 已关闭

    【讨论】:

    • @lor1an 正如这个答案中所指出的,您的 dbname 应该在 host:ports 列表之后。所以你的连接字符串应该是:mongodb://localhost:27022,mongodb://localhost:27021,mongodb://localhost:27020/chat
    • 请注意,keepAlive 是一个数字,而不是布尔值,它表示在建立新连接之前连接需要超时的毫秒数。出于这个原因,将其设置为 1 是一个非常糟糕的主意,因为 mongoose 会在它实际上不应该建立新连接时建立新的连接。
    • @arasmussen 是的,但我认为 connectTimeoutMS 是连接需要超时的毫秒数,直到建立新连接。但我不知道这是什么保持活力,还有malix,你能告诉我为什么我们必须将 auto_reconnect: 设置为 false 吗??
    • 那你为什么要设置 auto_reconnect false ??
    • @UpTheCreek 已修复
    【解决方案2】:

    我也遇到了麻烦。我从这次经历中学到的是:

    仅当连接 URI 包含单个非集群连接(也称为单个连接字符串)时才会调用“服务器”块。

    仅当连接 URL 包含逗号分隔的连接字符串列表(也称为复制集)时,才会调用“replset”块。

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

    这个块在本地主机和生产环境上都有效。 希望对您有所帮助。

    【讨论】:

    • 谢谢。你回答了我一直在思考的主要问题。
    • 文档对此不是很清楚 - 我通过反复试验发现..
    • 是的,monodb js 连接选项文档真的可以改进。
    【解决方案3】:

    您的连接字符串可能无效。您应该为每个副本集成员提供 URI:

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

    您应该查看 Mongoose 文档中的 replica set connection 部分。

    【讨论】:

      【解决方案4】:
      # 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>
      

      【讨论】:

      • 附加信息将使您的答案更好。即使这个代码块回答了这个问题。
      猜你喜欢
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2015-07-09
      • 2013-05-25
      • 2013-03-30
      • 2015-09-26
      • 2013-11-02
      • 2014-07-20
      相关资源
      最近更新 更多