使用Cassandra版本3.11.4,我们将几天的“类似时间序列”数据导入到使用TimeWindowCompactionStrategy,小时内的compaction_window_unit和compaction_window_size为1的表创建的表中。
CREATE TABLE MYTABLE (
some_fields text,
(...)
AND compaction = {
'class' : 'TimeWindowCompactionStrategy',
'compaction_window_unit': 'HOURS',
'compaction_window_size': 1
};
由于这是从另一个数据库导入的历史数据,因此我们以这种方式更改了插入查询的时间戳:
INSERT INTO MYTABLE (...) USING TIMESTAMP [timestamp of the record] AND TTL ...
其中[记录的时间戳]是插入的每个时间序列记录的时间戳。
显然,此方法有效,因为已验证在org.apache.cassandra.db.compaction包上启用了TRACE级别的日志记录:
TRACE [CompactionExecutor:421] ...TimeWindowCompactionStrategy.java:252 - buckets {
1523124000000=[BigTableReader(path='.../md-487-big-Data.db')],
1523070000000=[BigTableReader(path='.../md-477-big-Data.db')],
1523109600000=[BigTableReader(path='.../md-530-big-Data.db')],
1523134800000=[BigTableReader(path='.../md-542-big-Data.db')] },
max timestamp 1523134800000
在这里我们发现了几个“一小时”大的水桶。
当我们在每个cassandra节点上运行 nodetool compact 时,问题就来了。
我们期望的是为每个“一个小时的时段”获得一个稳定值。 我们得到的是一个巨大的sstable(每个节点),所有行都合并了!
这是假想的行为吗?我们在做错什么吗?
答案 0 :(得分:1)
这是预期的行为。您可以使节点脱机并将sstable拆分为X,或者等待所有TTL过期,然后观察单个大sstable进行清理。请记住要使用STWS关闭对表的修复,否则,事情可能会变得混乱。我了解到这很困难。否则,这是一个很好的时间序列数据压缩策略。