1

我不是 mongodb 专家,所以我现在对服务器设置有点不确定。

我有一个使用wiredtiger 运行mongo3.0.2 的单个实例,接受读写操作。它从客户端收集日志,因此写入负载不错。每天一次我想处理这些日志并使用聚合框架计算一些指标,要处理的数据集类似于上个月的所有日志,所有计算大约需要 5-6 小时。我正在考虑拆分写入和读取以避免锁定我的集合(服务器在我阅读时继续写入日志,新写入的日志可能与我的查询匹配,但我可以跳过它们,因为我不需要 100% 的准确度)。

换句话说,我想使用辅助读取进行设置,其中复制不是连续执行,而是在配置的时间开始,或者在所有读取操作开始之前触发更好。

我正在从 node.js 进行所有处理,所以我在这里看到的一个选项是导出在某个时期(例如 [昨天,今天])创建的数据,然后将其导入到我自己读取实例并在导入完成后进行计算。我正在寻找副本集和主/从复制作为可能的设置,但我没有得到如何配置它来实现所描述的场景。所以也许我错了,错过了什么?还有其他选择可以实现这一目标吗?

4

1 回答 1

0

由于几个原因,您使用副本集的想法存在缺陷。

首先,副本集总是复制整个 mongod 实例。您不能为单个集合启用它,当然不仅仅是针对集合的特定文档。

其次,在开始生成报告之前停用复制并启用它也不是一个好主意。当您启用复制时,新的从属服务器不会立即更新。它需要一段时间才能处理自上次与主节点联系以来的更改。没有办法知道这需要多长时间(您可以使用rs.status()辅助节点optimeDate及其lastHeartbeat日期来检查辅助节点落后于主节点的距离)。

但是,当您想对按时间跨度选择的文档子集执行数据挖掘时,还有另一种解决方案。

将要分析的文档转移到新集合中。您可以使用仅包含 $match 的聚合管道来执行此操作,该管道与上个月的文档匹配,后跟$out。out-operator 指定聚合的结果不发送到应用程序/shell,而是写入新的集合(在此之前自动清空)。然后,您可以在不锁定实际集合的情况下对新集合执行报告。它还有一个优点是您现在在一个小得多的集合上进行操作,因此查询会更快,尤其是那些不能使用索引的查询。此外,您的数据不会在您的聚合之间发生变化,因此您的报告不会因为它们之间的数据变化而在它们之间出现任何不一致。

当您确定需要第二台服务器来生成报告时,您仍然可以使用复制并在辅助服务器上执行聚合。但是,我真的建议您构建一个适当的副本集(由 primary、secondary 和一个arbiter组成)并始终保持复制处于活动状态。这不仅可以确保您的数据在生成报告时不会过时,还可以在您的主数据库由于某种原因出现故障时为您提供自动故障转移的重要好处。

于 2015-04-22T20:48:21.910 回答