簡體   English   中英

當主節點關閉時,Node.js本機mongodb失去與副本集的連接

[英]Node.js native mongodb losing connection with replica set when primary goes down

我有一個使用本地node.js mongodb軟件包的系統(由於遺留代碼,更改為mongoose之類的方法將是最后的選擇),當前系統使用一個獨立的mongo實例,但是我想轉向使用副本集。 為了測試這一點,我有一個本地(Win 7)mongo實例作為主要實例運行,另外還有一個輔助實例和一個仲裁器,該實例在樹莓派上的遠程(即物理上遠程)計算機上運行(使用Arch Linux 64位)。

問題是,當我關閉當前設置為主要對象的mongod進程而不是驅動程序重新連接到新的主要對象時,它會失敗並顯示ECONNRESET錯誤。

除此之外,副本集似乎還可以正常運行,所有節點都處於“正常運行”狀態,並且在其正確狀態下可以進行調整,而當某個節點被拆除時,則進行相應的調整。

我從node.js mongodb軟件包的v2.2.31開始,最近一次使用v3.0.4進行了測試,沒有任何變化。

最初,我在本地安裝了mongodb v3.4.3,在遠程安裝了3.4.9,因此如果是版本不匹配的問題(似乎不太可能),我將其設置為在兩端使用v3.6.2,但仍然存在相同的問題。

這是配置問題,還是對故障轉移過程的自動化程度的誤解。 任何幫助,不勝感激。

樣本輸出:

$ 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);
        }
    }
})();

抱歉,可能只是看不到樹木的樹木! 只需處理從查找中拋出的ECONNRESET異常並繼續,一切都很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM