MongoError:不是主人

时间:2016-05-19 16:20:19

标签: node.js mongodb driver

我正在尝试将node.js应用程序连接到具有副本集的MongoDB,但是在执行任何写入操作时它会抛出错误。

抛出MongoError:不是主人。

它尝试在辅助mongo实例上写。

我有{db:{readPreference:secondaryPreferred}}选项,并使用本机Mongo驱动程序将它传递给node.js代码中的MongoClient.connect函数。

用于连接的URL类似于mongodb:// admin:pass @ host_one:27017,host_two:27017,host_three:27017 / dbName

任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:1)

您是否添加了您的 replicaSet 名称?

mongodb://admin:pass@host_one:27017,host_two:27017,host_three:27017/dbName?replicaSet=my-replica-set
<块引用>

replicaSet=name

驱动程序验证它连接到的副本集的名称 匹配这个名字。暗示给定的主机是种子列表,并且 驱动程序将尝试查找集合的所有成员。无默认 价值。

如果未设置,它将被视为独立节点。

答案 1 :(得分:0)

读取首选项不适用于写入。写入必须始终在主数据库上执行。

您应该连接到副本集,而不是直接连接到单个节点。参见node.js mongodb how to connect to replicaset of mongo servers

答案 2 :(得分:0)

也许你的副本集配置不正确。 要检查配置,请在 mongo 服务器中运行 rs.conf() 命令。您需要有一个以 primary 成员身份运行的 mongo 主机。

MongoError: Not master

此错误似乎是您的副本集的主要成员未正确配置。

您可以通过进入 host_one 的 mongo shell 来确认这一点。如果 mongo shell 提示未显示 PRIMARY,则说明未正确配置。

正确配置后 host_twohost_three 的 Mongo shell 提示应显示 SECONDARY

<块引用>

重要:在副本集的一个且只有一个 mongod 实例上运行 rs.initiate()

您可以在主成员上执行此命令以使配置正常工作。

rs.initiate();
cfg = {
    _id: 'rs0',
    members: [{
        _id: 0,
        host: 'host_one:27017',
        priority: 2
    }, {
        _id: 1,
        host: 'host_two:27017',
        priority: 1
    }, {
        _id: 2,
        host: 'host_three:27017',
        priority: 1
    }]
};
cfg.protocolVersion = 1;
rs.reconfig(cfg, {
    force: true
});

请注意,priority 值表示成员成为主要成员的相对资格。

<块引用>

指定较高的值使成员更有资格成为主要成员,而指定较低的值则使成员不符合资格。 priority 为 0 的成员没有资格成为主要成员。

您可以再次使用此命令检查您的副本集配置

rs.conf()