我有一个项目,物理传感器将数据发送到服务器。数据不定期发送 - 在某些东西激活传感器之后,但不低于每 20 分钟一次。在服务器上,数据存储在 Posgresql 数据库中。
数据结构如下:
Sensor Table
sensor name - string
sensor serial no - string
sensor type - foreign key to types table
Sensor Data Table
sensor - foreign key
timestamp
value 1 - boolean
value 2 - boolean
value 3 - integer
value 4 - float
...
预计总共不超过 100 个请求/秒。数据库中的数据记录应该保留 90 天,在某些情况下甚至更长(不仅仅是我之前想的 2 周)。因此,记录的总数不会超过 120 960 000/14 天。这是“安全”的估计。实际上,它可能会少 10 倍(10 个请求/秒,12 960 000 条记录)。
我需要对数据进行一些分析,例如:
- 当新记录出现并且“值 2”为真时做某事
- 当传感器 X 的“值 2”为真的时间超过某个声明的时间(50 分钟、1 小时或更长时间)时,做一些事情
- 当传感器 X 在 24 小时内“值 2”的总真实时间超过某个声明的时间时执行某些操作
- 当传感器 X 的“值 3”为真的时间超过某个声明的时间并且在此期间没有其他 XYZ 类型的传感器处于活动状态时,请执行某些操作...
上面的“声明时间”大于等于1秒。
整个服务器部分是在 Django 中开发的(和 django-rest-framework 来收集数据)。
问题是如何有效地进行此类数据分析,假设应该对数据和时间段进行实时或接近实时(1 秒)的监控以触发所需的操作。
我的想法:
运行一个进程,每秒查询数据库以查找符合条件的记录并调用特定操作(可能需要超过 1 秒)
为每种分析类型运行一些单独的进程(eventlet?),然后每 1 秒查询一次数据库并触发特定操作。
每个传感器运行一个进程,持续向其订阅者报告:我在“值 2”上的正确时间超过 x 秒等。在该传感器的新数据到达后,进程被重置。像 zeromq 这样的发布-订阅解决方案可能会在这里使用吗?
使用其他/更快的解决方案
- Mongodb - 问题可能是删除数据后(2 周)mongodb 的文件没有被压缩。
- Hadoop——对于这类问题来说是不是太大太复杂了?
- Pandas 和一些 HDF5 存储 - 问题可能在于它是否能够进行我上面描述的分析,并且可能还能够写入文件。但是..也可以与 mongo 一起使用。
提示?
更新。
目前对我来说似乎简单有效的解决方案是:
- 数据到达传感器 A 后,运行所有测试并
- 以如下方式将测试结果存储在一些“测试”表(或 redis)中:
- 今天下午 1:15 运行动作“传感器打开时间超过”
- 今天下午 1:30 运行动作“传感器打开时间超过 24 小时”...
- 连续扫描上面的“测试”表,当它是今天下午 1:15 时,然后运行所需的操作,等等。
- 当传感器 A 收到新信号时,再次运行所有测试,并重置“测试”表中的数据。
这将要求我在每次请求到达特定传感器时触发测试,但另一方面,我必须每 1 秒扫描一次“测试”表。
更新 2
我发现了 PyTables ( http://www.pytables.org/moin/PyTables ),看起来它非常适合我作为数据存储的用例。