使用Cassandra版本3.11.4我们在使用TimeWindowCompactionsgy创建的表中导入了几天的'Time序列,例如'时间序列',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
};
由于这是从另一个DB导入的历史数据,因此我们以这种方式更改了插入查询的时间戳:
INSERT INTO MYTABLE (...) USING TIMESTAMP [timestamp of the record] AND TTL ...
其中[记录的时间戳]是插入每个时间序列记录的时间戳。
显然,此方法有效,随着已验证的启用跟踪级别登录在org.apache.cassandra.db.com.paction包:
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
我们发现了几个桶"一小时"大。
当我们运行 Nodetool Compact 时,问题出现在每个Cassandra节点上。
我们期望为每个"一个小时"获得一个单一的sstable。我们得到的是一个巨大的(每个节点(,所有行合并了!
这是假定的行为吗?我们做错了吗?
这是预期的行为。您可以将节点离线放在X中,然后将所有TTL分开,然后等待所有TTL到期,然后观察单个大型Sstable被清理。请记住要用STW上的桌子上的维修,否则情况可能会变得凌乱。我了解到这是艰难的方式。否则,这是时间序列数据的绝佳压实策略。