我试图在mongo中拖尾oplog并得到超时错误.oplog集合中包含超过7百万个文档.但是,作为最后的努力,我添加了oplogReplay: true游标选项的选项,超时错误消失了,我正在读取oplog流.
该的NodeJS蒙戈文档是相当神秘的什么这个选项实际上做,只知道它是为tailable光标这就是为什么我在看着它:
oplogReplay {Boolean},设置一个内部标志,仅适用于tailable游标.
我的猜测是它要么跳过整个oplog的初始扫描并直到最后,要么从oplog的另一端扫描.
我的代码看起来像这样:
const tstamp = new MongoDB.Timestamp(0, Math.floor(new Date().getTime() / 1000));
const filters = {
ts: { $gt: tstamp }
};
const curOpts = {
tailable: true,
timeout: false,
oplogReplay: true, //<- What does this actually do?
awaitData: true,
numberOfRetries: 60 * 60 * 24,
tailableRetryInterval: 1000
};
mongodb.connect(url).then(db => {
const cur = db.collection('oplog.rs').find(filters, curOpts);
const stream = cur.stream();
stream
.on('data', log => {
console.log('Data!')
console.log(log)
})
.on('close', () => {
console.log('Stream closed....')
db.close()
})
.on('error', err => {
console.log('Stream error....')
console.error(err)
db.close()
});
}));
Run Code Online (Sandbox Code Playgroud)
我也发现了这个与之相关的问题和答案.我发现虽然我解决了原来的问题.
当我研究这个问题时,我发现 oplog扫描在30秒后超时,这导致了一些问题.
另一个问题和答案与我的超时问题有关.似乎在oplog的ts字段上创建索引是一个非常糟糕的想法,并且在较新版本的mongo上是不可能的.