如何在没有DB的情况下正常关闭Mongo(在副本集中)?

时间:2011-09-23 01:42:35

标签: mongodb node.js shutdown

我的服务器设置如下:

2个x服务器。 mongoDB在两个服务器之间都有副本集。每个都是一个节点。

然后我让我的node.js服务器连接到MongoDB。

当我杀死辅助服务器时发生了什么。 (关闭服务器)。主要的MongoDB仍在运行,但Node.js Server与MongoDB有连接问题。即使我添加了服务器,它也无法正常工作。我使用mongoose和connect-mongo。

那么,发生了什么?如何正确关闭Mongo节点?

2 个答案:

答案 0 :(得分:5)

如果您有一个包含2个节点的副本集,当一个节点发生故障时,另一个节点会将自身降级为辅助节点。如果你没有与slaveOk连接,那么你将无法阅读(在任何一种情况下你都无法写作)。

这是MongoDB强加的安全措施,要求副本集的大多数(意味着一半加一)能够相互看到,以确保可以安全地选出主要副本。如果无法看到多数,少数民族中的节点无法知道“另一半”是否选出了主要节点。同时有两个初选将是非常糟糕的(TM),因为这可能导致相互冲突的更新。

在您只想运行两个节点的情况下,您还可以运行仲裁器以在一个节点关闭或对副本集不可见的情况下断开连接。仲裁器是正常的mongod进程,但不存储任何数据 - 实质上它只参与选举,否则就是空闲。在具有2个“普通”节点和一个仲裁器的副本集中,两个数据保持节点中的任何一个都可以在不失去多数的情况下关闭。

有关详情,请参阅the MongoDB documentation on replica setsthe documentation on artibers

答案 1 :(得分:1)

如果您的主服务器在您关闭辅助服务器后仍然是主服务器,则它是节点的驱动程序问题。无论如何,你总是应该有一个具有偶数个副本节点的仲裁器,"为什么"有关mongodb的文档的详细记录。

如果这是node.js问题,你使用的是node-mongodb-native版本吗?我在2个月前遇到了一些不同的复制问题,但是已经修复了最新版本。驱动程序的最后一个复制问题已经关闭了9月9日,你应该尝试使用最后一个标记版本(V0.9.6.18,因为我写这个)