来自NodeJS的MongoDB副本连接



My NodeJS客户端能够根据需要连接到MongoDB主服务器并与其交互。

我使用以下代码来构建一个服务器对象

var dbServer = new Server(
    host,  // primary server IP address
    port,  
    { 
        auto_reconnect: true,
        poolSize: poolSize   
    });

以及以下代码来创建DB对象:

var db = new Db(
    'MyDB',
    dbServer,
    { w: 1 }
);

我的印象是,当初选结束时,客户会自动发现现在需要与其中一名中学进行对话,该中学将被选为初选。

但是当我手动杀死主服务器时,其中一个辅助服务器确实变成了主服务器(从它的mongo shell和它现在响应mongo shell命令的事实可以看出(,但客户端不会自动与它对话。我如何配置NodeJS服务器自动切换到辅助服务器?

我需要在某个地方指定所有3个服务器地址吗?但这似乎不是一个好的解决方案,因为一旦主网络重新上线,它的IP地址将与原来不同。

我觉得我错过了一些非常基本的东西,请启发我:(

谢谢,Gary

你的理解是其中的一部分,但也存在一些问题。在连接中分配多个单一服务器的一般前提是,如果该服务器地址在连接时不可用,则将从"种子列表"中选择其他服务器来建立连接。这将删除单个故障点,例如此时"主"不可用。

如果这是一个"副本集",则驱动程序将在连接后发现成员,然后在选择该成员时"自动"切换到新的"主"。因此,这确实需要您的"副本集"实际上能够选择一个新的"主"来切换连接。此外,这不是"即时"的,因此在新的"主"升级并能够接受操作之前可能会有延迟。

您的"auto_reconnect"设置也没有执行您认为它正在执行的操作。所有这些管理是,如果发生连接"错误",驱动程序将"自动"重试连接,而不会引发异常。你可能真正想做的是自己处理这个问题,因为你最终可能会无限地重试一个无法建立的连接。因此,好的代码会考虑到这一点,并通过一些合理的处理和日志记录来管理"重新连接"尝试。

IP地址的最后一点通常是通过使用解析为IP地址的主机名来解决的,在该地址中,无论解析为什么,这些"主机名"都不会更改。这对驱动程序和"副本集"本身同样重要。实际上,如果服务器成员正在通过更改的IP地址查找另一个成员,那么他们不知道该查找什么。

因此,驱动程序将"故障转移"或以其他方式选择一个新的可用"主",但仅在服务器也可以相互通信的相同容差范围内。您应该为连接设定种子,因为您无法保证连接时哪个节点是"主要"节点。最后,如果IP地址可能发生更改,则应该使用主机名而不是IP地址。

驱动程序将"自我发现",但它同样只使用副本集可用的配置。如果该配置对副本集无效,那么它对驱动程序也无效。

示例:

MongoClient.connect("mongodb://member1,member2,member3/database", function(err,db) {
})

或者其他具有Server对象数组的对象。

最新更新