2015-11-05 93 views
3

我正在用Apache Storm评估Mongo DB。我的用例是我必须从Apache Storm中的MongoDB中读取数据,在bolt中做一些处理并将其转储到Neo4J图形数据库中。Mongodb oplog同步

我使用的是蒙戈喷口,这将从OPLOG文件中读取数据。我查看了主节点将数据写入oplog文件的文档,并且副本读取将以异步方式发生。我知道oplog是一个封闭的集合(指定的大小),数据以很高的速度写入oplog,同步到副本集有点慢。如果oplog达到其最大大小,它会覆盖文件开头的文档。在异步过程中,如果我们获得其他数据,并且复制仍处于完成状态,则可能会丢失复制集,因为它不会同步。

我在这里的问题是

1)有什么办法来克服这个?

2)使用Apache Storm时,我们可以如何更好地使用这个加盖的集合?

3)如果给最大OPLOG大小如我给500GB和OPLOG拥有1GB的数据将其占领和大小的储备500GB?

4)这是我的用例的正确解决方案吗?

在此先感谢!

回答

1

是的,你可以通过增加oplog的大小来克服这个问题。这需要关闭mongo实例才能生效。

我最近的工作类似您使用的是尾光标在蒙戈订阅在一个初级的OPLOG所做的任何更改,并将其迁移到另一个数据库做一个概念证明。我们最终还是以更清晰的方式看待Storm。对于这个用例,我们并没有在Storm上100%出售,但尾部光标有点难看且不可靠。我会在尾巴光标前使用Storm。

您可以更好地为风暴只是拿起新的命令,使与风暴利用这个上限的集合。 您碰到的复制问题看起来与从主Oplog中拾取新命令并将相关操作执行到Neo4j中的任务相互排斥。如果您是从oplog上读取辅助数据,我会更好地理解这是您声称的目标是什么(即将数据写入Neo4j)的问题。 由于您正在阅读小学的oplog,并且可以在处理最新的命令时进行处理,所以我不确定这里是否存在问题。

关于你提到的RS同步问题;如果你的副本不同步,你正在失去复制,那么有问题应该提前解决。我确实理解并赞赏你的观点,但是为了实现这一目的而设计的系统需要一些TLC。

正如你所说,oplog是一个上限集合。当空间用完时,它将为任何要执行的新命令腾出空间。如你所说,没有什么是保留的。您的辅助程序将无法将这些命令应用于它们并需要完整的重新同步。您需要关注"replication oplog window"这表示1.这是操作在被新条目覆盖之前将保留在oplog中的时间量。 2.次要成员可以离线多长时间,并且仍然赶上主服务器而不进行完全同步。