MongoDB中的"not master and slaveok=false"错误通常发生在尝试写入复制集群的某个节点时。这个错误信息表明当前的写操作已被路由到了一个非主节点,并且主节点未能正确响应查询。
这种错误的常见原因是你的代码中没有正确地配置MongoDB的复制集群。如果配置不正确,则写请求将不会写入有效的主节点中。
以下是两个示例,展示了该错误发生时如何进行解决。
示例1:
错误信息:
Write operation on node xxx:27017 failed: not master and slaveok=false
这种错误通常表示你的代码试图将写请求路由到错误的节点上,而这个错误的节点不是主节点。
分析错误,可以发现“xxx:27017”的节点不是主节点。因此需要修改代码中的配置信息来确保将写请求发送到正确的节点。在复制集群配置中,主节点可以通过isMaster
命令手动识别。使用该命令检查你的代码中配置的主节点是否正确。如果错误,需进行更正。
示例代码:
const MongoClient = require('mongodb').MongoClient;
const mongoUri = 'mongodb://example.com:27017,example.com:27018,example.com:27019/test?replicaSet=rs0&readPreference=secondary';
const client = new MongoClient(mongoUri, { useNewUrlParser: true })
client.connect((error, db) => {
if (error) {
console.log('Error connecting', error);
return;
}
const adminDb = client.admin();
adminDb.command({ isMaster: 1 }, (error, result) => {
if (error) {
console.log('Error getting master', error);
return;
}
console.log(`Master URI: ${result.primary}, node we're connecting to: ${mongoUri}`);
});
});
在示例代码中,我们使用MongoDB官方Node.js库连接到了复制集群,其中设置了replicaSet
和readPreference
参数,这允许我们在副本集中连接到一个辅助节点。我们使用命令adminDb.command({ isMaster: 1 }
来获取主节点的URI,如果没有错误,那么URI会被打印出来,否则会打印出错误消息。
示例2:
错误信息:
MongoError: not master and slaveok=false
如果出现上述错误,可以通过配置MongoDB的默认写关注点来解决该问题。在默认情况下,MongoDB将所有写操作路由到主节点。但是,如果代码中明确指定副本集,则MongoDB可能会尝试在非主节点上进行写操作,从而导致 "not master and slaveok=false" 错误。
在解决这个问题时,将MongoDB的默认写关注点设置为主节点,可以避免在错误的节点上写入数据。
示例代码:
const MongoClient = require('mongodb').MongoClient;
const mongoUri = 'mongodb://example.com:27017,example.com:27018,example.com:27019/test?replicaSet=rs0&readPreference=secondary';
const client = new MongoClient(mongoUri, { useNewUrlParser: true })
client.connect((error, db) => {
if (error) {
console.log('Error connecting', error);
return;
}
// 设置主节点
db.command({ setParameter: 1, internalQueryExecMaxBlockingSortBytes: 335544320 });
});
在此示例代码中,我们使用db.command({setparameter:1,internalqueryexecmaxblockingsortbytes:335544320});
为复制集群设置主节点,并将所有写请求路由到主节点上。
通过以上两个示例,我们可以看出,在MongoDB中出现“not master and slaveok = false”错误时,需要修正配置文件,确保所有的写操作都路由到正确的主节点上。除此之外,还可以通过设置MongoDB的默认写关注点来避免这个错误。