Mongo 用于非规则时间序列

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案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

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

【讨论】:

以上是关于Mongo 用于非规则时间序列的主要内容,如果未能解决你的问题,请参考以下文章

Sails Js - 防止非模型字段保存在 mongo 文档中

验证规则中的“非”运算符

Mongo Aggregation $subtract :对于两个非空日期总是给出空结果

用于收集超过 1000 万条记录的 Mongo 查询优化

用于组的 mongo 排序子文档

如果已经使用 Hadoop,HBase 或 Mongo 用于分析数据库?