2016-09-14 244 views
0

我有一个连接到mongodb的nodejs应用程序。mongodb故障转移连接

Mongodb允许复制客户端连接提供一定程度的弹性。

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

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

我能想到的唯一解决办法是重新格式化的URL,因此排除了非活动实例,但想避免这种情况...

任何想法?当你有一个奇数数量的服务器,因为使用节点之间的选举定义哪些服务器将是“主”的MongoDB ReplicaSet工作

感谢

回答

1

正如Rafael提到的,当一些成员脱机时,副本集需要奇数个成员才能正常运行。有在Replica Set Elections docs page更多的细节,但最相关的是:

如果大多数副本集的不可访问或不可用,以当前的主,主会下台,成为一个次要的。在发生这种情况后,副本集不能接受写入,但如果将这些查询配置为在辅助节点上运行,则其余成员可以继续为读取查询提供服务。

默认节点驱动程序需要一个主在线才能能够连接到副本集,并且将输出,当你尝试连接到无主设定的副本,你观察到的一个错误。

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

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

找到