首页 > 解决方案 > 为什么 Major compaction 没有释放空间,而garbagecollect 没有?

问题描述

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

‍‍</p>

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';

有谁知道原因?

提前致谢!

标签: cassandratombstone

解决方案


Nodetoolgarbagecollect执行单个 sstable 压缩,因此它可以缩小磁盘上单个文件的大小。Garbagecollect 从 Cassandra 2.10 开始可用,默认情况下会删除已删除的分区和行。如果您指定-g cell它还将删除被覆盖或删除的单元格。

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

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

关于紧凑的文档状态:

...当磁盘上有许多由表子属性 min_threshold 配置的大小相似的 SSTable 时,触发次要压缩。

DSE 6.7 nodetool 紧凑型

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


推荐阅读