高采样率数据的数据库设计,多个缩放级别的图形

时间:2011-01-16 19:46:33

标签: database-design web-applications charts amazon-simpledb

我有多个传感器将数据提供给我的网络应用程序。每个通道每秒5个样本,数据在1分钟json消息(包含300个样本)中捆绑在一起。 数据将使用flot以1天到1分钟的多个缩放级别绘制成图表。

我正在使用Amazon SimpleDB,而且我目前正在将数据存储在我收到它的1分钟块中。这适用于高缩放级别,但是整天都会有太多行要检索

我目前得到的想法是,每小时我都可以抓取数据并在最后一小时收集300个样本并将它们存储在另一个表中,基本上是对数据进行下采样。<​​/ p>

这听起来像是一个合理的解决方案吗?其他人如何实施相同类型的系统?

4 个答案:

答案 0 :(得分:5)

存储下采样数据是非常好的方法。 看看munin如何存储它的图表 - 每天,mounthly,早期和日内图表分别存储在那里。

您可以将每分钟,每5分钟,每小时,每4小时,每天的数据存储在不同的表格中。由于您不传输您不需要的东西,因此只需存储每一分钟并获得许多好处,因此开销很少。

答案 1 :(得分:2)

加速数据库,使用直接组织模型。这是从文件存储/检索数据的最快方法。实现非常简单,您不需要任何框架或库。

方法是:

  1. 你必须创建一个algorhytm,它将密钥转换为连续的记录数(0..max。记录数),
  2. 你必须使用固定记录大小,
  3. 数据存储在平面文件中,其中记录在文件中的位置是rec。没有。 (基于密钥,如1.中所述)乘以记录大小(见2.)。
  4. 原生数据

    您可以每天创建一个数据文件,以便于维护。然后你的关键是没有。当天的样本。因此,您的每日文件将为18000 * 24 * 记录大小。您应该使用0预先创建该文件,以使操作系统的生活更轻松(可能它没有多大帮助,它取决于底层文件系统/缓存机制)。

    因此,当数据到达时,计算文件位置,并将记录插入其位置。

    汇总数据

    您也应该将汇总数据存储在直接文件中。这些文件会小得多。如果是1分钟的汇总值,则会有24 * 60 * 60条记录。

    你需要做出一些决定:

    • 缩放的步进,
    • 汇总数据的步进(不确定是否值得收集每个缩放步进的汇总数据),
    • 汇总数据库的组织(本机数据可以存储在每日文件中,但每日数据应存储在月度文件中)。

    另一件事是考虑,汇总数据的创建时间。虽然应该在数据到达时存储本机数据,但可以随时计算汇总数据:

    • 当本机数据到达时(在这种情况下,1-s数据更新300次,这对于立即写入磁盘不是最佳的,求和应该在内存中完成);
    • 后台作业应定期处理本机数据,
    • 和数据应按照懒惰的方式按需创建。

    不要忘记,不是多年前这些问题是 数据库设计问题。我可以保证一件事:它会比任何东西都快,速度快(除了使用内存来存储数据)。

答案 2 :(得分:1)

前段时间我实现了这一点,对某些图表进行了下采样。缺点是较旧的松散分辨率,但我相信这对你来说是可以接受的。如果您对峰值感兴趣,可以提供最大值,平均值和最小值。

算法也不太难。如果你每秒有5个样本,并希望保持这个粒度可能持续一个小时,你必须在这个小时内存储5 * 60 * 60 = 18000个样本。

当天你可以每5秒减少1个样本,将数量减少25倍。然后算法每5秒运行一次,并计算5秒的中位数,最小值和最大值。几小时前。结果是每天12 * 60 * 23 = 16560个样本,如果存储

再往后我推荐每分钟一次样品,将量减少12个,可能两周,所以你有两个星期数据的60 * 24 * 13 = 18720个样品。

应特别考虑将数据存储在DB中。要获得最大性能,您应确保将一个传感器的数据存储在数据库中的一个块中。如果您使用例如PostgreSQL,你知道一个块的长度是8192个字节,并且在一个块中没有存储两个记录。假设一个样本的长度为4个字节,并且考虑到每行的开销,我可以在一个块中添加2048减去几个样本。鉴于最高分辨率,这是2040/5/60 = 6分钟的数据。现在总是可以一次添加6分钟,这可能只需要5个就可以在后来的几分钟内更新,因此查询可以更快地获取单个传感器的块。

至少我会使用不同的表来表示不同的传感器粒度。

答案 3 :(得分:0)

有些日子以来,Amazon CloudWatch也允许您使用custom metrics。如果您主要关注监控和警报,这可能会有所帮助。