【问题标题】:Mongo for non regular time-seriesMongo 用于非规则时间序列
【发布时间】:2015-04-07 18:02:39
【问题描述】:

我正在使用 MongoDB 来处理时间序列,这工作正常,因为到目前为止还没有太多数据,但我现在需要确定需要什么才能扩展到更多数据。今天,每天接收 +200k 数据,每几秒钟接收一次数据,这不是很大,但应该很快就会增加。

由于每条数据(parentID、时间戳、值)都创建了一个文档,因此所使用的数据收集远非高效。我已经看到了几种使用将时间序列保存一小时的文档的方法(例如,使用一个内部数组来保存每一秒的数据),这真的很棒,但是因为我必须处理的数据没有收到定期(取决于 parentID),这种方法可能不合适。

在我收到的数据中:
- 有些每隔几秒就会收到一次
- 有些每隔几分钟就会收到一次
对于所有这些数据,两个连续数据之间的步长不一定相同。

有没有更好的方法可以用来处理这些数据,例如使用另一种模型化,可以帮助扩展数据库?

今天只有一个 mongod 进程正在运行,我想知道在哪个级别可能真正需要分片,有什么提示吗?

【问题讨论】:

    标签: mongodb time-series scalability


    【解决方案1】:

    即使读数不是均匀分布的,您仍然可以获得预先分配文档的好处。您无法在阅读时构建每个文档,但您可以构建每个文档以保存固定数量的阅读

    {
        "type" : "cookies consumed"
        "0" : { "number" : 1, "timestamp" : ISODate("2015-02-09T19:00:20.309Z") },
        "1" : { "number" : 4, "timestamp" : ISODate("2015-02-09T19:03:25.874Z") },
        ...
        "1000" : { "number" : 0, "timestamp" : ISODate("2015-01-01T00:00:00Z") }
    }
    

    根据您的用例,此结构可能适合您,并为您提供使用新读数更新预分配文档的好处,对于一些大的 N,仅在每个 N 读数分配一个全新的文档。

    【讨论】:

    • 问题是,在我的用例中,一旦数据存储在文档中,检索它们的查询也基于 parentID 和时间戳。使用您提出的方法,我将无法索引时间戳,对吗?
    • 对 - 你可以在文档上存储第一个和最后一个时间戳,然后使用它们。但是,根据您的所有要求,预先分配的架构可能不适合您。
    【解决方案2】:

    您的问题的解决方案在这里得到了很好的体现:

    http://bluxte.net/musings/2015/01/21/efficient-storage-non-periodic-time-series-mongodb

    已经指出的基本思想是:为每个文档捕获固定数量的事件,并在另一个“更高级别”集合中记录每个文档的开始和结束时间戳。

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 2016-04-07
      • 2014-09-02
      • 2012-05-12
      • 2021-01-08
      • 2011-06-16
      • 2023-01-20
      • 2013-11-07
      • 1970-01-01
      相关资源
      最近更新 更多