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 文档中