【发布时间】:2015-06-06 04:19:48
【问题描述】:
有没有办法可以控制 SSTable 的最大大小,例如 100 MB,这样当 CF 的数据实际上超过 100MB 时,Cassandra 会创建下一个 SSTable?
【问题讨论】:
有没有办法可以控制 SSTable 的最大大小,例如 100 MB,这样当 CF 的数据实际上超过 100MB 时,Cassandra 会创建下一个 SSTable?
【问题讨论】:
不幸的是,答案并不那么简单,SSTables 的大小将受到压缩策略的影响,并且没有直接的方法来控制最大 sstable 大小。
SSTables 最初是在 memtables 作为 SSTables 刷新到磁盘时创建的。这些表的大小最初取决于您的 memtable 设置和堆的大小(memtable_total_space_in_mb 是一个很大的影响者)。通常这些 SSTable 非常小。 SSTables 被合并到一个名为compaction 的过程中。
如果您使用 Size-Tiered Compaction Strategy,您就有机会拥有非常大的 SSTable。当至少有 min_threshold(默认 4)个相同大小的 sstable 时,STCS 将通过将它们合并到一个文件中、过期数据和合并键来将 SSTable 合并到一个次要压缩中。这有可能在一段时间后创建非常大的 SSTable。
使用分级压缩策略,有一个sstable_size_in_mb 选项可以控制 SSTables 的目标大小。一般来说,SSTables 会小于或等于这个大小,除非您有一个包含大量数据(“宽行”)的分区键。
我还没有对 Date-Tiered Compaction Strategy 进行太多试验,但它的工作原理与 STCS 相似,因为它合并了相同大小的文件,但它按时间顺序将数据保持在一起,并且它具有停止压缩旧的配置数据(max_sstable_age_days)可能很有趣。
关键是找到最适合您的数据的压缩策略,然后围绕最适合您的数据模型/环境的属性调整属性。
您可以阅读有关压缩配置设置的更多信息here 和阅读this guide,以帮助了解 STCS 或 LCS 是否适合您。
【讨论】:
sstable_size_in_mb ?我尝试将它像 sstable_size_in_mb: 40 放在 conf/cassandra.yaml 中,但 cassandra 启动失败并出现错误 org.apache.cassandra.exceptions.ConfigurationException: Invalid yaml。请从您的 cassandra.yaml 中删除属性 [sstable_size_in_mb]