0

我有一个连接到 mongodb 的 nodejs 应用程序。

Mongodb 允许副本集客户端连接提供一定程度的弹性。

例如“ mongodb://localhost:50000,localhost:50001/myproject?replicaSet=foo”,客户端首先连接到 localhost@50000,如果连接失败,它会切换到 localhost@50001。

这很好,但是如果当应用程序启动并且如果两个 mongo 之一死了,那么应用程序就死了 - 无法连接错误。

我能想到的唯一解决方案是重新格式化 url,使其排除非活动实例,但希望避免这种情况......

有任何想法吗?

谢谢

4

2 回答 2

1

当服务器数量为奇数时,Replicaset 可以正常工作,因为 MongoDB ReplicaSet 使用节点之间的选举来定义哪个服务器将成为“主要”服务器。

您可以在 ReplicaSet 中添加一个新节点,仅用于投票。它被称为“仲裁者”。

您可以在此页面https://docs.mongodb.com/manual/core/replica-set-elections/#replica-set-elections上了解有关 ReplicaSet 选举的更多信息。

于 2016-09-15T01:36:19.763 回答
1

正如 Rafael 提到的,副本集需要奇数个成员才能在某些成员离线时正常运行。副本集选举文档页面中有更多详细信息,但最相关的是:

如果当前主节点无法访问或无法访问大部分副本集,则主节点将退出并成为辅助节点。发生这种情况后,副本集将无法接受写入,但如果将此类查询配置为在辅助节点上运行,其余成员可以继续为读取查询提供服务。

默认情况下,节点驱动程序需要 Primary 在线才能连接到副本集,并且当您尝试连接到没有 Primary 的副本集时会输出您观察到的错误。

可以通过设置connectWithNoPrimary来更改此默认行为true。但是,为了能够进行查询,您还应该设置正确的readPreference设置(也默认为 Primary)。例如:

var MongoClient = require('mongodb').MongoClient

conn = MongoClient.connect('mongodb://localhost:27017,localhost:27018,localhost:27019/test',
    {
        replicaSet: 'replset',
        connectWithNoPrimary: true,
        readPreference: 'primaryPreferred'
    }).catch(console.log)

有关连接选项的更多信息,请参见节点驱动程序 URI 连接设置页面

于 2016-09-15T02:41:16.950 回答