我在副本集中设置了一个简单的 mongodb,其中有 1 个实际实例和 1 个仲裁器(以避免冲突)。这是因为我们的负载增加,所以需要扩展副本集以包含更多实例。
如果我通过 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:仲裁器发生故障/离线
- 主节点是唯一剩下的节点,并且为自己投票
- 1/2 票不是多数票,因此主要票数无法当选,并成为次要票数
- 您的设备现已关闭,无法接受写入
场景 2:主节点宕机/离线
- 没有有数据的节点,仲裁者不能为自己投票
- 0/2 票,没有可用的实际数据节点,您的数据集处于离线状态
如您所见,实际上最好只使用一个主节点 - 因为仲裁器所做的就是在主节点正常工作时引入一种让您的副本集不可用的方法。当然,另一个选项是添加一个辅助节点并转到 3 个节点 - 然后您实际上就可以获得副本集的冗余优势。
答案2
这句话来自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.
您不满足定义的最低要求。