mongodb 故障转移连接

mongodb failover connection

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

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

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

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

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

有什么想法吗?

谢谢

当您有奇数个服务器时,Replicaset 工作正常,因为 MongoDB ReplicaSet 使用节点之间的选举来定义哪个服务器将是 "primary"。

您可以在您的 ReplicaSet 中添加一个新节点,仅用于投票。它被称为"ARBITER"。

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

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

If a majority of the replica set is inaccessible or unavailable to the current primary, the primary will step down and become a secondary. The replica set cannot accept writes after this occurs, but remaining members can continue to serve read queries if such queries are configured to run on secondaries.

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

可以通过将 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