Cassandra控制SSTable尺寸

RRM*_*RRM 8 cassandra cassandra-2.0

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

And*_*ert 8

不幸的是,答案并非如此简单,您的SSTables的大小将受到您的压缩策略的影响,并且没有直接的方法来控制您的最大sstable大小.

当memtables作为SSTables刷新到磁盘时,最初会创建SSTable.这些表的大小最初取决于您的memtable设置和堆的大小(memtable_total_space_in_mb作为一个大影响者).通常这些SSTables非常小.SSTables作为压缩过程的一部分合并在一起.

如果您使用大小分层压缩策略,您将有机会拥有非常大的SSTable.当至少min_threshold(默认4个)相同大小的sstables通过将它们组合成一个文件,过期数据和合并键时,STCS将SSTables组合成一个小的压缩.这有可能在一段时间后创建非常大的SSTable.

使用Leveled Compaction Strategy可以sstable_size_in_mb选择控制SSTables的目标大小.通常,SSTables将小于或等于此大小,除非您有一个包含大量数据的分区键("宽行").

我还没有尝试使用Date-Tiered Compaction Strategy,但是它与STCS类似,因为它合并了相同大小的文件,但它按时间顺序保存数据,并且它有一个配置来停止压缩旧数据(max_sstable_age_days)这可能很有趣.

关键是要找到最适合您的数据的压缩策略,然后围绕最适合您的数据模型/环境的属性进行调整.

您可以在此处阅读有关压缩的配置设置的更多信息,并阅读本指南以帮助了解STCS或LCS是否适合您.

  • @RRMadhav,很有可能你的表仍在使用SizeTieredCompactionStrategy.只有LeveledCompactionStrategy支持此选项,您可以使用以下CQL命令更改压缩策略:ALTER TABLE tablename WITH compaction = {'class':'LeveledCompactionStrategy','sstable_size_in_mb':40}.我建议使用160MB的默认sstable大小,因为这是cassandra团队发现的最理想和经验的说法,有很多微小的SSTable不利于读取性能. (3认同)
  • 哦,我明白了,sstable_size_in_mb 不会出现在你的 cassandra.yaml 中,它是你的表配置的一部分。 (2认同)