【问题标题】:MongoDB NodeJS client connection to Replica Set won't reconnect when the primary goes down主服务器宕机时,MongoDB NodeJS 客户端与副本集的连接不会重新连接
【发布时间】:2021-02-22 21:07:48
【问题描述】:
MongoClient.connect('mongodb://mongo1,mongo2,mongo3?replicaSet=rs', {
  useUnifiedTopology: true,
}, (err, mongoClient) => {
  setTimeout(() => {
    mongoClient.db("mydb").collection('mycollection').insertOne({...})
  }, 10000)
})

当主节点宕机和使用 UnifiedTopology 时,MongoClient 是否应该重新连接到副本集中的另一个 mongo 实例?因为在这个例子中 mongoClient 仍然指向旧的主实例。这是预期的行为吗?

编辑

Replica Set config

【问题讨论】:

  • 您可以尝试按照docs 使用连接字符串uri 格式。另外,发布您的副本集的配置。

标签: node.js mongodb replicaset


【解决方案1】:

尝试使用**mongoose**

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'

详细说明:

仅当连接 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
        }
    }
};

这个块在本地主机和生产环境上都有效。

【讨论】:

  • 没有mongoose的mongodb客户端怎么配置?
  • 你可以添加一个shell脚本来做这里提到的link
  • 我将在下面发布一个新答案,希望对您有所帮助,如果有帮助,请点赞!
  • 我尝试了这些选项的连接但没有成功``` autoReconnect: false, poolSize: 10, socketOptions: { connectTimeoutMS: 30000, keepAlive: true }, native_parser: true ```
  • 你试过shell脚本了吗?
【解决方案2】:

根据 Mongo 3.4 文档: 在 3.4 中:

mongo "mongodb://host1,host2,host3/myDB?replicaSet=myRS"

mongo "mongodb://host1:27017,host2:27017,host3:27017/myDB?replicaSet=myRS"

【讨论】:

  • 是的,正如我在问题中所写,我正在使用的连接字符串就是这样。 mongodb://mongo1:27017,mongo2:27017,mongo3:27017/admin?replicaSet=rs。但没有运气
【解决方案3】:

原来真正的问题是一个错误的配置 第 3 个节点的优先级为 0,投票 0 而不是 1

{
            "_id" : 2,
            "host" : "mongo3:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 0,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 0
        }

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 2017-11-17
    • 2012-07-13
    • 2014-04-06
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多