我需要存储每隔几分钟从超过10000个节点(可能会增加)生成的遥测数据,每个节点通过互联网将数据提供给服务器进行记录。我还需要从Web应用程序中查询此数据。
我在确定最佳存储解决方案方面遇到了一些麻烦。
每个节点都有一个唯一的ID,每个变量包都有一个时间戳。 (可能需要由服务器生成)。
遥测数据具有相同数据包中的所有变量,因此从概念上讲,它可以轻松地存储在单个数据库表中,每个变量都有一列。序列号+时间戳就足够了。 每个遥测数据包的大小为64字节,包括设备ID和时间戳。所以每年约100Gb +。
我希望能够查询数据以获取跨时间范围的变量,并且还存储此数据的汇总报告,以便我可以绘制图形。
现在,如何最好地处理这个问题?我对使用MySQL非常熟悉,所以我倾向于这个。如果我要使用MySQL,那么为每个设备ID设置一个单独的表是否合理? - 这会使查询更快,还是会有10000个表成为问题?
我认为不需要一次性查询所有设备中的变量,但可能会这样。或者我应该把它全部放在一个表中并使用MySQL集群,如果它真的很大?
或者有更好的解决方案吗?我一直在寻找一些非关系型数据库,但看不到任何完全适合该法案或看起来非常成熟的东西。例如,MongoDB每行会有相当多的大小开销,我不知道与MySQL相比,在大的时间范围内查询单个变量的值会有多高效。 MySQL已经存在了一段时间并且非常强大。
我也希望能够轻松复制数据并进行备份。
任何想法或者如果有人做了类似的任何你输入的内容将非常感谢!
答案 0 :(得分:2)
如果您想使用MySQL,请记住,虽然它会在现代硬件上轻松地每年投放100GB的东西时继续使用,但请注意,之后您无法执行架构更改(在现场系统)。这意味着您必须拥有一个良好,完整的数据库架构。
我不知道这个遥测数据是否可能会增加更多功能,但如果需要,您可能不希望在需要添加列或索引时将数据库锁定数小时。
但是,现在有一些工具如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解决方案,备份很简单:只需转储数据,然后您就可以恢复它。
答案 1 :(得分:2)
你看过time-series databases了吗?它们是针对您正在描述的用例而设计的,并且由于内置数据折叠和压缩,实际上可能最终在空间要求方面更高效。
我建议您查看使用HBase或Cassandra实现原始存储的实现,因为它为您提供经过验证的异步复制功能和吞吐量。
HBase时间序列数据库:
Axibase Time-Series Database - 我的所属机构