有效存储传感器数据

kec*_*ito 8 mysql scalability

我正在考虑重新开发一个存储和可视化传感器数据的应用程序。该应用程序可由多个用户访问,并且他们可以添加无限的传感器。我们现在有 10 个用户,大约有 1000 个传感器。用户数量可能不会改变。如果有足够的电力(太阳能电池板),传感器每 5 秒发送一次数据。

现在数据存储在4个表中。

  • 用户 [ID、电子邮件、密码等]
  • 设备 [id、名称、user_id] user_id:外键
  • 传感器 [id、device_id、类型] device_id:外键
  • 数据[id,sensor_id,时间,数据]sensor_id:外键

问题是数据表变得非常大。目标是将数据保留近一年。我使用 MySQL,但对其性能感到非常失望。现在我正在使用 Flask 和 Gunicorn,并使用 RabbitMQ 对存储过程进行排队。我可以改变什么来提高现有系统的性能吗?如果你从头开始做这件事你会做出什么改变?NoSQL 在这种情况下会带来很大的改变吗?我要求太多了,但这是我第一次遇到这样的问题。

Mar*_*val 4

  1. 由于您有 1k 个传感器,每个传感器每 5 秒生成一次数据,在我看来,这是一个很好的例子,可以使用Akka这样的框架来处理许多请求并避免许多线程问题

  2. 一旦您的处理阶段看起来已得到优化,您就正确地描述了 NoSQL。评论中的人提到缺少索引,但由于您只有一个表,这可能会导致insert您的每个表都会触发所有数据的索引重新计算。这可能会降低应用程序的吞吐量。

    您有很多选择来解决这个问题。将表划分到最后包含最新数据或使用两个表,一个用于读取和查询,第二个用于写入以及从第二个到第一个的批量插入 - 使用截止索引这绝对是快速的。有一个众所周知的问题,您可以优化存储以进行大量读取或大量写入,但不能同时进行两者。

    或者你可以看看NoSQL,特别是我想到的Redis,看看他们的数据类型http://redis.io/topics/data-types-intro

    Redis 本质上支持长列表。由于它不支持任何查询,因此SELECT ... FROM ... WHERE ...您必须提供自己的索引缓存才能提供所需的查询。如果您对如何使用 key:value 存储感兴趣,只需查看他们的Twitter演示即可。Twitter 必须像您一样解决同样的问题。

这引出了我的最后一点。如果你想提供更好的可扩展性并且不知道如何做,只需看看 facebook、twitter 或 netflix 架构即可。