0

我有mongodb replica set以下配置:

  • M1 初级
  • M2二级
  • M3二级
  • M4仲裁员

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

const config = {
  db: `mongodb://${process.env.DB_ADDRESS_1}/${process.env.DB_NAME},
                 ${process.env.DB_ADDRESS_2}/${process.env.DB_NAME},
                 ${process.env.DB_ADDRESS_3}/${process.env.DB_NAME}`,
  dbOptions: {
    server: {
      socketOptions: {
        keepAlive: 1
      },
      poolSize: 5,
      readPreference: 'nearest'
    },
    replSet: {
      rs_name: process.env.REPLICA_SET,
      poolSize: 5,
      readPreference: 'nearest',
      socketOptions: {
        keepAlive: 1,
        connectTimeoutMS: 30000,
        socketTimeoutMS: 0
      }
    },
    db: {
      w: 1,
      numberOfRetries: 2
    }
  }
}
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 都被选为primary,但我的express应用程序仍然无法连接到replica set.

我的配置有什么问题吗?

4

2 回答 2

2

您的 MongoDB URI 连接字符串格式不正确。数据库名称应附加在服务器列表之后,而不是附加在每个服务器上。尝试:

mongodb://${process.env.DB_ADDRESS_1},
${process.env.DB_ADDRESS_2},
${process.env.DB_ADDRESS_3}
/${process.env.DB_NAME}?replicaSet=${process.env.REPLICA_SET}

有关示例,请参见https://docs.mongodb.com/manual/reference/connection-string/#connection-string-options 。

另一方面,您不需要副本集上的仲裁器。不建议在副本集中拥有偶数个节点,因为它需要多数人才能选举主节点。

对于 4 个节点,如果其中 2 个节点宕机,其余节点将无法选举主节点(当您拥有 3 节点副本集时也是如此)。因此,额外的仲裁器不会向副本集添加任何值。有关更多信息,请参阅https://docs.mongodb.com/manual/core/replica-set-architectures/#consider-fault-tolerance

于 2017-11-24T05:40:35.837 回答
2

连接 URL应为:

`mongodb://${process.env.DB_ADDRESS_1},${process.env.DB_ADDRESS_2},${process.env.DB_ADDRESS_3}/${process.env.DB_NAME}`

因此,有一个节点列表,然后是有关数据库的信息。

而且你的设置也有一个缺陷......当你有三个节点副本集时,你不应该有仲裁者!这是因为,票数必须是奇数而不是偶数

于 2017-11-24T05:40:57.597 回答