【问题标题】:Processing large mongo collection offsite异地处理大型 mongo 集合
【发布时间】:2014-02-16 23:55:16
【问题描述】:

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

【问题讨论】:

  • 每天 1kk 个日志是多少?每天 100 万条日志行?
  • 你将如何处理你的日志数据? Map/Reduce 或者您有计算应用程序?
  • @Stennie,是的,完全正确。
  • @yaoxing 我已经申请了计算。
  • @Moonwalker 那么我的答案的解决方案 1 将适用。您需要阅读有关聚合框架的文档和您的语言的 API 文档。这会给您的 MongoDB 服务器带来压力。而如果你通过解决方案 3,压力会在你的应用服务器上,并且逻辑会更复杂。

标签: mongodb storage replication database


【解决方案1】:

至于您的问题,是的,复制确实可以部分解决您的问题,但有局限性。 所以我知道有几种方法可以解决您的问题:

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

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

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

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多