我不是mongodb专家,所以我现在对服务器设置有点不确定。
我有一个运行带有wiretiger的mongo3.0.2的实例,同时接受读写操作。它从客户端收集日志,因此写入负载是不错的。每天我想处理这些日志并使用聚合框架计算一些指标,处理的数据集就像上个月的所有日志一样,所有计算大约需要5-6个小时。 我正在考虑拆分写入和读取以避免锁定我的集合(服务器在我阅读时继续写日志,新写入的日志可能与我的查询匹配,但我可以跳过它们,因为我不需要100%的准确性)。
换句话说,我想使用辅助进行读取设置,其中复制不是连续执行,而是在所有读取操作开始之前触发在配置的时间或更好的时间启动。
我正在从node.js进行所有处理,因此我在这里看到的一个选项是导出在某个时期创建的数据,如[昨天,今天],并将其导入自己读取实例并在导入完成后进行计算。我正在寻找副本集和主/从复制作为可能的设置,但我没有得到如何配置它来实现所描述的场景。 也许我错了,错过了什么?还有其他选择来实现这个目标吗?
答案 0 :(得分:0)
由于多种原因,您使用副本集的想法存在缺陷。
首先,副本集总是复制整个mongod实例。您不能为单个集合启用它,当然不仅仅是集合的特定文档。
其次,在开始生成报告之前停用复制并启用它也不是一个好主意。启用复制时,新的从站将不会立即更新。它需要一段时间才能处理自上次与主服务器联系后的更改。无法确定这需要多长时间(您可以使用rs.status()
检查辅助设备后面的辅助设备的距离,并将辅助设备optimeDate
与其lastHeartbeat
日期进行比较。/ p>
但是当您想要对按时间跨度选择的文档子集执行数据挖掘时,还有另一种解决方案。
将要分析的文档传输到新集合。您可以使用仅包含$ match的聚合管道来执行此操作,该匹配与上个月的文档匹配,后跟$out。 out-operator指定聚合的结果不会发送到应用程序/ shell,而是写入新的集合(在此之前自动清空)。然后,您可以在不锁定实际集合的情况下对新集合执行报告。它还有一个优点,就是你现在在一个小得多的集合上运行,因此查询会更快,特别是那些不能使用索引的查询。此外,您的数据不会在您的汇总之间发生变化,因此您的报告由于数据之间的数据更改而不会出现任何不一致。
如果您确定需要第二台服务器来生成报告,您仍然可以使用复制并在辅助服务器上执行聚合。但是,我真的建议您build a proper replica-set(包括主要,次要和arbiter),并始终保持活动状态。这不仅可以确保您在生成报告时数据不会过时,而且如果您的主要数据因某种原因而停止,它还可以为您提供自动故障转移的重要好处。