【问题标题】:MongoDB oplog stream Node.jsMongoDB oplog 流 Node.js
【发布时间】:2017-04-18 18:47:05
【问题描述】:

我有一个本地 MongoDB 实例,以 --master 开头,我可以在启动日志中看到我创建了一个副本集 oplog(文件:/data/db/local.1)。每次我执行和 insert() 时,它似乎都会更新 local.1。

我正在尝试使用以下代码跟踪/流式传输 oplog...

MongoDB.connect('mongodb://localhost:27017/test',(e,db) => {
          if ( e ) { return console.log('Connect MongoDB Error',e); }
          console.log('Connected MongoDB'); 
          Server.DB = db;  
              db.collection('oplog.rs').find({}).toArray((e,d) => {
                console.log('oplog.rs');
                console.log(e);
                console.log(d);
              })  

          var updates = db.collection('oplog.rs').find({},{ 
                              tailable: true, 
                              awaitData: true, 
                              noCursorTimeout: true, 
                              oplogReplay: true, 
                              numberOfRetries: Number.MAX_VALUE 
                              }).stream();
                              
              updates.on('data',(data) => { console.log('data',data); });
              updates.on('error',(e) =>   { console.log('error',e); });
              updates.on('end',(end) =>   { console.log('end',end); });
        });

代码在启动时记录以下内容...

oplog.rs
null
[]

但是流没有输出,我将 numberOfRetries 设置为较低的值,我得到了错误..

error { MongoError: No more documents in tailed cursor
    at Function.MongoError.create (/Users/peter/node_modules/mongodb-core/lib/error.js:31:11)
    at nextFunction (/Users/peter/node_modules/mongodb-core/lib/cursor.js:637:50)
    at /Users/peter/node_modules/mongodb-core/lib/cursor.js:588:7
    at queryCallback (/Users/peter/node_modules/mongodb-core/lib/cursor.js:211:18)
    at Callbacks.emit (/Users/peter/node_modules/mongodb-core/lib/topologies/server.js:116:3)
    at Connection.messageHandler (/Users/peter/node_modules/mongodb-core/lib/topologies/server.js:282:23)
    at Socket.<anonymous> (/Users/peter/node_modules/mongodb-core/lib/connection/connection.js:273:22)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:189:7)
    at readableAddChunk (_stream_readable.js:176:18)
  name: 'MongoError',
  message: 'No more documents in tailed cursor',
  tailable: true,
  awaitData: true }
end undefined

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    oplog.rs 用于replica sets。使用 --master 启动 mongodb,您使用的是早已弃用的 master-slave replication,它使用 local.oplog.$main 数据库,所以 oplog.rs 中没有任何内容。

    您需要使用--replSet 启动mongod 才能从副本集oplog 中受益。 Read more how to deploy and configure replica sets.

    【讨论】:

    • 我现在已经连接到一个 Atlas 集群,但 oplog.rs 仍然是空的,并且 tail() 会产生相同的消息。 (尝试过 local.oplog.rs / oplog.rs / oplog)。
    • 您确定使用local 数据库吗?您究竟是如何尝试 local.oplog.rs 的?为了清楚起见,它应该是MongoDB.connect('mongodb://host:port/local',(e,db)。当你从 shell 运行 rs.status()rs.config() 时,你得到了什么?
    • 好的,我现在明白了。我需要使用 db/local 这将是我的集群上的全局数据库,所以我认为它不适用于我的应用程序,因为我想捕获给定数据库的事务,而不是所有数据库。所以我可以过滤全局数据库/本地,或者为每个数据库创建新的 cappedCollection。感谢您的回答。
    • 您只需要过滤 oplog 以找到与您的数据库名称匹配的命名空间
    • 我正在多租户 Atlas 实例,因此希望避免共享“管理器”进程。
    猜你喜欢
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2016-02-19
    相关资源
    最近更新 更多