根据要求,我的NodeJS客户端能够连接到MongoDB主服务器并与之交互。
我使用以下代码构建服务器对象
var dbServer = new Server(
host, // primary server IP address
port,
{
auto_reconnect: true,
poolSize: poolSize
});
以及以下用于创建数据库对象的代码:
var db = new Db(
'MyDB',
dbServer,
{ w: 1 }
);
我的印象是,当主要版本发生故障时,客户端会自动发现它现在需要与其中一个辅助设备进行通信,这些辅助设备将被选为主设备。
但是当我手动终止主服务器时,其中一个辅助服务器确实成为主服务器(从mongo shell可以看出它现在响应mongo shell命令这一事实),但客户端并没有这样做。 t自动与它交谈。如何配置NodeJS服务器以自动切换到辅助服务器?
我需要在某处指定所有3个服务器地址吗?但这似乎不是一个好的解决方案,因为一旦主要线路重新上线,它的IP地址将与原来的不同。
我觉得我遗失了一些非常基本的东西,请赐教:)
谢谢你, 加里
答案 0 :(得分:4)
那么你的理解是其中的一部分,但存在一些问题。在连接中分配多个单个服务器的一般前提是,如果该服务器地址在连接时不可用,则将选择“种子列表”中的其他内容以建立连接。这样可以消除单点故障,例如“主要”此时不可用。
如果这是“副本集”,则驱动程序将在连接后发现成员,然后在该成员被选举时“自动”切换到新的“主要”。因此,这确实要求您的“副本集”实际上能够选择新的“主要”以切换连接。此外,这不是“即时的”,因此在新的“主要”升级并能够接受操作之前可能会有延迟。
您的“auto_reconnect”设置也没有按照您的想法进行。所有这一切管理的是,如果发生连接“错误”,驱动程序将“自动”重试连接而不抛出异常。您可能真正想要做的就是自己处理这个问题,因为您最终无法重试无法建立的连接。如此好的代码会考虑到这一点,并通过一些合理的处理和记录来管理“重新连接”尝试本身。
关于IP地址的最后一点通常是通过使用解析为IP地址的主机名来解决的,这些“主机名”永远不会改变,无论他们解决什么问题。这对于驱动程序和“副本集”本身同样重要。事实上,如果服务器成员通过更改的IP地址寻找另一个成员,那么他们就不知道要查找什么。
因此驱动程序将“故障转移”或以其他方式选择新的可用“主要”,但仅在服务器也可以相互通信的相同容差内。您应该为您建立连接,因为您无法保证在连接时哪个节点是“主要”节点。最后,如果后者可能会发生变化,应该使用主机名而不是IP地址。
驱动程序将“自我发现”,但同样只是使用副本集可用的配置才能执行此操作。如果该配置对副本集无效,那么它对驱动程序也是无效的。
示例:
MongoClient.connect("mongodb://member1,member2,member3/database", function(err,db) {
})
或其他具有Server
对象数组的其他对象。