Cassandra SizeTieredCompaction
Cassandra SizeTieredCompaction
Cassandra首先讲数据写入commit log, 然后memtable, 当达到一定条件后,会被flush 到磁盘上,成为SSTable, 当SSTable 达到一定条件后会合并。
-
memtable flush 的条件:
memtable_throughput_in_mb memtable 最大大小。 写满了则会flush.
MemtableOperationsInMillions 是定义当前这个 Memtable 中所持有数据对象的个数,真实的个数是 MemtableOperationsInMillions10241024。当超出这个数值时 Memtable 会被写到磁盘中。
MemtableFlushAfterMinutes 多长时间没有flush, 机会flush 一次。
所以 Memtable 中的数据何时被写到写到磁盘是由这三个值决定,任何一个条件满足都会写到磁盘 -
memtable flush 成SSTable后, 即使满足了compaction 的条件,也未必会立即compaction.
-
对于SizeTieredCompaction 的, 会讲SSTable 的size 划分成到不同的区间,当某个区间的SSTable size 的数量介于 (MinimumCompactionThreshold, MaximumCompactionThreshold] 之间,则符合compaction 条件,讲有可能发生compaction. 如果超过 MaximumCompactionThreshold,一个task 也只会compact 最多MaximumCompactionThreshold 个SSTable.
-
对于同一个column family,可能有多个区间的SSTable数量都大于MinimumCompactionThreshold, cassandra 会优先选择SSTable size 较小的。这样能快速减少SSTable 数量,同时compaction 的也可能是更新的数据。
-
在compaction 之初,cassandra 会先计算空闲空间,如果空间不足, 则会去掉这个sizeTier 的最大的SSTable, 再去尝试。
问题: 如果#5 发生,我们会得到什么样的log, 运维的人员能有机会去添加磁盘呢?
-
CompactionManager 会去检查cf 的状态,提交background task, getTotalBytesCompacted, getCompactionHistory, getPendingTasks 等工作。
-
CompactionTask 包含reduceScopeForLimitedSpace 方法。
logger.warn("insufficient space to compact all requested files " + StringUtils.join(toCompact, ", "));