全量合并是 OceanBase 的一种合并算法,和 HBase 与 Rocksdb 的 major compaction 过程是类似的。顾名思义,在全量合并过程中,会把当前的静态数据都读取出来,和内存中的动态数据合并后,再写到磁盘上去作为新的静态数据。在这个过程中,会把所有数据都重写一遍。全量合并会极大的耗费磁盘IO和空间,如非必要或者 DBA 强制指定,OceanBase 一般不会主动做全量合并。

    OceanBase 发起的全量合并一般发生在列属性修改、列类型修改、压缩算法修改等 DDL 操作之后。DDL 变更是实时生效的,不阻塞读写,也不会影响到多副本间的 Paxos 同步,将对存储数据的变更延后到合并的时候来做,这时就需要将所有数据重写一遍。

    渐进合并是全量合并的一种实现方式。在一次合并过程中完成对所有数据的重写,对存储空间和合并时间都会是一个比较大的考验。为了解决这个问题,我们引入了渐进合并,即把数据重写分散到多次合并中去做。假设我们把渐进轮次设置为60,那么一次合并就只会重写60分之一的数据,在60轮合并过后,数据就被整体重写了一遍。渐进合并减轻了 DBA 做 DDL 操作的负担,同时也使得 DDL 变更更加平滑。