2017-02-26 47 views
2

我们使用mongo java驱动程序3.2.2和mongo oplog集合来标识我们的mongo集合中的更改(Mongo服务器版本为3.2)。我们遇到以下两个问题,并且几乎没有问题。如果你们中的任何一个人遇到了同样的问题,请帮助我们澄清它们。下面的问题尤其发生在oplog中繁重的写操作时。Mongo Oplog Tailable光标

代码:

MongoCursor<Document> tailableCursor = collection.find(query).sort(new Document("$natural", 1)).cursorType(CursorType.TailableAwait).noCursorTimeout(true).iterator(); 
  1. com.mongodb.MongoExecutionTimeoutException:操作超出时间限制

    一)将设置在处理异常越好MAXTIME帮助?考虑到我们正在使用可拖动的等待光标,maxTime有什么实际价值?下面的链接指出,对于游标,随后的“getmore”请求将包含在总时间中。 https://www.mongodb.com/blog/post/maxtimems-and-query-optimizer-introspection-in

    b。)会使用非阻塞游标调用帮助? http://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/client/MongoCursor.html#tryNext--

    c)如果出现上述异常,优雅地处理错误并继续处理后续记录的最佳方法是什么?

  2. com.mongodb.MongoQueryException:查询find命令时,错误代码为96和错误信息“执行人的错误失败:CappedPositionLost:CollectionScan死于被删除

    会增加OPLOG大小上限集合中的位置有助于解决这个问题?是否有其他可用的解决方案?

回答

1

我们长期以来面临类似的问题。经过一番研究,我们发现这个官方文档非常有帮助。

https://docs.mongodb.com/manual/tutorial/troubleshoot-replica-sets/

我们的问题是“复制滞后”

复制滞后的操作之间的主要和该操作的从OPLOG到辅助应用程序的延迟。复制延迟可能是一个重大问题,并可能严重影响MongoDB副本集的部署。过度的复制滞后使得“落后”成员不能迅速成为主要成员,并增加了分布式读取操作不一致的可能性。

复制延迟的可能原因包括:

  • 网络延迟
  • 磁盘吞吐量
  • 并发

在某些情况下,长期运行在主可以操作阻止副本上的复制。为了获得最佳结果,请将写入关心配置为需要确认向辅助节点复制。如果复制无法跟上写入负载,这可以防止写操作返回。

  • 适当的写关注

如果正在执行需要大量写入到主,特别是未确认写入关注,次级大的数据摄取或批量加载操作将无法快速阅读oplog以跟上变化。 为了防止这种情况发生,请在每隔100,1000或另一个时间间隔后写入确认写入问题,以便为次要人员提供跟上主要问题的机会。

我们跟着节“复制延迟的可能原因包括”和做了两两件事:

  • 适当写重写插入代码涉及
  • 限制插入速率

那么,我们的问题解决了。