当需要*快速顺序读取*时,Cassandra中时间序列的最佳数据模型是什么?

时间:2015-09-08 21:13:17

标签: cassandra time-series

我想将流媒体财务数据存储到Cassandra并快速阅读。我将拥有多达20000个乐器("代码和#34;),每个乐器包含多达300万个1分钟的数据点。我必须能够尽可能快地读取这些系列中的每一个的大范围(事实上,这是我移动到柱状数据库的原因,因为MongoDB在这个用例上令人窒息)。有时我必须阅读整个系列。有时我会先需要更少但通常是最新的数据。我也希望保持简单。

我在Datastax tutorial中选择的这个模型最有效吗?不是每个人似乎都同意。

CREATE TABLE minutedata (
  ticker text,
  time timestamp,
  value float,
  PRIMARY KEY (ticker, time))
WITH CLUSTERING ORDER BY (time DESC);

我喜欢这个,因为有多达20 000个代码,所以分区应该是高效的,并且连续只有300万分钟,Cassandra可以处理多达20亿分钟。此外,按时间降序,我在查询时使用限制时获取最新数据。

然而,Robbie Strickland的书Cassandra High Availability提到上面是反模式(使用传感器数据类比),我引用他引用的问题来自第144页:

  • 将无限期地收集给定传感器的数据,其中包括许多 非常高频率的案件
  • 使用sensorID作为分区键,行将增加2 每个阅读的列(一个标记和一个阅读)。

我理解第一点是一个问题,但由于300万个数据点限制,它不在我的情况下。但第2点很有趣。什么是这些"标记"每次阅读之间?我显然想避免任何破坏连续数据存储的事情。

如果第2点是个问题,那么对时间序列进行建模的更好方法是什么,以便能够快速有效地在大范围内读取?我不是特别热衷于将时间序列分成较小的子时段。

1 个答案:

答案 0 :(得分:1)

如果您的查询模式是使用范围查询为代码查找器找到几行,那么我会说在一个分区中为自动收录器提供所有数据将是一个很好的方法,因为Cassandra已经过优化以有效地访问分区。 / p>

但是如果一切都在一个分区中,那么这意味着查询只在一个节点上发生。既然你说你经常想要读取大范围的行,那么你可能想要更多的并行性。

如果您将多个节点上的相同数据拆分并并行读取,则可能会获得更好的性能。例如,如果按照自动收报机和年份对数据进行分区,并且您有10个节点,理论上可以发出10个异步查询,并且每年都会并行查询。

现在有300万行很多,但实际上并不是那么,所以你可能不得不进行一些测试,看看哪种方法实际上对你的情况更快。

如果您所做的不仅仅是检索所有这些行并且正在对它们进行某种分析,那么并行性将变得更具吸引力,您可能希望研究将Cassandra与Spark配对以便数据和读取在许多节点上并行处理。