[英]MongoDB NodeJS client connection to Replica Set won't reconnect when the primary goes down
[英]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.