【问题标题】:Express can't connect to mongodb replica set when local mongo is stoped本地mongod停止时Express无法连接到mongodb副本集
【发布时间】:2017-11-24 19:17:15
【问题描述】:

我有一个mongodb replica set,配置如下:

  • M1 (192.168.77.3) 主(主机 App1)
  • M2 (192.168.77.4) 辅助(主机 App2)
  • M3 (192.168.77.5) 辅助(主机 App3)
  • M4 仲裁员

这是我连接到数据库的 Express 代码(我使用 mongoose 作为 ODM):

 const config = {
    db: `mongodb://192.168.77.3,192.168.77.4,192.168.77.5/mydb`,
    dbOptions: {
      useMongoClient: true,
      reconnectTries: Number.MAX_VALUE,
      replicaSet: process.env.REPLICA_SET,
      poolSize: 100,
      keepAlive: 1,
      connectTimeoutMS: 30000,
      socketTimeoutMS: 300000,
      w: 1
    }
  }
mongoose.connect(config.db, config.dbOptions, (error) => {
  if (error) {
    console.log('Error on connecting to th db: ', error)
    console.log('\x1b[31m', '*** PLEASE CONNECT TO DATABASE BEFORE RUN SERVER', '\x1b[0m')
    process.exit(1)
  }
  callback()
})

该应用程序按预期运行。 当 M1 关闭时,M2 或 M3 被选为 primaryApp2App3 仍在工作,但 App1 无法连接到 replica set 并显示错误消息:

MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]

这是我在 App1 上的 mongodb 配置:

storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

net:
  port: 27017
  bindIp: [127.0.0.1, 192.168.77.3]

replication:
  oplogSizeMB: 3000
  replSetName: my_rs

我的配置有问题吗?

【问题讨论】:

    标签: node.js mongodb mongodb-replica


    【解决方案1】:

    您不能在一个配置文件中混合多个节点的 IP 地址。

    你的 bindIp 字符串

    bindIp: [127.0.0.1, 192.168.77.4, 192.168.77.5]

    应该是

    bindIp: "127.0.0.1,192.168.77.3"

    在第一个节点和

    bindIp: "127.0.0.1,192.168.77.4"

    在第二个节点。等等......所以,你可以拥有 localhost 绑定和属于该节点的其他地址。

    我最初的答案是错误的,因为我认为它与mongooos有关,我不知道。

    【讨论】:

    • 谢谢你的建议,我试试这个方法!
    • 哦,我才意识到你这里可能有很大的配置错误。您是否拥有三个具有三个不同 IP 地址的不同数据节点,或者您是否拥有一个具有三个 mongod 实例的物理节点,并且您尝试将它们配置为不同的 IP 地址?如果您有三个不同的节点(应该是),那么您的 mongodb 配置行必须(在 bindIp 处)仅具有该节点所具有的 IP 地址(ONE),而不是所有 IP 地址。我会修正我的答案...
    • 是的,我在 3 个物理服务器上有 3 个 mongodb 节点。它们位于同一个数据中心,因此我可以使用私有 IP(192.168.77.3、.4 和 .5)。而且,[127.0.0.1, 192.168.77.4]"127.0.0.1,192.168.77.4" 风格有什么不同?顺便说一句,新配置仍然无法正常工作:(
    • 旧的 mongod 版本接受了 [] 格式。当前版本不接受它并给出奇怪的错误消息当然不能说明实际出了什么问题。你的问题是什么。在本地,在 mongod 配置文件中,您告诉节点(使用 bindIp)它应该监听哪些 NIC 地址。在应用程序端,您需要使用完整的连接 URL(所有副本集节点地址、数据库、副本集名称……)。而且你总是可以按任何顺序给出这些节点地址。
    猜你喜欢
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多