2015-04-01 193 views
6

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

回答

6

不幸的是,答案并不那么简单,您的SSTables的大小将受到您的压实策略的影响,并且没有直接的方法来控制您的最大sstable大小。

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

如果你使用尺寸分层压实策略,你有机会拥有非常大的SSTables。当至少有min_threshold(默认4个)大小相同的sstables组合成一个文件,使数据失效并合并密钥时,STCS会将SSTables组合成小型压缩。这有可能在一段时间后创建非常大的SSTables。

使用整平压实策略有一个sstable_size_in_mb选项,该选项控制SSTables的目标大小。一般情况下,SSTables将小于或等于此大小,除非您拥有包含大量数据的分区键('宽行')。

我还没有用Date-Tiered Compaction策略做过很多实验,但是它的工作原理类似于STCS,因为它合并了大小相同的文件,但它按时间顺序将数据保存在一起,并且具有停止压缩的配置旧数据(max_sstable_age_days)这可能很有趣。

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

您可以阅读关于压缩here的配置设置的更多信息,并阅读this guide以帮助您了解STCS或LCS是否适合您。

+0

还应该补充一点:在SSTable大小方面有一个令人满意的介质,你不希望你的SSTables太小,因为它会创建大量的读取数据,因为它使得它更容易行在SSTables之间传播。您的sstable应该多大程度上取决于您的环境和您的要求,因此调整和测试最适合您的最佳方案可能会很好。 – 2015-04-01 13:58:46

+0

感谢您的信息。我在哪里指定'sstable_size_in_mb'?我试图把它放在conf/cassandra.yaml中的'sstable_size_in_mb:40',但cassandra启动失败,出现错误 org.apache.cassandra.exceptions.ConfigurationException:无效的yaml。请从您的cassandra.yaml – RRM 2015-04-01 14:17:47

+1

@RMadhav中移除属性[sstable_size_in_mb],很可能您的表仍在使用SizeTieredCompactionStrategy。此选项仅受LeveledCompactionStrategy支持,您可以使用以下CQL命令更改压缩策略:ALTER TABLE tablename WITH compaction = {'class':'LeveledCompactionStrategy','sstable_size_in_mb':40}。我建议使用160MB的默认sstable大小,因为这是cassandra团队发现的最理想和经验丰富的发言,拥有许多微小的SSTables不利于读取性能。 – 2015-04-01 14:20:32