6

我们正在构建一个最终将由数千个测量站组成的测量系统。每个站点将在其生命周期内保存大约 5 亿次测量值,其中包括 30 个标量值。这些将是浮点值。我们现在想知道如何在每个站点上保存这些数据,考虑到我们将在每个站点上构建一个 Web 应用程序,这样

  • 我们希望在多个时间尺度上可视化数据(例如一周、一个月、一年的测量)
  • 我们需要在数据上建立移动平均线(例如一个月的平均值以显示在一年图中)
  • 数据库需要抗崩溃(断电)
  • 我们只进行写入和读取,没有更新或删除数据

此外,我们还想要一台可以显示例如 1000 个测量站的数据的服务器。这将是 5000 亿次测量中约 50TB 的数据。要将数据从测量站传输到服务器,我认为某种类型的数据库级复制将是一种干净有效的方式。

现在我想知道对于这些目的,noSQL 解决方案是否可能比 mySQL 更好。特别是couchDBCassandra和Redis之类的键值存储对我来说很有吸引力。您认为哪一个最适合“测量时间序列”数据模型?碰撞安全和从测量站到主服务器的复制等其他优势呢?

4

3 回答 3

3

我认为 CouchDB 是一个很棒的数据库——但它处理大数据的能力值得怀疑。CouchDB 的主要关注点是开发和离线复制的简单性,而不一定是性能或可伸缩性。CouchDB 本身不支持分区,因此除非您使用 BigCouch 或发明自己的分区方案,否则您将受到最大节点大小的限制。

别傻了,Redis 是一个内存数据库。它在将数据输入和输出 RAM 方面非常快速和高效。它确实具有使用磁盘进行存储的能力,但它并不是非常擅长。这对于频繁更改的有限数量的数据非常有用。Redis 确实具有复制功能,但没有任何对分区的内置支持,因此,您将在此处独自一人。

您还提到了 Cassandra,我认为它更适合您的用例。Cassandra 非常适合无限增长的数据库,本质上是它的原始用例。分区和可用性是内置的,因此您不必担心太多。数据模型也比一般的键/值存储更灵活一些,增加了第二维列,实际上每行可以容纳数百万列。例如,这允许将时间序列数据“存储”到涵盖时间范围的行中。整个集群的数据分布(分区)是在行级别完成的,因此只需要一个节点来执行一行内的操作。

Hadoop 直接插入 Cassandra,为 MapReduce、Pig 和 Hive 提供“本地驱动程序”,因此它可以潜在地用于聚合收集的数据并实现运行平均值。最佳实践是围绕查询塑造数据,因此可能希望以“非规范化”形式存储数据的多个副本,每种类型的查询一个。

查看这篇关于在 Cassandra 中进行时间序列的帖子:

http://rubyscale.com/2011/basic-time-series-with-cassandra/

于 2011-11-03T23:05:45.380 回答
2

对于这种性质的高度结构化数据(浮点向量的时间序列),我倾向于回避数据库。数据库的大部分功能都不是很有趣。您基本上对原子性或事务语义之类的东西不感兴趣。唯一需要的功能对崩溃的恢复能力。但是,当您不需要撤消写入(无需更新/删除)时,该功能很容易实现,只需附加到文件即可。崩溃恢复很简单;打开文件名中序列号递增的新文件。

对此的逻辑格式是普通的 csv。每次测量后,调用flush()底层证券file。将数据复制回中央服务器是rsync(1). 然后,您可以在您选择的分析工具中导入数据。

于 2011-11-03T23:26:00.567 回答
0

我个人会回避“csv”和“plaintext”文件。当您的容量较小并且想要跳过工具以快速查看数据或对数据进行小幅更改时,这些功能非常方便。

当您谈论“50Tb”的数据时,这是相当多的。如果一个简单的技巧将其减少两倍,那将收回存储成本和带宽费用。

如果测量是定期进行的,这意味着您无需保存每次测量的时间戳,而是存储开始时间和间隔并仅存储测量值。

我会选择一种文件格式,它有一个小标题,然后只有一堆浮点测量值。为防止文件变得非常大,请确定最大文件大小。如果您在开始使用文件之前通过完全写入来初始化文件,则在您开始使用它时它将完全分配在磁盘上。现在您可以映射文件并更改数据。如果在更改数据时断电,它要么将其写入磁盘,要么不写入。

于 2013-04-23T11:01:24.020 回答