合并操作(Major freeze)是将动静态数据做归并,会比较费时。而内存中的增量数据通常比较小,如果不和静态数据做归并,只是将内存中的增量数据存储于磁盘,那么耗时通常会比较小,我们把这个过程称之为转储(Minor freeze 或 dump),类似于 HBase 和 rocksdb 的 minor compaction。转储会大大缓解内存的压力。

    转储发生在 MemTable 的大小满足一定条件时,任何 Partition 副本可以独立决定冻结当前 MemTable,并 dump 到磁盘上。dump 出的 SSStore 只与相同大版本的增量数据做数据归并,不与全局静态数据合并。这样设计是基于增量数据远小于全局数据的考虑,使得转储会比较快。当增量数据积累到一定程度时,通过 Major freeze 实现大版本的合并。

    转储和合并的最大区别在于,合并是所有的 MemTable 一起冻结,并与全局静态数据进行合并的行为,是一个全局的操作,最终形成一个全局快照。

    Minor freeze

    Major freeze

    Partition 级别,只是 MemTable 的物化。

    全局级别,产生一个全局快照。

    每个 Partition 独立决定自己MemTable的冻结操作,主备 Partition 无需保持一致。

    全局Partition一起做MemTable的冻结操作,要求主备Partition保持一致。

    无需写日志。

    主 Partition 写 freeze log 同步给备。

    成员变更不影响转储操作。

    成员变更影响 Major freeze。

    如果主在写 freeze log 前发生切换,需要回滚冻结操作。

    新主上任前,需要补做未完成的冻结操作。

    事务可以跨冻结操作,转储不会阻塞写入。

    事务必须在冻结时结束,全局 Major freeze 冻结期间停写。

    转储合并只与相同大版本的 Minor SSTable 合并,产生新的 Minor SSTable,所以只包含增量数据,最终被删除的行需要特殊标记。

    Major 合并会把当前大版本的 SSTable 和 MemTable 与前一个大版本的全量静态数据进行合并,产生新的全量数据。