存储高频周期性时间序列数据的最佳方法是什么?

时间:2018-05-22 17:12:24

标签: node.js database mongodb architecture storage

我为nodejs项目创建了一个MVP,以下是与我要问的问题相关的一些功能:

1 - 应用程序有一个包含CRUD操作的IP地址列表。 2 - 应用程序将在每5秒后ping每个IP地址。 3-并针对每个IP地址显示它的状态,即活着还是死亡以及正常运行时间

我在图书馆net-ping,express,mongo和angular的帮助下在nodejs上创建了一个有效的MVP。现在我有一个新的功能请求:

"计算为每个IP地址生成的每个ping的往返时间(延迟),并填充条形图或将显示RTT(延迟)历史记录的任何类型的图表(1个月-1)每一个连接的年份"

我需要将每个ping的响应存储在数据库中,假设最好的情况是如果我将存储的每个文档的大小为0.5 kb,那么每天将存储9.5 MB数据,每个285MB单个IP地址一年一个月和3.4GB,我将在我的应用程序中拥有100-200个IP地址。

考虑到应用程序可以扩展更多,最适合我的要求的最佳解决方案(包括付费的解决方案)是什么?

2 个答案:

答案 0 :(得分:2)

时间序列数据需要从数据库角度进行特殊处理,因为它们会从容量,查询性能,读/写优化目标等方面对传统数据库管理带来挑战。

我不建议您将此数据存储在传统的RDBMS或对象/文档数据库中。

最佳选择是使用专用的时间序列数据库引擎,如InfluxDB,它可以支持下采样(聚合)和原始数据保留规则

答案 1 :(得分:0)

所以我在阅读this之后更改了时间序列数据的架构设计,并减少了我大规模计算中的数字

以前的Schema看起来像这样:

{
  timestamp: ISODate("2013-10-10T23:06:37.000Z"),
  type: "Latency",
  value: 1000000
},
{
  timestamp: ISODate("2013-10-10T23:06:38.000Z"),
  type: "Latency",
  value: 15000000
}
Size of each document: 0.22kb
number of document created in an hour= 720
size of data generated in an hour=0.22*720 = 158.4kb
size of data generated by one IP address in a day= 158 *24 = 3.7MB

由于每个下一个time_Stamp只是前一个时间的5秒增量,因此可以优化模式以剪切冗余数据。 新架构如下所示:

{
  timestamp_hour: ISODate("2013-10-10T23:06:00.000Z"),// will contain hours
  type: “Latency”,
  values: {//will contain data for all pings in the specific hour
    0: 999999,
    …
    37: 1000000,
    38: 1500000,
    … 
    720: 2000000
  }
}
Size of each document: 0.5kb
number of document created in an hour= 1
size of data generated in an hour= 0.5kb
size of data generated by one IP address in a day= 0.5 *24 = 12kb

所以我假设数据的大小不再是问题,我虽然在这种情况下应该使用什么类型的存储以确保最佳性能存在争议,但我会相信我的mongoDB情况下。