【问题标题】:Why doesn't Major compaction free space but garbagecollect does?为什么 Major compaction 没有释放空间,而garbagecollect 没有?
【发布时间】:2021-08-01 09:52:16
【问题描述】:

我们有一个带有 RF 3 的三节点 Cassandra 集群。有一个具有 SizeTieredCompaction 策略的表。在某些情况下,对此表执行主要压缩nodetool compact --split-output -- <keyspace> <table> 不会释放磁盘,但执行nodetool garbagecollect -- <keyspace> <table> 会释放磁盘。 gc_grace_seconds 设置为 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';

有人知道原因吗?

提前致谢!

【问题讨论】:

    标签: cassandra tombstone


    【解决方案1】:

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

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

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

    关于紧凑状态的文档:

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

    DSE 6.7 nodetool compact

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

    【讨论】:

    • 感谢您的回答。可以预料,garbagecollect 会释放磁盘空间。但我也希望一个主要的压缩将所有 sstable 组合在一起,并且新的 sstable 没有任何额外的数据(基本上压缩的目标是删除墓碑(在 gc 期之后))。实际上为什么主要压缩没有释放磁盘?它与重叠的sstables有关吗?当可以使用 gc 删除某些内容时,它也可以通过主要压缩删除吗?不对吗?
    • 假设您有许多被覆盖的数据行,但磁盘上只有 2 个 sstable,您可以使用garbagecollect 恢复空间,但如果 min_threshold = 4(STCS 的默认值),compact 将不会运行。此外,表格必须“大小相似”才能进行压缩以组合它们。需要记住的一点是,大小累加的压缩不仅仅是为了回收空间,而是为了将表组合成 4 倍大的表。
    • 这不是真的。我测试了一些案例并意识到当您执行主要压缩(nodetool compact)时不需要 4 个 sstables(min_threshold)。此限制仅适用于较小的压实。
    • @MostafaBayat 我查看了代码,你是对的,还有另一个转折点。代码中的 STCS 注释将其解释为:“如果没有 sstable 以标准方式压缩,请尝试压缩单个 sstable,其可删除的墓碑比率大于阈值 [默认 0.2]”。 github.com/apache/cassandra/blob/trunk/src/java/org/apache/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多