cassandra - 为什么 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';
有谁知道原因?
提前致谢!
解决方案
Nodetoolgarbagecollect执行单个 sstable 压缩,因此它可以缩小磁盘上单个文件的大小。Garbagecollect 从 Cassandra 2.10 开始可用,默认情况下会删除已删除的分区和行。如果您指定-g cell它还将删除被覆盖或删除的单元格。
Nodetool compact Compaction 将几个(通常是四个)较小的 sstable 组合在一起,同时还清理了覆盖和过期的数据。大小分层压缩需要min_threshold表进行组合。
压缩还可以查看 sstable 中可丢弃 tombstone 的估计数量,如果比率高于tombstone_threshold(默认为 0.2 或 20%) ,则压缩单个表
关于紧凑的文档状态:
...当磁盘上有许多由表子属性 min_threshold 配置的大小相似的 SSTable 时,触发次要压缩。
因此,garbagecollect 将始终运行,但如果 min_threshold(默认为 4)不满足并且可删除的 tombstone 比率不是很高,compact 将忽略一个表。此外,garbagecollect 运行所需的可用磁盘空间更少。
推荐阅读
- angularjs - 为我的电子商务网站添加销售功能?
- sql-server - 通过查询存储随时间跟踪存储过程的性能 - 可能吗?
- python - Selenium 和 Multilogin:如何使用 python 在隐身模式下打开它
- css - 从可拖动的 CSS 区域调整 electron.js 应用程序的大小
- android - 从应用提交 App Store 和 Google Play 评论 - 指南
- python-3.x - 您如何检查当前下载的版本并下载最新版本的 SymPy?
- php - Dompdf laravel 文本重叠
- azure-cosmosdb - Azure Cosmos Graph DB:获取 WebSocket 异常
- oracle-apex - 在 Apex 表单中创建即时验证
- scala - 具有相同根目录的多个 sbt 项目