为什么主要压缩不释放空间,但垃圾收集可以?



我们有一个带有RF 3的三节点Cassandra集群。存在一个具有SizeTieredCompaction策略的表。在某些情况下,在此表上执行主压缩nodetool compact --split-output -- <keyspace> <table>不会释放磁盘,但执行nodetool garbagecollect -- <keyspace> <table>会释放磁盘。gc_grace_conds设置为1小时,default_time_to_live设置为3小时:

‍‍

CREATE TABLE keyspace.table (
id text PRIMARY KEY,
json text
) WITH bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 10800
AND gc_grace_seconds = 3600
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99PERCENTILE';

有人知道原因吗?

提前感谢!

Nodetool garbagecollect执行单表压缩,因此可以缩小磁盘上单个文件的大小。Garbagecollect自Cassandra 2.10以来一直可用,默认情况下会删除已删除的分区和行。如果指定-g单元格,它也将删除覆盖或删除的单元格。

Nodetool compact压缩将几个(通常是四个(较小的sstable组合在一起,同时还清理覆盖和过期的数据。大小分层压缩需要min_threshold表进行组合。

压缩还可以查看sstable中可丢弃tombstone数量的估计,如果比率高于tombstone阈值(默认情况下为0.2或20%(,则压缩单个表

关于紧凑状态的文档:

。。。当磁盘上有许多由表子属性min_threshold配置的大小相似的SST表时,会触发一个小的压缩。

DSE 6.7节点工具紧凑型

因此,garbagecollect将始终运行,但如果min_threshold(默认值4(不满足,并且可丢弃的tombstone比率不是很高,compact将忽略表。此外,garbagecollect运行所需的可用磁盘空间较少。

最新更新