在异地处理大型mongo集合

时间:2014-02-16 23:55:16

标签: mongodb storage replication database

我有一个系统将日志写入mongodb(每天大约1kk日志)。每周我需要计算一些关于这些日志的统计数据。由于计算非常耗费处理器和内存,我想复制集合,我正在使用强大的异地机器。如何在不复制所有内容的情况下保持最新的异地收藏?我通过在其元素中存储统计信息来修改非现场集合,即添加字段{"alogirthm_1": "passed"}{"stat1": 3.1415}。复制是否适合我的用例,或者我应该调查其他替代方案?

1 个答案:

答案 0 :(得分:1)

关于您的问题,是的,复制确实可以部分解决您的问题,但有限制。 因此,我有几种方法可以解决您的问题:

  1. 半数据库,半应用方式。
    复制可使您的数据保持最新。但是,它不允许您修改辅助节点(您称之为“非现场集合”)。因此,您必须在辅助节点上进行计算并将数据写入主节点。您需要在辅助服务器上运行aggregation的应用程序,并将结果写回主服务器 这要求您运行应用程序,PHP,.NET,Python等等。

  2. 全服务器方式
    由于您将以任何方式使用多服务器,因此可以考虑使用Sharding来实现更快的存储,并直接在线进行计算。这样您甚至不需要运行应用程序。 Map / Reduce执行计算并将输出写入新集合。我不要推荐此解决方案,因为当前版本为Map/Reduce performance issue

  3. 全程申请方式
    基本上您仍然使用复制进行读取,但除了查询数据外,服务器不会进行任何计算。您可以使用capped collectionTTL index删除过期数据,只需在应用程序中逐个枚举数据并自行计算。