我在Cassandra 3.11上创建了下表,用于使用TimeWindowCompactionStrategy存储指标:
CREATE TABLE metrics.my_test (
metric_name text,
metric_week text,
metric_time timestamp,
tags map<text, text>,
value double,
PRIMARY KEY ((metric_name, metric_week), metric_time)
) WITH CLUSTERING ORDER BY (metric_time DESC)
AND compaction = {'class': 'org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy', 'compaction_window_size': '1', 'compaction_window_unit': 'MINUTES'}
AND default_time_to_live = 7776000
AND gc_grace_seconds = 60;
在blog post on TLP about TWCS之后,我想到我将能够发出压缩,并且同一个存储桶(1分钟窗口)中的任何SSTable都不会被压缩在一起。然而,似乎好像这不是真的,所有东西都被压缩在一起。在压缩之前:
# for f in *Data.db; do ls -l $f && java -jar /root/sstable-tools-3.11.0-alpha11.jar describe $f | grep timestamp; done
-rw-r--r-- 1 cassandra cassandra 1431 Mar 22 17:29 mc-10-big-Data.db
Minimum timestamp: 1521739701309280 (03/22/2018 17:28:21)
Maximum timestamp: 1521739777814859 (03/22/2018 17:29:37)
-rw-r--r-- 1 cassandra cassandra 619 Mar 22 17:30 mc-11-big-Data.db
Minimum timestamp: 1521739787241285 (03/22/2018 17:29:47)
Maximum timestamp: 1521739810545148 (03/22/2018 17:30:10)
-rw-r--r-- 1 cassandra cassandra 654 Mar 22 17:20 mc-1-big-Data.db
Minimum timestamp: 1521739189529560 (03/22/2018 17:19:49)
Maximum timestamp: 1521739216248636 (03/22/2018 17:20:16)
-rw-r--r-- 1 cassandra cassandra 1154 Mar 22 17:21 mc-2-big-Data.db
Minimum timestamp: 1521739217033715 (03/22/2018 17:20:17)
Maximum timestamp: 1521739277579629 (03/22/2018 17:21:17)
-rw-r--r-- 1 cassandra cassandra 855 Mar 22 17:22 mc-3-big-Data.db
Minimum timestamp: 1521739283859916 (03/22/2018 17:21:23)
Maximum timestamp: 1521739326037634 (03/22/2018 17:22:06)
-rw-r--r-- 1 cassandra cassandra 1047 Mar 22 17:23 mc-4-big-Data.db
Minimum timestamp: 1521739327868930 (03/22/2018 17:22:07)
Maximum timestamp: 1521739387131847 (03/22/2018 17:23:07)
-rw-r--r-- 1 cassandra cassandra 1288 Mar 22 17:24 mc-5-big-Data.db
Minimum timestamp: 1521739391318240 (03/22/2018 17:23:11)
Maximum timestamp: 1521739459713561 (03/22/2018 17:24:19)
-rw-r--r-- 1 cassandra cassandra 767 Mar 22 17:25 mc-6-big-Data.db
Minimum timestamp: 1521739461284097 (03/22/2018 17:24:21)
Maximum timestamp: 1521739505132186 (03/22/2018 17:25:05)
-rw-r--r-- 1 cassandra cassandra 1216 Mar 22 17:26 mc-7-big-Data.db
Minimum timestamp: 1521739507504019 (03/22/2018 17:25:07)
Maximum timestamp: 1521739583459167 (03/22/2018 17:26:23)
-rw-r--r-- 1 cassandra cassandra 749 Mar 22 17:27 mc-8-big-Data.db
Minimum timestamp: 1521739587644109 (03/22/2018 17:26:27)
Maximum timestamp: 1521739625351120 (03/22/2018 17:27:05)
-rw-r--r-- 1 cassandra cassandra 1259 Mar 22 17:28 mc-9-big-Data.db
Minimum timestamp: 1521739627983733 (03/22/2018 17:27:07)
Maximum timestamp: 1521739698691870 (03/22/2018 17:28:18)
发出nodetool compact metrics my_test
后:
# for f in *Data.db; do ls -l $f && java -jar /root/sstable-tools-3.11.0-alpha11.jar describe $f | grep timestamp; done
-rw-r--r-- 1 cassandra cassandra 8677 Mar 22 17:30 mc-12-big-Data.db
Minimum timestamp: 1521739189529561 (03/22/2018 17:19:49)
Maximum timestamp: 1521739810545148 (03/22/2018 17:30:10)
很明显,多个时间窗口的SSTables合并在一起,因为压缩后的唯一SSTable覆盖了17:19:49到17:30:10。
我该怎么做才能防止这种情况发生?我有一个用TWCS实现的大型(12节点,~550GB /节点)表,但有多个重叠的SSTable。我想压缩任何墓碑,并合并那些重叠的SSTables;但是,我担心每个节点会留下一个550GB的SSTable。我担心的是单个SSTable,在读取时会很慢......这是一个有效的问题吗?
答案 0 :(得分:0)
不要手动发出nodetool compact
,它会将所有内容明确地合并到一个表中。
TWCS将在时间窗口内成为STCS,直到它完成然后压缩该窗口,1分钟的窗口是疯狂的攻击性,并且可能不会实际工作,因为数据将跨越窗口边界传递。冲刷可以(并且可能)相隔超过1分钟,所以它甚至不会在时间窗口通过sstables意味着几乎所有东西都在窗外。一些重叠的sstables是好的,所以不要太担心它,但你需要一个比1分钟更大的窗口。我要小心不到1天。
特别是对于1周和3个月TTL的分区键,您将拥有成千上万的sstables,这对于流媒体来说是不可维护的。维修将会破裂。