mongodb故障转移连接

时间:2016-09-14 23:57:17

标签: node.js mongodb mongodb-replica-set

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

Mongodb允许replicaset客户端连接提供一定程度的恢复能力。

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

这很好,但是如果应用程序启动时,如果两个mongo中的一个已经死了,那么应用程序就会死掉 - 无法连接错误。

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

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:1)

当你有奇数个服务器时,Replicaset工作正常,因为MongoDB ReplicaSet使用节点之间的选举来定义什么服务器将是“主要”。

您可以在ReplicaSet中添加新节点以进行投票。它被称为“ARBITER”。

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

答案 1 :(得分:1)

正如Rafael所提到的,当一些成员离线时,副本集需要奇数个成员才能正常运行。 Replica Set Elections docs page中有更多详细信息,但最相关的是:

  

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

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

可以通过将connectWithNoPrimary设置为true来更改此默认行为。但是,为了能够进行查询,您还应该设置正确的readPreference setting(默认为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)

有关连接选项的更多信息,请参阅Node Driver URI Connection Settings page