当需要*快速顺序读取*时,Cassandra 中时间序列的最佳数据模型是什么
What is the best data model for timeseries in Cassandra when *fast sequential reads* are required
我想将流式财务数据存储到 Cassandra 中并快速读回。我将拥有多达 20000 个仪器 ("tickers"),每个仪器包含多达 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 点很有趣。每次阅读之间这些 "markers" 是什么?我显然想避免任何破坏连续数据存储的事情。
如果第 2 点有问题,那么什么是更好的时间序列建模方法,以便可以在大范围内快速有效地读取它们?我不是特别热衷于将时间序列分成更小的子周期。
如果您的查询模式是使用范围查询为代码查找几行,那么我会说将代码的所有数据放在一个分区中将是一种很好的方法,因为 Cassandra 经过优化可以有效地访问分区.
但是如果所有内容都在一个分区中,那么这意味着查询只在一个节点上发生。既然你说你经常想要读取大范围的行,那么你可能需要更多的并行性。
如果将相同的数据拆分到多个节点并并行读取,您可能可以获得更好的性能。例如,如果您按代码和年份对数据进行分区,并且您有十个节点,那么理论上您可以发出十个异步查询,并且每年都并行查询。
现在 300 万行很多,但还没有 大,所以您可能需要 运行 一些测试才能确定哪种方法实际上更快适合你的情况。
如果您所做的不仅仅是检索所有这些行并对它们进行某种分析,那么并行性将变得更有吸引力,您可能需要考虑将 Cassandra 与 Spark 配对,以便数据和在多个节点上并行读取和处理。
我想将流式财务数据存储到 Cassandra 中并快速读回。我将拥有多达 20000 个仪器 ("tickers"),每个仪器包含多达 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 点很有趣。每次阅读之间这些 "markers" 是什么?我显然想避免任何破坏连续数据存储的事情。
如果第 2 点有问题,那么什么是更好的时间序列建模方法,以便可以在大范围内快速有效地读取它们?我不是特别热衷于将时间序列分成更小的子周期。
如果您的查询模式是使用范围查询为代码查找几行,那么我会说将代码的所有数据放在一个分区中将是一种很好的方法,因为 Cassandra 经过优化可以有效地访问分区.
但是如果所有内容都在一个分区中,那么这意味着查询只在一个节点上发生。既然你说你经常想要读取大范围的行,那么你可能需要更多的并行性。
如果将相同的数据拆分到多个节点并并行读取,您可能可以获得更好的性能。例如,如果您按代码和年份对数据进行分区,并且您有十个节点,那么理论上您可以发出十个异步查询,并且每年都并行查询。
现在 300 万行很多,但还没有 大,所以您可能需要 运行 一些测试才能确定哪种方法实际上更快适合你的情况。
如果您所做的不仅仅是检索所有这些行并对它们进行某种分析,那么并行性将变得更有吸引力,您可能需要考虑将 Cassandra 与 Spark 配对,以便数据和在多个节点上并行读取和处理。