Cassandra SizeTieredCompaction

Cassandra SizeTieredCompaction

Cassandra首先讲数据写入commit log, 然后memtable, 当达到一定条件后,会被flush 到磁盘上,成为SSTable, 当SSTable 达到一定条件后会合并。

  1. memtable flush 的条件:
    memtable_throughput_in_mb memtable 最大大小。 写满了则会flush.
    MemtableOperationsInMillions 是定义当前这个 Memtable 中所持有数据对象的个数,真实的个数是 MemtableOperationsInMillions10241024。当超出这个数值时 Memtable 会被写到磁盘中。
    MemtableFlushAfterMinutes 多长时间没有flush, 机会flush 一次。
    所以 Memtable 中的数据何时被写到写到磁盘是由这三个值决定,任何一个条件满足都会写到磁盘

  2. memtable flush 成SSTable后, 即使满足了compaction 的条件,也未必会立即compaction.

  3. 对于SizeTieredCompaction 的, 会讲SSTable 的size 划分成到不同的区间,当某个区间的SSTable size 的数量介于 (MinimumCompactionThreshold, MaximumCompactionThreshold] 之间,则符合compaction 条件,讲有可能发生compaction. 如果超过 MaximumCompactionThreshold,一个task 也只会compact 最多MaximumCompactionThreshold 个SSTable.

  4. 对于同一个column family,可能有多个区间的SSTable数量都大于MinimumCompactionThreshold, cassandra 会优先选择SSTable size 较小的。这样能快速减少SSTable 数量,同时compaction 的也可能是更新的数据。

  5. 在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, ", "));

posted @ 2015-01-09 23:51  zhifan  阅读(618)  评论(0编辑  收藏  举报