我目前正在开发一个项目,要求我们存储大量的时间序列数据,但更重要的是,快速检索大量数据。
将有N个设备(> 10,000)定期向系统发送数据,假设每5秒钟一次。这些数据会很快建立,但我们通常只对最新数据感兴趣,并希望压缩旧数据。我们不想删除它,因为它仍然有用,但不是每天有数千个数据点,我们可能在N天/周/月过后只保存5或10。
具体来说,我们希望能够在很长一段时间内(例如一年或两年)获取采样数据。这里可能有数百万个点,但我们只想要一个小的,线性分布的数据样本。
今天我们正在尝试使用Influxdb,它最初似乎是一个很好的解决方案。它足够快,并允许我们以合理的结构存储我们的数据,但我们发现它并不完全令人满意。我们无法执行上述示例查询,并且通常系统对我们来说感觉不够成熟。
非常感谢任何有关我们如何进行或替代解决方案的建议。
答案 0 :(得分:2)
您可能有兴趣查看TimescaleDB:
https://github.com/timescale/timescaledb
它在Postgres之上构建了一个时间序列数据库,因此提供了完整的SQL支持,以及Postgres生态系统/可靠性。这可以为您提供更大的查询灵活性,这听起来像您想要的。
就您的具体用例而言,确实有两种解决方案。
首先,人们通常会做的是创建两个“超文本”,一个用于原始数据,另一个用于采样数据。这些超级用户看起来像是用户的标准表,尽管在封面下进行了大量分区,以获得更好的可扩展性(例如,对于大型表大小,为20x插入吞吐量与postgres相比)。
然后,您基本上从原始表格到采样表格进行汇总,并对每个表格使用不同的数据保留策略(因此您将原始数据保留为1个月,并将采样数据保存多年)。
http://docs.timescale.com/getting-started/setup/starting-from-scratch http://docs.timescale.com/api/data-retention
其次,您可以使用单个超文本,然后只安排一个普通的SQL查询来从比特定时间段更早的数据中删除单个行。
我们甚至可能在将来为后一种方法添加更好的一流支持,如果它成为一个通用的请求功能,尽管我们迄今遇到的大多数用例似乎更侧重于#1,尤其是。为了保留有关被删除数据点的统计数据,而不是直接样本。
(免责声明:我是TimescaleDB的作者之一。)