Cassandra 卡桑德拉:在使用TWCS时,是否仍然需要手动扣扣?
我正要开始探索Cassandra(长期)保存时间序列(只写一次)数据,这可能会变得相当大 假设可能是最简单的时间序列:Cassandra 卡桑德拉:在使用TWCS时,是否仍然需要手动扣扣?,cassandra,partitioning,Cassandra,Partitioning,我正要开始探索Cassandra(长期)保存时间序列(只写一次)数据,这可能会变得相当大 假设可能是最简单的时间序列: CREATE TABLE raw_data ( sensor uuid, timestamp timestamp, value int, primary key(sensor, timestamp) ) WITH CLUSTERING ORDER BY (timestamp DESC) 为了确保分区不会增长太多,互联网上的许多帖子都建议使用bu
CREATE TABLE raw_data (
sensor uuid,
timestamp timestamp,
value int,
primary key(sensor, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC)
为了确保分区不会增长太多,互联网上的许多帖子都建议使用bucketing,例如介绍day或只是一个向上计数的bucket数字,如
primary key((sensor, day, bucket), timestamp)
。然而,这些策略需要手动管理,这似乎相当麻烦,尤其是对于未知数量的桶
但是,如果我说添加:
AND compaction = {
'class': 'TimeWindowCompactionStrategy',
'compaction_window_size': 1,
'compaction_window_unit': 'DAYS'
};
如前所述,例如:
TWCS旨在通过创建时间窗口的SSTABLE存储桶来简化DTC,这些SSTABLE存储桶使用大小分层压缩策略相互压缩
据我所知,这意味着Cassandra在内部使用TWCS时无论如何都会创建只读存储桶。因此,我想知道是否仍然需要手动实现bucketing键
day
?bucket的目的是阻止分区变得过大。如果没有bucket,分区的增长是无限的——也就是说,为特定传感器收集的数据越多,分区就越大,没有极限
仅更改压缩策略不会阻止分区的增长,因此您仍然需要存储桶
(您写了“Cassandra在内部使用TWCS时创建只读存储桶”。不要将其与“存储桶”列混淆。同一个词用于两个完全不同的事情。)
另一方面,如果要在数据上设置TTL,那么这将有效地限制分区的大小,因为比TTL旧的数据将(最终)从磁盘中删除。因此,如果TTL足够小,您将不再需要桶。在这个特定的场景中,按顺序收集时间序列数据和TTL,然后TWCS是最佳的压缩策略。处理桶列真的不太麻烦。最大的不便是,如果您想查询所有存储桶中最早或最新的时间戳,您实际上无法做到这一点。对于所有其他查询,只需对每个bucket执行一个查询(可以并行运行)并将结果缝合在一起。在Python中,使用itertools.chain是非常简单的。从_iterable()嗯,如果我说定义的动态bucket(取决于大小),只是不知道insight值是多少呢?我想我必须将桶数存储在另一个表中,才能查询所有桶数?