Cassandra:应用 TWCS 时还需要手动分桶吗?

Cassandra: Is manual bucketing still needed when applying TWCS?

我正要开始探索 Cassandra 以(长期)保存时间序列(只写一次)数据,这些数据可能会变得非常大。

假设最简单的时间序列:

CREATE TABLE raw_data (
    sensor uuid,
    timestamp timestamp,
    value int,
    primary key(sensor, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC)

为了确保分区不会增长太多,互联网上的许多帖子都推荐分桶,例如介绍一天或只是一个向上计数的桶号,如

primary key((sensor, day, bucket), timestamp)

。然而,这些策略需要手动管理,这看起来很麻烦,尤其是对于未知数量的桶。

但是,如果我说添加:

  AND compaction = {
     'class': 'TimeWindowCompactionStrategy', 
     'compaction_window_size': 1, 
     'compaction_window_unit': 'DAYS'
  };

如前所述在 https://thelastpickle.com/blog/2016/12/08/TWCS-part1.html:

TWCS aims at simplifying DTCS by creating time windowed buckets of SSTables that are compacted with each other using the Size Tiered Compaction Strategy.

据我了解,这意味着 Cassandra 在内部使用 TWCS 时无论如何都会创建只读存储桶。因此,我想知道是否还需要手动实现分桶键 day?

存储桶的目的是阻止分区变得过大。没有桶,分区的增长是无限的——也就是说,你为特定传感器收集的数据越多,分区就越大,没有最终限制。

单独更改压缩策略不会停止分区的增长,因此您仍然需要存储桶。

(您写了 "Cassandra when using TWCS internally creates readonly buckets"。不要将它与 'bucket' 列混淆。同一个词用于两个完全不同的事物。)

另一方面,如果您要为数据设置 TTL,那么这将有效地限制分区的大小,因为早于 TTL 的数据将(最终)从磁盘中删除。因此,如果 TTL 足够小,您将不再需要存储桶。在这种特殊情况下 - 按顺序收集时间序列数据和 TTL - 然后 TWCS 是最佳压缩策略。