7

我需要存储每隔几分钟从超过 10000 个节点(可能会增加)生成的遥测数据,每个节点都通过 Internet 将数据提供给服务器进行日志记录。我还需要从 Web 应用程序中查询这些数据。

我在决定什么是最好的存储解决方案时遇到了一些麻烦。

每个节点都有一个唯一的ID,每个变量包都会有一个时间戳。(可能需要由服务器生成)。

遥测数据在同一个数据包中包含所有变量,因此从概念上讲,它可以很容易地存储在单个数据库表中,每个变量有一列。序列号 + 时间戳足以作为密钥。每个遥测数据包的大小为 64 字节,包括设备 ID 和时间戳。所以每年大约 100Gb+。

我希望能够查询数据以获取跨时间范围的变量,并存储这些数据的汇总报告,以便我可以绘制图表。

现在,如何最好地处理这个问题?我对使用 MySQL 非常熟悉,所以我倾向于这个。如果我要使用 MySQL,为每个设备 ID 设置一个单独的表是否有意义?- 这会使查询更快还是拥有 10000 个表会成为问题?

我认为不需要一次性从所有设备中查询变量,但可能需要。或者如果它变得非常大,我应该把它全部放在一个表中并使用 MySQL 集群吗?

还是有更好的解决方案?我一直在寻找一些非关系数据库,但看不到任何完全符合要求或看起来非常成熟的东西。例如,MongoDB 每行会有相当多的大小开销,与 MySQL 相比,我不知道在大时间范围内查询单个变量的值的效率如何。MySQL也已经存在了一段时间并且很健壮。

我还希望它能够轻松复制数据并进行备份。

任何想法或如果有人做过类似的事情,您将不胜感激!

4

2 回答 2

5

你看过时间序列数据库吗?它们专为您所描述的用例而设计,并且由于内置数据折叠和压缩,实际上可能最终在空间要求方面更加高效。

我建议研究使用 HBase 或 Cassandra 进行原始存储的实现,因为它为您提供了经过验证的异步复制功能和吞吐量。

HBase 时间序列数据库:

于 2015-07-28T18:07:39.273 回答
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 解决方案,备份很容易:只需转储数据,然后您就可以恢复它。

于 2012-05-09T22:29:53.650 回答