当主服务器关闭时,Node.js本机mongodb与副本集失去连接

时间:2018-03-13 17:13:03

标签: node.js mongodb typescript replicaset

我有一个使用本机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);
        }
    }
})();

1 个答案:

答案 0 :(得分:0)

对不起,可能只是没有看到树木!只是处理从查找和继续抛出的ECONNRESET异常,一切都很好。