当措施可以“及时”时,卡桑德拉的时间序列

时间:2014-03-28 12:10:24

标签: time cassandra cql series

这与cassandra time series modeling when time can go backward有关,但我认为我有更好的方案来解释为什么这个主题很重要。

想象一下,我有一个简单的表

CREATE TABLE measures(
 key text,
 measure_time timestamp,
 value int, 
 PRIMARY KEY (key, measure_time))
 WITH CLUSTERING ORDER BY (measure_time DESC);

群集密钥的目的是使数据按递减的时间戳排序排列。这导致非常有效的基于范围的查询,对于给定的密钥,导致顺序磁盘读取(本质上是快速的)。

我多次看到过使用生成的timeuuid作为时间戳值的建议(使用now()),这显然是本质上有序的。但你无法做到这一点。在我看来,这是一种非常常见的模式,如果符合以下条件,您就无法使用它:

1)您的用户想要查询采取措施的实际时间,而不是措施的时间。

2)你使用多个写作线程

所以,我想了解如果以无序的方式写入数据会发生什么(关于measure_time列)。

我亲自测试过,如果我插入时间戳无序值,Cassandra确实会在我运行select时按时间戳顺序向我报告。

但是会发生什么"引擎盖下#34;?在我看来,数据仍然无法在磁盘上订购。事实上,在某些时候需要在磁盘上刷新数据。想象一下,您在时间范围[0,10]中刷新数据集。如果下一个要刷新的数据集具有时间戳= 9的度量,该怎么办?数据是否重新安排在磁盘上?费用是多少?

希望我很清楚,我无法在Datastax网站上找到任何解释,但我承认我在Cassandra上相当新手。任何指针赞赏

1 个答案:

答案 0 :(得分:1)

当然,一旦编写了SSTable文件是不可变的,你的timestamp = 9将以另一个SSTable结束,如果你要求timestamp = 10和timestamp =,C *将必须合并和排序来自两个SSTable的数据。 9。这比从单个SSTable读取效果要差。

压缩过程可以将这两个SSTable合并为新的单个SSTable。见http://www.datastax.com/dev/blog/when-to-use-leveled-compaction

并尝试避免非常宽的行/分区,如果您对单个measure_time进行了大量测量(即大量key值),则会出现这种情况。