OceanBase 数据库的分层转储功能是什么?

本文主要介绍 OceanBase 数据库的分层转储功能。

适用版本

OceanBase 数据库 V2.2.30、V2.2.50,OceanBase 数据库 V2.2.60 及后续的版本。

分层转储简介

不使用分层转储时,OceanBase 数据库在同一时刻只会维护一个转储 SSTable,当 MemTable 需要进行转储时,会将 MemTable 中的数据与转储 SSTable 中的数据进行归并。随着转储次数不断增多,转储 SSTable 的大小也越来越大,而一次转储需要操作的数据量也越来越多,导致转储速度越来越慢,进而可能导致 MemTable 内存不足 。

因此 OceanBase 数据库引入了分层转储的结构,在原有的基础上增加了 L0 层。

  • L0 层(Mini SSTable):
  • 被冻结的 MemTable 会直接 flush 为 Mini SSTable。
  • OceanBase 数据库内部可以同时存在多个 Mini SSTable。
  • L0 层内部支持下压,但必须选择 version 值域连续的 SSTable。
  • L1 层(Minor SSTable):
  • 大多数情况下仅有一个 Minor SSTable。
  • 每次下压都会在 L1 层生成新的 Minor SSTable,代替原有的 Minor SSTable。
  • L2 层(Major SSTable):
  • 基线数据,在合并时产生。
  • 一般情况下仅有一个。

分层转储的概念图如下所示。

分层转储相关的配置项

  • minor_compact_trigger

    参数用于控制分层转储触发 Mini SSTable 向 Minor SSTable 下压的阈值,当该层 Mini SSTable 总数达到该参数设定的阈值时,所有 Mini SSTable 都会被下压到下一层,组成新的 Minor SSTable。

  • minor_compact_trigger

    默认为 2,表示 Mini SSTable 数量达到 2 时,会下压到下一层组成新的 Minor SSTable。该参数的取值范围为 0 ~ 16。将

    minor_compact_trigger

    设置为 0 时,OceanBase 数据库仍会进行分层转储,此时 MemTable 仍然 dump 为 Mini SSTable,但后续会立即调度下压合并到 L1 层。

  • __minor_compaction_amplification_factor

    控制 L0 层内部多个Mini SSTable转储的时机,默认为 25。

  • 当所有Mini SSTable的总行数达到 Minor SSTable 的写放大系数比例后,才会触发 L1 层转储,否则触发 L0 层转储。当 L1 层不存在Minor SSTable 时,所有Mini SSTable行数到指定阈值(由 minor_compact_trigger 控制)后才会触发 L1 层转储。

  • major_compact_trigger

    用于控制 L1 层到 L2 层进行转储的时机,当前与 minor_freeze_times 的含义相同,默认为 5。当 MemTable Dump Flush 的次数达到该配置项设置阈值时触发 L2 层转储。

有关以上配置项的详细信息,请参见《OceanBase 数据库 参考指南》中的 系统配置项 章节。

分层转储的代价

  • 对于 LSMT 架构,分层转储意味着更长的链路,在数据扫描时需要扫描 SSTable、Mini SSTable、Minor SSTable 与 SSTable,扫描链路更长,加剧了读放大和空间放大。
  • 数据会存在于多个 Mini SSTable 中,造成数据冗余。