我正在尝试将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
任何帮助都会非常感激。
答案 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_two
和 host_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()