这与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上相当新手。任何指针赞赏
答案 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
值),则会出现这种情况。