我有一个使用本机node.js mongodb软件包的系统(由于遗留代码而改为像mongoose这样的最后手段)当前系统使用独立的mongo实例但我想转移到使用副本集。为了测试这个,我有一个本地(Win 7)mongo实例作为主要运行,加上在raspberry pi(使用arch linux 64位)上的远程(即物理远程)机器上运行的辅助和仲裁器。
问题是,当我关闭当前设置为主要的mongod进程而不是重新连接到新主要的驱动程序时,它失败 出现ECONNRESET错误。
除此之外,副本集似乎运行正常,所有节点都是" up"并且在正确的状态下,并在节点被拆除时进行相应的调整。
我从node.js mongodb软件包的v2.2.31开始,最近使用v3.0.4测试,没有任何变化。
最初我本地有mongodb v3.4.3和3.4.9远程,所以如果是版本不匹配问题(这似乎不太可能)我将其设置为在两端使用v3.6.2但是同样的问题仍然存在。 / p>
这是配置问题还是仅仅是对故障转移过程自动化的误解。任何帮助非常感谢。
示例输出:
$ node compiled/replset.js
-> joined secondary
===[ item 1 of 90 ]=========================================================
'ASC3498349'
===[ item 2 of 90 ]=========================================================
'YHD9848935'
===[ item 3 of 90 ]=========================================================
'PLS3098423'
===[ item 4 of 90 ]=========================================================
'JDJ2340982'
===[ item 5 of 90 ]=========================================================
'MDK3489346'
===[ item 6 of 90 ]=========================================================
'LDE3948849'
-> all servers connected
-> left primary
{ Error: read ECONNRESET
at _errnoException (util.js:1024:11)
at TCP.onread (net.js:615:25)
name: 'MongoNetworkError',
message: 'read ECONNRESET',
stack: 'Error: read ECONNRESET\n at _errnoException (util.js:1024:11)\n at TCP.onread (net.js:615:25)' }
测试程序:
import * as util from "util";
import * as mongodb from 'mongodb';
const { ReplSet } = require('mongodb-topology-manager');
process.on('unhandledRejection', (err) => {
console.log(err);
process.exit();
});
(async () => {
const client = await mongodb.MongoClient.connect('mongodb://user:pass@<HOST1>:<PORT1>,<HOST2>:<PORT2>,<HOST3>:<PORT3>/test?replicaSet=rs&authMechanism=DEFAULT&authSource=admin');
client.topology.on('left', (data: any) => {
console.log('-> left', data);
console.log(``);
});
client.topology.on('joined', (data: any) => {
console.log('-> joined', data);
console.log(``);
});
client.on('fullsetup', () => {
console.log('-> all servers connected');
console.log(``);
});
const totalCount = 90
let count = 1;
const INTERVAL = 1000;
const db = client.db('test');
const col = db.collection('items');
const timer = setTimeout(onTimer, INTERVAL);
async function onTimer() {
const item = await col.findOne({}, {
skip: count,
});
console.log(`===[ item ${count} of ${totalCount} ]===========================================================================`);
console.log(util.inspect(item, { colors: true, depth: null }));
count++;
if (count > totalCount) {
client.close();
console.log('done');
}
else {
setTimeout(onTimer, INTERVAL);
}
}
})();
答案 0 :(得分:0)
对不起,可能只是没有看到树木!只是处理从查找和继续抛出的ECONNRESET异常,一切都很好。