我有一个连接到mongodb的nodejs应用程序。
Mongodb允许replicaset客户端连接提供一定程度的恢复能力。
例如“mongodb://localhost:50000,localhost:50001/myproject?replicaSet=foo
”,客户端首先连接到localhost @ 50000,如果死亡,则切换到localhost @ 50001。
这很好,但是如果应用程序启动时,如果两个mongo中的一个已经死了,那么应用程序就会死掉 - 无法连接错误。
我能想到的唯一解决方案是重新格式化网址,以便排除非活动实例,但是希望避免这种情况......
有什么想法吗?
由于
答案 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