Mongodb不断报告“没有主要发现”,但shell工作正常

我在一个replicaset中有一个简单的mongodb设置,有一个实际的实例和一个仲裁器(为了避免冲突)。 随着我们的负荷增加,这是预期扩大复制品包括更多的实例。

如果我通过shell访问mongodb,我正确地得到了PRIMARY >提示符,并且运行rs.status()告诉我一切正常。

我有一个正在访问数据库的node.js服务器,使用github上的mongodb-native驱动,版本为0.9.9-8。 然而,偶尔它只是打破了以下错误: Unable to connect to database: Error: no primary server found

程序给出两个实例的两个地址(正常实例+仲裁者),否则程序日志或mongodb的日志都不能提供任何线索。 任何帮助,欢迎!

那么首先,不要给司机仲裁员的地址,只是主要的 – 司机没有理由与仲裁者谈话,它没有数据。 只有主要连接到它将然后连接到主要只有你的问题应该消失。

你的设置是另一回事 – 拥有一个单一节点的仲裁者并没有购买任何东西,实际上使你的设置变得不可靠,而不是更加稳定。

场景1:仲裁者下线/离线

  • 小学是唯一留下并投票的节点
  • 1/2票不是多数,所以小学不能当选,成为次要的
  • 你的套件现在已经closures,不能接受写入

场景2:主要closures/脱机

  • 没有数据的节点,仲裁者不能为自己投票
  • 0/2票,没有实际的数据节点可用,您的设置是离线的

正如你所看到的,只用一个主节点就可以实现更好的效果 – 因为所有的仲裁者都会引入一种方法,当主服务器正常工作时,你的服务器将不可用。 当然,另一个select是添加一个辅助节点并转到3个节点 – 那么您实际上可以获得副本集的冗余优势。

这是来自http://docs.mongodb.org/manual/core/replication/

 The minimum requirements for a replica set include two members with data, for a primary and a secondary, and an arbiter. In most circumstances, however, you will want to deploy three data members. 

您不符合所定义的最低要求。