Cassandra控制SSTable大小

9
有没有办法控制SSTable的最大大小,例如100 MB,这样当CF实际数据超过100MB时,Cassandra会创建下一个SSTable?
1个回答

12
很不幸,答案并不简单,你的SSTable大小会受到压缩策略的影响,并且没有直接的方法来控制最大SSTable大小。
当memtables被刷新到磁盘作为SSTables时,SSTables最初被创建。这些表的大小最初取决于您的memtable设置和堆的大小(memtable_total_space_in_mb是一个重要因素)。通常这些SSTables非常小。SSTables会合并在一起,作为一个称为compaction的过程的一部分。
如果您使用Size-Tiered Compaction Strategy,则有机会拥有非常大的SSTables。当具有至少min_threshold(默认为4)个相同大小的sstables时,STCS将在次要压实中将它们组合成一个文件,过期数据并合并键。这有可能在一段时间后创建非常大的SSTables。
使用层级压缩策略,有一个sstable_size_in_mb选项,用于控制SSTable的目标大小。一般来说,除非您有一个包含大量数据的分区键(“宽行”),否则SSTables的大小将小于或等于此大小。

我还没有对日期分层压缩策略进行过多的实验,但它与STCS类似,它合并相同大小的文件,但它按时间顺序保持数据,并具有配置以停止压缩旧数据(max_sstable_age_days),这可能会很有趣。

关键是找到最适合您的数据的压缩策略,然后根据最适合您的数据模型/环境调整相关属性。

您可以在这里阅读有关压缩的配置设置,并阅读这个指南以帮助了解STCS或LCS是否适合您。


1
还应该补充:在SSTable大小方面存在一个折中点,您也不希望SSTables太小,因为这会导致需要进行大量读取才能获取数据,并且使得行更有可能分散在SSTables之间。您的SSTables应该具有多大的可接受性可能取决于您的环境和要求,因此最好调整和测试哪种方法最适合您。 - Andy Tolbert
谢谢提供信息。我应该在哪里指定sstable_size_in_mb?我尝试将其放置在conf/cassandra.yaml中,例如sstable_size_in_mb: 40,但是Cassandra启动失败并显示以下错误:org.apache.cassandra.exceptions.ConfigurationException: Invalid yaml. Please remove properties [sstable_size_in_mb] from your cassandra.yaml - RRM
4
@RRMadhav,很可能你的表仍在使用SizeTieredCompactionStrategy。该选项仅支持LeveledCompactionStrategy,您可以使用以下CQL命令更改压缩策略:ALTER TABLE tablename WITH compaction = {'class':'LeveledCompactionStrategy','sstable_size_in_mb':40}。我建议使用默认的sstable大小160MB,因为这是cassandra团队发现最理想的大小,而且根据经验,拥有大量微小的SSTable不利于读取性能。 - Andy Tolbert
不,我使用 compaction={'class': 'LeveledCompactionStrategy'} 创建了该表,并且在 desc table 中也显示相同的内容:compaction={'class': 'LeveledCompactionStrategy'}。 - RRM
2
哦,我明白了,sstable_size_in_mb不是放在cassandra.yaml中的,它是你表格配置的一部分。 - Andy Tolbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接