我需要存储每隔几分钟从超过10000个节点(可能会增加)生成的遥测数据,每个节点通过互联网将数据提供给服务器进行记录。我还需要从web应用程序中查询此数据。
我很难决定最好的存储解决方案是什么..
每个节点都有一个唯一的ID,并且每个变量包都有一个时间戳。(可能需要由服务器生成)。
遥测数据的所有变量都在同一个包中,因此从概念上讲,可以很容易地将其存储在单个数据库表中,每个变量具有一列。序列号+时间戳作为密钥就足够了。每个遥测数据包的大小为64字节,包括设备ID和时间戳。所以每年大约有100Gb+。
我希望能够查询数据以获取跨时间范围的变量,还可以存储这些数据的聚合报告,这样我就可以绘制图形。
现在,如何最好地处理这个问题呢?我非常熟悉MySQL的使用,所以我倾向于这样做。如果我使用MySQL,为每个设备ID设置一个单独的表是否有意义?-这是否会使查询速度更快,或者有1000个表会有问题吗?
我不认为一下子查询所有设备上的变量是必要的,但这可能是必要的。或者我应该把所有这些都放在一个表中,如果它真的变得很大,我应该使用MySQL集群?
或者有更好的解决方案?我一直在查看一些非关系数据库,但没有看到任何完全符合要求或看起来非常成熟的数据库。例如,与MySQL相比,MongoDB每行有相当多的大小开销,我不知道它在跨大时间范围查询单个变量的值时的效率如何。此外,MySQL已经存在了一段时间,并且很健壮。
我还希望复制数据和备份数据变得容易。
如果您有任何想法或做过类似的事情,我们将不胜感激!
发布于 2015-07-29 02:07:39
你看过time-series databases吗?它们是为您所描述的用例而设计的,并且由于内置的数据折叠和压缩,实际上可能会在空间需求方面更有效率。
我建议研究使用HBase或Cassandra进行原始存储的实现,因为它为您提供了经过验证的异步复制功能和吞吐量。
HBase时序数据库:
发布于 2012-05-10 06:29:54
如果你想使用MySQL,请记住,尽管当你在现代硬件上轻松地每年投入100 go的空间时,它仍然会继续运行,但要注意的是,之后(在活动系统上)不能执行模式更改。这意味着您必须从一开始就有一个良好的、完整的数据库模式。
我不知道这些遥测数据是否会增加更多功能,但如果是这样的话,如果需要添加列或索引,您就不必锁定数据库数小时。
然而,现在有一些工具,如http://www.percona.com/doc/percona-toolkit/pt-online-schema-change.html,可以使这种更改变得更容易一些。只要您继续使用InnoDB,这里就不会出现性能问题。
另一种选择可能是使用PostgreSQL,它允许您在线更改模式,有时在使用索引方面更聪明一些。(例如,http://kb.askmonty.org/en/index-condition-pushdown是MySQL/MariaDB的新技巧,它允许您在查询时组合两个索引。PostgreSQL在这方面已经做了很长时间。)
关于开销:您将以未打包的形式存储64字节的遥测数据,因此您的记录将在磁盘上占用超过64字节。任何类型的结构化存储都将受到此影响。
如果您使用SQL解决方案,则备份很容易:只需转储数据,然后可以将其恢复。
https://stackoverflow.com/questions/10524416
复制相似问题