我正在用ApacheStorm评估mongo db。我的用例是这样的,我必须在apachestorm中从mongodb读取数据,在bolt中进行一些处理,并将其转储到neo4j图形数据库中。
我使用的是mongospout,它将从oplog文件中读取数据。我浏览了文档,其中说明主节点将数据写入oplog文件,副本读取将从中异步进行。我知道oplog是一个有上限的集合(指定大小),数据以非常高的速度写入oplog,而与副本集的同步有点慢。如果oplog达到其最大大小,它将覆盖文件开头的文档。在异步过程中,如果我们得到一些其他数据,并且复制仍然处于完成状态,则有可能丢失复制集,因为它将不会被同步。
我的问题是
1) 有没有办法克服这个问题?
2) 在与apache storm一起使用时,如何更好地利用这个capped集合?
3) 如果我给最大的oplog大小例如我给500gb和oplog有1gb的数据将占用和保留500gb的大小?
4) 这是我的用例的正确解决方案吗?
提前谢谢!!!
1条答案
按热度按时间vlf7wbxs1#
是的,您可以通过增加oplog的大小来克服这个问题。这需要关闭mongo示例才能生效。
我最近研究了一个概念验证,类似于您正在使用mongo中的尾部游标来订阅主数据库oplog中所做的任何更改,并将它们迁移到另一个数据库。我们也最终关注了风暴,以更干净的方式来做这件事。对于这个用例,我们在storm上也不是100%销售,但是尾部游标有点难看和不可靠。我会在有尾光标之前使用storm。
通过让storm只接收新命令,您可以更好地使用这个带帽集合。您所涉及的复制问题似乎与从主服务器上的oplog获取新命令并将这些感兴趣的操作执行到neo4j的任务相互排斥。如果你是从一个次要的oplog中读取数据,我会更好地理解这是一个关于你声称目标是什么的问题(即,将数据写入neo4j)。由于您正在读取主操作日志,并且可以在最新命令进入时处理它们,因此我不确定这里是否存在问题。
关于您提出的rs同步问题;如果您的辅助设备不同步,导致您丢失复制,那么应该提前解决一些问题。我确实理解并赞赏你的观点,但一个允许这种情况发生的系统需要一些帮助。
正如你所说,oplog是一个封顶的集合。当空间用完时,它将为执行任何新命令腾出空间。你说什么都没保留。您的二级服务器将无法应用这些命令,因此需要完全重新同步。您需要关注表示1的“复制oplog窗口”。这是一个操作在被一个新条目覆盖之前将保留在oplog中的时间量。2.次要成员可以脱机多长时间,并且在不执行完全重新同步的情况下仍能赶上主要成员。