我正在使用Apache Storm评估Mongo DB。我的用例是这样的,我将在Apache Storm中从MongoDB读取数据,在bolt中进行一些处理并将其转储到Neo4J图形数据库中。
我正在使用Mongo Spout,它将从oplog文件中读取数据。我查看了文档,其中说主节点将数据写入oplog文件,并且副本读取将异步发生。我知道oplog是一个上限集合(指定大小),数据以非常高的速度写入oplog,同步到副本集有点慢。如果oplog达到其最大大小,它将覆盖文件开头的文档。在异步过程中,如果我们获得了一些其他数据,并且复制仍未完成,则可能会丢失复制集,因为它不会被同步。
我的问题是
1)有没有办法克服这个问题?
2)与Apache Storm一起使用时,我们如何更好地利用这个上限集合?
3)如果我给出最大的oplog大小,例如我给500GB而oplog有1GB的数据会占用并保留500gb的大小?
4)这是我的用例的正确解决方案吗?
提前致谢!!!
答案 0 :(得分:2)
是的,您可以通过增加oplog的大小来克服这个问题。这需要关闭mongo实例才能生效。
我最近在概念验证方面做了类似的工作,使用Mongo中的尾部游标来订阅在主服务器的oplog中进行的任何更改并将它们迁移到另一个数据库。我们也最终调查了Storm,以更清洁的方式做到这一点。对于这个用例,我们并没有100%在Storm上销售,但是尾部游标有点难看且不可靠。我在使用尾灯前使用Storm。
你可以通过Storm只使用Storm获取新命令,从而更好地利用Storm的这个上限集合。 您接触到的复制问题似乎与从主服务器上的Oplog中获取新命令以及将感兴趣的操作执行到Neo4j的任务相互排斥。如果您正在从oplog上读取作为次要的,我会更好地理解这是关于你声称目标是什么的问题(即将数据写入Neo4j)。 由于您正在阅读主要的oplog,并且可以在它们进入时处理最新的命令,我不确定这里是否存在问题。
关于您提出的RS同步问题;如果您的辅助设备不同步而您正在丢失复制,那么有些问题应该提前解决。我理解并理解你的观点,但设计允许这种情况发生的系统需要一些TLC。
正如你所说,oplog是一个上限集合。当它用完空间时,它将为任何新命令的执行腾出空间。你说的没有什么是保留的。您的辅助设备将无法将这些命令应用于它们并需要完全重新同步。您需要关注"replication oplog window"表示1.这是操作在被新条目覆盖之前保留在oplog中的时间。 2.辅助成员可以脱机多长时间,并且仍然可以在不执行完全重新同步的情况下赶上主要成员。