合并操作(Major Compaction)是将动静态数据做归并,会比较费时。当转储产生的增量数据积累到一定程度时,通过 Major Compaction 实现大版本的合并。

转储和合并的最大区别在于,合并是集群上所有的分区在一个统一的快照点和全局静态数据进行合并的行为,是一个全局的操作,最终形成一个全局快照。

合并行为

按照合并数据量,合并可以分为:

  • 全量合并:将静态数据全部读出并和动态数据合并为最终的静态数据。合并时间长,耗费 IO 和 CPU。

  • 增量合并:仅仅合并被修改过的宏块,没有改变的宏块进行复用。

  • 渐进合并:每次全量合并一部分,若干轮次后整体数据被重写一遍。

此外,合并也可以对集群的每个 Zone 进行轮转合并,保证没有合并的 Zone 可以完全无任何性能影响地对外提供服务。

合并相关的配置项如下表所示,您可以根据业务需要进行配置。

配置项

说明

enable_merge_by_turn

控制开启轮转合并。

zone_merge_concurrency

控制各个 Zone 的合并并发,取值说明如下:

  • 0:表示系统控制

  • 1:表示每次 1 个 Zone 进行合并

  • 2:表示集群中有 2 个 Zone 在同时进行合并

合并状态

合并的状态可以通过内部表 __all_zone 来查看,该状态可以表示集群的状态和各个 Zone 的状态。状态有以下 4 种:

  • IDLE:表示未进行合并,并且当 last_merged_versionfrozen version 的值一致时,表示合并已完成

  • MERGING:表示正在进行合并

  • TIMEOUT:表示合并超时(但是合并不会暂停,仍然继续,仅设置超时标志)

  • ERROR:表示合并出错(需要高优先级处理)

压缩算法

OceanBase 数据库不会实时将小部分数据刷盘,而是通过合并的方式集中对数据进行刷盘,因此可以采用压缩的方式来写入磁盘,此时磁盘的空间利用率得到提升。压缩算法和功能可以根据实际情况选择高压缩率但是耗费更多 CPU 的方式,也可以选择普通的压缩方式。

可以通过参数 default_compress_func 来配置压缩方式,其默认值为 zstd_1.0。其他可指定的值还有 nonelz4_1.0snappy_1.0zlib_1.0zstd_1.0

说明

更高的压缩率将更节约磁盘空间,但是也意味着性能的牺牲。例如,通常 ZSTD 比 LZ4 节省更多的空间,但是 ZSTD 合并的时间更长,同时需要 IO 查询的 RT 也更大。

如果希望为单独的表选择特别的压缩算法,可以在创建数据表时指定压缩算法。