Mongodb中的时间序列存储

Fre*_*red 7 time-series mongodb

我有大约1000个传感器在白天输出数据.每个传感器每天输出大约100,000个点.当我查询数据时,我只对在给定日期从给定传感器获取数据感兴趣.我不做任何跨传感器查询.时间间隔不均匀,我需要保持时间分辨率,所以我不能做像每秒1点的数组.

我打算多年来存储数据.我想知道哪种方案是最好的:

  1. 每天/传感器对对应一个集合,因此每天向我的数据库添加1000个大约100,000个文档的集合
  2. 每个传感器对应一个集合.我有1000个固定数量的集合,每天增加约100,000个文档.

1直觉上查询似乎更快.我使用的是mongoDb 3.4,它对数据库中的集合数没有限制.

2看起来更干净但我担心收藏会变得庞大,随着每个收藏的增长,查询会逐渐变慢

我赞成1,但我可能错了.有什么建议?

更新:

我遵循了建议

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

我没有为每次测量存储一个文档,而是一个包含128个测量,startDate,nextDate的文档.它减少了文档的数量,从而减少了索引大小,但我仍然不确定如何组织集合.

当我查询数据时,我只想要(日期,传感器)对的数据,这就是我认为1可能加速读取的原因.我目前在我的数据库中有大约20,000个集合,当我查询所有集合的列表时,需要很长时间才能让我认为拥有这么多集合并不是一个好主意.

你怎么看?

Vin*_*ren 5

我肯定会推荐方法2,原因有很多:

  1. MongoDB的分片设计用于处理越来越大的单个集合,并且可以很好地应对根据需要在不同服务器中分割集合内的数据.它没有相同的能力来分割跨越不同服务器的许多集合中存在的数据.
  2. MongoDB旨在能够有效地查询非常大的集合,即使数据分散在多个服务器上,只要您可以选择与最常见的读取查询匹配的合适分片.在您的情况下,那将是传感器+日期.
  3. 使用方法1,您的应用程序需要进行繁琐的工作,以了解要查询的集合,以及(可能)找到该集合的位置.方法2,配置良好的分片,意味着mongos进程为您完成了艰苦的工作