Scylla/Cassandra: 没有TTL的时序数据的compaction策略
Scylla/Cassandra: compaction strategy for time series data without TTL
我们实际上使用的是 scylla,但我仍然在标题中包含了“cassandra”,因为问题也应该与之相关。
我们有一个没有 TTL 的 time-series 工作负载(数据永不过期)。对于上下文,table 架构大致如下所示:
CREATE TABLE events (
entity INT,
time_partition TIMESTAMP,
event_time TIMESTAMP,
a TEXT,
b TEXT,
c TEXT,
PRIMARY KEY((entity, time_partition), event_time)
);
其中 time_partition
与 event_time
相同,但始终被截断为一个小时,因此同一 entity
和同一小时内的事件将转到同一分区。
我正在考虑我们应该使用什么压缩策略。起初我认为我们应该使用 TimeWindowCompactionStrategy
(TWCS):如果时间 window 是 1 天,它基本上意味着我们将有 per-day sstables ,这对我来说很有意义;但后来我发现各种文档都说 TWCS 不适合 never-expiring 数据。例如。 this doc on datastax.com 说:
not appropriate for data without a TTL workload, as storage will grow without bound.
尽管存储确实会“无限制地”增长,因为我们永远不想删除旧数据,但其他任何策略不都一样吗?如果我们从不删除数据,则意味着它会不断增长。这只是我们如何组织这个 ever-growing 数据集的问题,我不确定为什么 TWCS 不适合。
大量文件是个问题吗?例如。如果我们将 window 设为 1 天,那么对于 10 年的数据而言,它将大约有 3650 个文件。
如有任何建议,我们将不胜感激。
在 Scylla 的情况下,您将拥有更多文件,因为每个分片(核心)处理自己的压缩。但是,即使在 10 年内,您也可以拥有 36k 个文件,这对 Scylla 来说不是问题。
我们实际上使用的是 scylla,但我仍然在标题中包含了“cassandra”,因为问题也应该与之相关。
我们有一个没有 TTL 的 time-series 工作负载(数据永不过期)。对于上下文,table 架构大致如下所示:
CREATE TABLE events (
entity INT,
time_partition TIMESTAMP,
event_time TIMESTAMP,
a TEXT,
b TEXT,
c TEXT,
PRIMARY KEY((entity, time_partition), event_time)
);
其中 time_partition
与 event_time
相同,但始终被截断为一个小时,因此同一 entity
和同一小时内的事件将转到同一分区。
我正在考虑我们应该使用什么压缩策略。起初我认为我们应该使用 TimeWindowCompactionStrategy
(TWCS):如果时间 window 是 1 天,它基本上意味着我们将有 per-day sstables ,这对我来说很有意义;但后来我发现各种文档都说 TWCS 不适合 never-expiring 数据。例如。 this doc on datastax.com 说:
not appropriate for data without a TTL workload, as storage will grow without bound.
尽管存储确实会“无限制地”增长,因为我们永远不想删除旧数据,但其他任何策略不都一样吗?如果我们从不删除数据,则意味着它会不断增长。这只是我们如何组织这个 ever-growing 数据集的问题,我不确定为什么 TWCS 不适合。 大量文件是个问题吗?例如。如果我们将 window 设为 1 天,那么对于 10 年的数据而言,它将大约有 3650 个文件。
如有任何建议,我们将不胜感激。
在 Scylla 的情况下,您将拥有更多文件,因为每个分片(核心)处理自己的压缩。但是,即使在 10 年内,您也可以拥有 36k 个文件,这对 Scylla 来说不是问题。